Slaac ipv6 что это
IPv6 SLAAC Attack
Прочитал недавно статью «IPv6 под прицелом» и решил написать более подробно об атаке SLAAC (SLAAC Attack), т.к. эту атаку я уже давно в голове держу, развернутого материала на русском не нашел, да и самому интересно ее было повторить.
Суть атаки
В чем суть атаки? Во-первых, она очень простая и надежная, т.к. использует стандартные технологии и инструменты ОС. По сути, вы просто становитесь единственным IPv6-маршрутизатором в сети и раздаете клиентам IPv6-подсеть, из которой клиенты берут себе адреса либо автоматически генерируя их (SLAAC), либо спрашивая у вашего же DHCPv6-сервера. Напомню, что IPv6 включен по умолчанию во всех современных десктопных, мобильных и серверных ОС, имеет приоритет над IPv4 (кроме некоторых случаев), адрес IPv6, в отличие от IPv4, может быть получен в любой момент, а не только в момент совершения подключения, и крупные веб-сайты уже давно доступны через IPv6. Атака работает как в проводных сетях, так и в беспроводных. Не все свитчи, даже современные, поддерживают фильтрацию Router Advertisement, и, как я полагаю, не все включают эту функцию, даже если она поддерживается свитчем, полагая, что раз в сети нет IPv6, то и фильтровать ничего не нужно. К слову, на данный момент, фильтр Router Advertisement можно обойти на всех свитчах, использовав недостатки реализации.
Я смог придумать две реализации атаки:
Реализация №1
С помощью этого способа, вы сможете перехватывать только реальный IPv6-трафик к хостам, которые имеют AAAA-запись. Вам понадобится IPv6-подсеть длиной /64 и какой-либо софт для Router Advertisement, я использовал dnsmasq. IPv6-подсеть 6to4 не подойдет, т.к. все 6to4-адреса имеют приоритет ниже, чем IPv4, так что нужно использовать туннельный брокер. Клиентам будем раздавать только сам диапазон адресов, без DNS, и не используя DHCPv6.
Демон dnsmasq умеет брать подсеть прямо с интерфейса, для этого достаточно указать в конфигурационном файле следующую строку:
Где wlp3s0 — сетевой интерфейс, в моем случае, беспроводной. Устанавливаем глобально маршрутизируемую подсеть 2001:470::/64 на интерфейс, запускаем dnsmasq, смотрим в wireshark:
Все компьютеры в сети сразу же назначили себе IPv6-адрес и установили маршрут по умолчанию:
Не забудьте включить маршрутизацию!
Недостаток этой реализации в том, что через ваш маршрутизатор пойдет только IPv6-трафик. Опять же, вероятнее всего, IPv4-адрес вашего компьютера будет за NAT, а значит получить IPv6-подсеть может быть не так-то просто, т.к. самый популярный протокол туннелирования — SIT — не работает за NAT. Нужно использовать либо туннелирование по протоколу AYIYA, который поддерживается у меньшинства туннельных брокеров, либо придумывать свои схемы проброса. Атака может быть замечена, если атакуемый использует какой-либо сайт с привязкой по IP. Зато, эта атака технически очень простая и применить ее можно буквально за минуту.
Реализация №2
Что же делать, если у необходимого нам хоста нет IPv6-адреса, а нам так хочется совершить незаметную MITM-атаку? Есть замечательный выход из этой ситуации — NAT64+DNS64. NAT64 позволяет вам сделать отображение всего диапазона IPv4 в /96-диапазон адресов IPv6, а DNS64 сможет отдавать такие адреса клиентам.
Под Linux существует три NAT64-демона: TAYGA (userspace) и Ecdysis (kernelspace), Jool (kernelspace), а поддержка DNS64 есть в Bind9, Unbound и специальном демоне totd, который заброшен, но все еще компилируется и работает.
Первым делом, мы должны выбрать какие-то 2 подсети, которые будем раздавать нашим клиентам. Первая подсеть нужна для отображения адресов, а вторая для маршрутизации. Я решил использовать 2001:db8:1:ffff::/96 (из диапазона «для документации») в качестве первой подсети, а в качестве второй — fde4:8dba:82e1:ffff::/64 (IPv6 ULA, аналог внутрисетевых диапазонов в IPv4).
Перенастраиваем dnsmasq:
Указываем наши настройки в TAYGA:
И в totd:
И запускаем все демоны. В итоге, получается как-то так:
Весь трафик, отправленный на диапазон 2001:db8:1:ffff::/96, фактически пойдет через IPv4.
К сожалению, DNS устанавливается только при подключении, т.к. Router Advertisement принимает ядро, а для получения DNS нужен DHCPv6, чем ядро уже не занимается. Аналогичное поведение наблюдается в Windows 7 (другие версии не пробовал).
Автоконфигурация в IPv6
В IPv6 появился новый механизм автоконфигурации узла. Называется он Stateless Address Autoconfiguration или SLAAC. Используется он для автоматического получения IP адреса и сетевого префикса узлом, без использования DHCPv6 сервера, или совместно с ним.
Действительно, когда мы создаём некоторую сеть, мы прописываем адрес шлюза и префикс этой сети на маршрутизаторе. Этой информации достаточно, чтобы выдавать адреса устройствам. Механизм SLAAC позволяет маршрутизатору назначать устройствам адреса даже если в сети нет DHCPv6.
Маршрутизатор Cisco с рабочим IPv6 интерфейсом рассылает в сеть информацию об этой сети, включающую в себя сетевую часть IP адреса и длину префикса. Кроме того, в этом сообщении содержится адрес шлюза по умолчанию для сети. Подробнее о структуре IPv6 адреса можно прочитать здесь. Сообщение это называется Router Advertisement (RA) и отправляется обычно раз в 200 секунд на мультикастовый адрес FF02::1 (подробнее об этом адресе можно прочитать в статье про мультикаст в IPv6).
Если в сети появилось новое устройство, которому необходим адрес, ему необязательно ждать 200 секунд до ближайшей рассылки, оно может направит запрос маршрутизатору (Router Solicitation или RS) и попросить его выслать настройки немедленно. Запрос маршрутизатору выполняется на адрес FF02::2.
Оба сообщения RA и RS отправляются посредством протокола ICMPv6, с мультикастовым адресом получателя в IP пакете.
Для того чтобы маршрутизатор начал полноценно обслуживать сеть (рассылать в неё RA и отвечать на RS), мало настроить IPv6 адрес на интерфейсе, необходимо так же включить режим маршрутизации для IPv6 сетей, введя команду ipv6 unicast routing в режиме глобальной конфигурации.
Существует три способа назначения адреса:
В случае использования третьего варианта, DHCP сервер выдаёт клиенту полный IPv6 адрес – все 128 бит, который назначается на интерфейсе клиента. В случае использования первых двух вариантов, маршрутизатор сообщает клиенту только сеть, в которой он находится, шлюз и префикс. Таким образом, клиенту недостаёт второй половины IP адреса (идентификатора интерфейса). Напомню, что адрес состоит из 128 бит, а маршрутизатор выдаёт максимум, только первые 64. Оставшиеся 64 бита, где должна находиться информация о хосте, должны быть заполнены самим устройством, маршрутизатору не важно, что именно устройство туда поместит, важно, чтобы первые 64 бита (сеть) были правильными. Для генерации правой половины IP адреса используется алгоритм EUI-64 или вообще генерируется случайный набор цифр.
Slaac ipv6 что это
SLAAC — это способ, который позволяет устройству получить свой префикс, длину префикса и адрес шлюза по умолчанию от маршрутизатора IPv6 без помощи DHCPv6-сервера. При использовании SLAAC для получения необходимой информации устройства полагаются на сообщения «Объявления маршрутизатора ICMPv6».
IPv6-маршрутизаторы периодически отправляют сообщения «Объявления маршрутизатора ICMPv6» всем устройствам в сети под управлением IPv6. По умолчанию маршрутизаторы Cisco отправляют такие сообщения каждые 200 секунд на адрес групповой передачи всем IPv6-узлам. IPv6-устройству, находящемуся в сети, не нужно ждать этих периодических сообщений. Устройство может отправить сообщение «Запрос маршрутизатора ICMPv6», который использует адрес групповой передачи всем IPv6-узлам. Когда маршрутизатор IPv6 получает такое сообщение, он сразу же отправляет в ответ объявление маршрутизатора.
IPv6-маршрутизация не включена по умолчанию. Чтобы маршрутизатор работал как IPv6-маршрутизатор, необходимо использовать команду глобальной конфигурации ipv6 unicast-routing.
Сообщение «Объявления маршрутизатора ICMPv6» содержит префикс, длину префикса и другие сведения IPv6-устройства. Кроме того, такое сообщение указывает IPv6-устройству, как ему получить информацию по адресации. Сообщение «Объявления маршрутизатора» может выглядеть в одном из следующих 3 вариантов.
Вариант 1 (только SLACC): «Я предоставляю все необходимые вам данные (префикс, длину префикса и шлюз по умолчанию)».
Вариант 2 (SLACC и DHCPv6): «Вот моя информация, но вам понадобятся и другие данные, например, об DNS-адресах с сервера DHCPv6».
Вариант 3 (только DHCPv6): «Я не могу вам помочь. Запросите необходимую информацию у сервера DHCPv6».
Общие сведения о SLAAC
Автоматическая настройка адреса без отслеживания состояния (SLAAC) — это способ получения устройством глобального IPv6-адреса одноадресной рассылки без использования DHCPv6-сервера. В основе SLAAC лежит протокол ICMPv6. Протокол ICMPv6 аналогичен ICMPv4, но при этом он имеет дополнительные функциональные возможности и демонстрирует большую устойчивость к ошибкам. SLAAC использует ICMPv6-сообщения запроса маршрутизатора и объявления маршрутизатора, чтобы предоставить информацию об адресации и другую информацию о конфигурации, обычно предоставляемую DHCP-сервером.
Как видно из термина, SLAAC не отслеживает состояние адреса. Служба без отслеживания состояния говорит о том, что ни один из серверов не поддерживает информацию о сетевом адресе. В отличие от сервера DHCP, сервер SLAAC не знает, какие IPv6-адреса используются, а какие доступны.
На рисунке 3 показан принцип работы SLACC + DHCPV6 без отслеживание состояния.
Рис.3. SLACC + DHCPV6 без отслеживание состояния
Для отправки маршрутизатором сообщений RA, на нём предварительно необходимо настроить работу IPv6-маршрутизации. Для активации IPv6-маршрутизации необходимо выполнить следующие команды:
Существует способ создания PC1 собственного уникального IID:
EUI-64, генерация случайным образом.
Поскольку SLAAC — это процесс без отслеживания состояния, перед использованием PC1 этого вновь созданного IPv6-адреса, необходимо проверить его уникальность., PC1 посылает по протоколу ICMPv6 сообщение запроса поиска соседа с собственным адресом в качестве IPv6-адреса назначения. Если другие устройства не отвечают сообщением запроса поиска соседа, значит, адрес является уникальным и может быть использован PC1. Если сообщение запроса поиска соседей получено PC1, значит, адрес не уникален и операционная система должна установить новый идентификатор интерфейса для использования.
Этот процесс является частью процесса обнаружения соседних устройств ICMPv6 и известен как обнаружение адресов-дубликатов (DAD).
Настроен ли клиент на автоматическое получение информации об IPv6-адресации с использованием SLAAC, DHCPv6 или сочетанием обоих вариантов, зависит от настроек, содержащихся в сообщении RA. ICMPv6 сообщения RA содержат два флага, обозначающих, какой из вариантов должен быть использован клиентом.
Этими флагами являются флаг управляемой конфигурации адресов (M) и флаг другой конфигурации (O).
Рис.3.1. Варианты сообщений от RA
Функции SLAAC,DHCPV6+SLAAC,DHCPV6
Рассмотрим все три способа, изменение флагов.
1. SLAAC — Этот вариант указывает клиенту использовать только информацию из сообщения RA. Сюда входит информация о префиксе, длине префикса, DNS-сервере, MTU и информация о шлюзе по умолчанию. Далее клиент не получает никакой информации от сервера DHCPv6. Глобальный индивидуальный IPv6-адрес создаётся путём объединения префикса, полученного в сообщении RA, и идентификатора интерфейса, полученного с помощью EUI-64 или сгенерированного случайным образом.
Сообщения RA настроены на отдельном интерфейсе маршрутизатора. Для повторной активации режима SLAAC на интерфейсе, на котором мог быть установлен другой вариант работы, флаги M и O необходимо сбросить на их первоначальные значения, равные 0. Для этого применяются следующие команды режима конфигурации интерфейса:
2. DHCPV6+SLAAC — Для DHCPv6 без отслеживания состояния значение флага O установлено равным 1, а значение флага M остается со значением по умолчанию, равным 0. Значение флага O, равное 1, используется для информирования клиента о том, что на DHCPv6-сервере без отслеживания состояния доступна дополнительная информация о конфигурации.
Для того чтобы изменить сообщение RA, отправляемое на интерфейс маршрутизатора для указания использования DHCPv6 без отслеживания состояния, используйте следующие команды:
3. Протокол DHCPv6 с отслеживанием состояния (только DHCPv6)
Флаг M указывает, используется ли DHCPv6 с отслеживанием состояния. Флаг O не используется. Для того чтобы изменить значение флага М с 0 на 1 для объявления DHCPv6 с отслеживанием состояния, применяются следующие команды:
Рис.3.4. Протокол DHCPv6 с отслеживанием состояния
Процессы DHCPV6
В случае если в сообщении RA указан вариант работы DHCPv6 (с отслеживанием состояния или без), инициируется работа DHCPv6. Сообщения протокола DHCPv6 посылаются через протокол UDP. Сообщения DHCPv6 от сервера к клиенту используют UDP порт назначения 546. Клиент отправляет сообщения на сервер DHCPv6 через UDP порт назначения 547.
Клиенту — теперь DHCPv6-клиенту — необходимо определить местоположение сервера DHCPv6. клиент передаёт сообщение DHCPv6 SOLICIT на зарезервированный IPv6-адрес многоадресной рассылки FF02::1:2, используемый всеми DHCPv6 серверами. Этот адрес многоадресной рассылки действует в рамках канала link-local, это означает, что маршрутизаторы не направляют сообщения в другие сети.
Один или несколько серверов DHCPv6 отвечают DHCPv6-сообщением ADVERTISE. Сообщение ADVERTISE сообщает DHCPv6-клиенту, что сервер доступен для предоставления службы DHCPv6.
Клиент отвечает серверу DHCPv6 сообщением REQUEST или INFORMATION-REQUEST, в зависимости от того, является ли DHCPv6-сервер сервером с отслеживанием состояния или без него.
Сетевые IPv6-адреса
Индивидуальные IPv6-адреса
Автоконфигурация без сохранения состояния адреса (SLAAC)
SLAAC — это способ, который позволяет устройству получить свой префикс, длину префикса и адрес шлюза по умолчанию от маршрутизатора IPv6 без помощи DHCPv6-сервера. При использовании SLAAC для получения необходимой информации устройства полагаются на сообщения «Объявления маршрутизатора ICMPv6».
IPv6-маршрутизаторы периодически отправляют сообщения «Объявления маршрутизатора ICMPv6» всем устройствам в сети под управлением IPv6. По умолчанию маршрутизаторы Cisco отправляют такие сообщения каждые 200 секунд на адрес групповой передачи всем IPv6-узлам. IPv6-устройству, находящемуся в сети, не нужно ждать этих периодических сообщений. Устройство может отправить сообщение «Запрос маршрутизатора ICMPv6», который использует адрес групповой передачи всем IPv6-узлам. Когда маршрутизатор IPv6 получает такое сообщение, он сразу же отправляет в ответ объявление маршрутизатора.
Несмотря на то, что интерфейс маршрутизатора Cisco можно настроить с IPv6-адресом, это не превращает его в «IPv6-маршрутизатор». IPv6-маршрутизатор обладает следующими характеристиками.
Примечание. Маршрутизаторы Cisco по умолчанию работают как IPv4-маршрутизаторы.
Сообщение «Объявления маршрутизатора ICMPv6» содержит префикс, длину префикса и другие сведения IPv6-устройства. Кроме того, такое сообщение указывает IPv6-устройству, как ему получить информацию по адресации. Как показано на рисунке, сообщение «Объявления маршрутизатора» может выглядеть в одном из следующих 3 вариантов.
Маршрутизаторы отправляют сообщения «Объявления маршрутизатора ICMPv6», используя локальный адрес канала в качестве IPv6-адреса источника. Устройства, использующие SLAAC, применяют локальные адреса маршрутизатора в качестве адреса шлюза по умолчанию.
IPv6 (Русский)
В Arch Linux протокол IPv6 включён по умолчанию.
Статья Linux IPv6 HOWTO, хоть и давно не обновлялась, содержит подробную информацию об IPv6, от основ до более сложных тем. Если вы слабо знакомы с данным протоколом, то стоит сначала прочесть её.
Contents
Обнаружение соседей
Пинг по адресу многоадресной рассылки ff02::1 заставит все хосты в локальной сети ответить. При этом нужно указать сетевой интерфейс:
После этого список «соседей» по локальной сети можно вывести командой
Автоконфигурация узла (SLAAC)
Простейший способ получения IPv6-адреса в уже настроенной сети — автоконфигурация узла (SLAAC, Stateless address autoconfiguration). При этом адрес автоматически вычисляется на основании объявленного маршрутизатором префикса сети. Никакие дальнейшие настройки или использование специализированного ПО вроде DHCP-клиента не требуются.
Клиент
Если вы используете netctl, то нужно только добавить одну строку в файл настроек вашей проводной или беспроводной сети.
Если вы используете NetworkManager, то он автоматически включит использование IPv6-адресов, если таковые объявлены в сети.
Нужно также заметить, что для нормальной работы автоконфигурации должны быть разрешены пакеты ICMP для IPv6. Поэтому необходимо добавить разрешения для пакетов ipv6-icmp в настройки межсетевого экрана. Если вы используете брандмауэр на основе iptables, то добавьте следующее правило:
Если вы используете другой интерфейс межсетевого экрана (ufw, shorewall и т.д.), то инструкции по разрешению пакетов ipv6-icmp нужно искать в документации.
Шлюз должен также разрешать трафик ipv6-icmp во всех основных цепочках межсетевого экрана. Для брэндмауэра/iptables добавьте правила:
Privacy Extensions
Когда устройство-клиент получает адрес посредством SLAAC, его IPv6-адрес вычисляется на основании префикса сети и MAC-адреса сетевого интерфейса. Это может иметь определённые последствия с точки зрения безопасности, поскольку MAC-адрес компьютера теперь можно узнать по IPv6-адресу. Для решения этой проблемы был разработан стандарт IPv6 Privacy Extensions (RFC 4941). В соответствии с ним ядро видоизменяет исходный адрес, генерируя вместо него временный. Такой подход используется, когда необходимо скрыть настоящий адрес при подключении к удалённому серверу.
Чтобы включить Privacy Extensions, добавьте в файл /etc/sysctl.d/40-ipv6.conf следующие строки:
После перезагрузки Privacy Extensions будут включены.
dhcpcd
NetworkManager
Чтобы включить IPv6 Privacy Extensions явно, добавьте следующие строки в файл NetworkManager.conf(5) :
Примените настройки и переподключитесь ко всем активным соединениям.
Перезагрузите соединение и подключитесь к нему снова.
systemd-networkd
Тем не менее, учитываются некоторые другие опции:
connman
Добавьте следующую строку в файл службы (например, /var/lib/connman/название_службы/settings ):
Постоянный приватный адрес
Другой полезной возможностью являются описанные в RFC 7217 постоянные приватные IP-адреса (stable private addresses). Эта технология позволяет назначать интерфейсам постоянные адреса, для вычисления которых вместо MAC-адреса устройства используется специально сгенерированный ключ.
Чтобы заставить ядро сгенерировать ключ (например, для интерфейса wlan0 ), необходимо задать параметр ядра:
NetworkManager
Описанные выше настройки не работают для NetworkManager, но он использует постоянные приватные адреса по умолчанию [1],[2].
Статический адрес
Иногда использование статического адреса может быть применено в качестве одной из мер обеспечения безопасности. Например, если ваш локальный маршрутизатор использует обнаружение соседей (Neighbor Discovery) или radvd (RFC 2461), вашему интерфейсу будет автоматически присвоен адрес, который содержит часть MAC-адреса сетевого интерфейса (используя SLAAC). Это может быть не слишком хорошо для безопасности, так как позволяет без труда отслеживать систему даже если часть IPv6-адреса сменилась.
IPv6 и PPPoE
Если вы используете netctl для PPPoE, тогда вместо этого добавьте следующую строку в файл настроек netctl:
Делегирование префикса (DHCPv6-PD)
Делегирование префикса (prefix delegation) — широко распространённая технология развёртывания IPv6, используемая многими интернет-провайдерами. Представляет собой метод назначения сетевого префикса пользователю (например, локальной сети). Маршрутизатор может быть настроен на привязку разных сетевых префиксов к различным подсетям. Провайдер выдаёт префикс с помощью DHCPv6 (обычно это префикс /56 или /64 ), а dhcp-клиент назначает префикс локальной сети. В случае простого шлюза с двумя интерфейсами клиент обычно получает адрес через WAN-интерфейс (или псевдоинтерфейс вроде ppp) и на его основании присваивает IPv6-префикс интерфейсу, обращённому к локальной сети.
Клиент DHCPv6 принимает входящие соединения на UDP-порт 546. Чтобы настроить доступ к этому порту в межсетевом экране nftables, в файле /etc/nftables.conf добавьте следующее правило в цепочку input:
dhcpcd
WIDE-DHCPv6
systemd-networkd
Настройте внешний (wan) и внутренний (lan) интерфейсы. Это включит DHCPv6-PD для интерфейса с запущенным DHCPv6-клиентом. Делегированные префиксы предоставляются посредством IPv6 Router Advertisement во внутренней (локальной) сети.
Другие клиенты
dhclient также может запрашивать сетевой префикс, но для присваивания этого префикса или его части нужно использовать специальный скрипт. Пример программы: https://github.com/jaymzh/v6-gw-scripts/blob/master/dhclient-ipv6.
Отключение IPv6
Отключение функциональности
Параметр ядра ipv6.disable=1 отключает весь стек IPv6, что в большинстве случаев помогает добиться желаемого результата. О параметрах ядра см. Kernel parameters.
Также вы можете отключить присвоение адреса IPv6 конкретным сетевым интерфейсам, добавив следующие строки в файл настроек sysctl /etc/sysctl.d/40-ipv6.conf :
Необходимо перечислить здесь все сетевые интерфейсы, для которых требуется отключение IPv6, так как опция all.disable_ipv6 не будет применена к сетевым интерфейсам, которые уже включены на момент выполнения инструкций из файла настроек.
Другие программы
Отключение IPv6 в ядре не предотвращает другие программы от попытки использования версии IPv6. В большинстве случаев это не приводит к проблемам, однако, если они все-таки появляются, вам остается лишь искать в man-страницах или на просторах сети способ отключить эту функциональность.
dhcpcd
Например, dhcpcd будет продолжать пытаться запрашивать настройки сети у маршрутизаторов IPv6 (т.н. Router solicitation). Чтобы отключить это, добавьте следующие строки в файл /etc/dhcpcd.conf :
NetworkManager
Чтобы отключить IPv6 в NetworkManager, вызовите контекстное меню значка статуса сети и перейдите в Edit Connections > Wired > Network name > Edit > IPv6 Settings > Method, затем выберите Method как Ignore/Disabled.
GnuPG
Отключите IPv6 в настройка dirmngr:
systemd-timesyncd
Иногда systemd-timesyncd пытается отправлять запросы IPv6-серверу времени, даже если IPv6 отключён. Это может привести к тому, что системные часы не будут обновляться, а в журнале появятся сообщения об ошибках следующего вида:
Команда systemctl status systemd-timesyncd в пункте «Status» выведет IPv6-адрес целевого сервера:
Как видно из FS#59806, по протоколу IPv6 работают «2.»-сервера ntp.org. Чтобы запретить подключение к ним, удалите в файле /etc/systemd/timesyncd.conf записи 2.arch.pool.ntp.org и 2.pool.ntp.org из параметров NTP and FallbackNTP соответственно.
systemd-networkd
Использование IPv4 вместо IPv6
The factual accuracy of this article or section is disputed.