null

Настройка IPv6 в linux

Изначально планировалась статья на тему именно внедрения IPv6 в сети. Но так получилось, что начну я с совершенно обратной проблемы. А точнее с того, почему отсутствие каких либо настроек IPv6 для Вашего linux узла может быть вредным, и, если Вы не предполагаете использование IPv6, то лучше запретить IPv6 целиком и полностью.

По текущему состоянию дел все современные дистрибутивы linux являются готовыми к внедрению IPv6. Готовы на столько, что предполагается, что от администратора ничего и не требуется  для того, чтобы IPv6 заработал на его linux узле.

Начнём с простой ситуации - у Вас есть linux узел, который смотрит в некоторый broadcast сегмент, где бегает старый добрый IPv4. Казалось бы, как тут может помешать отсутствие каких либо настроек IPv6 для интерфейса? Ведь угадать link local адрес, который автоматически назначился на интерфейс невозможно - там ведь целых 64 бита, т.е. 264 вариантов. Только вот Ваш узел использует IPv4, а значит его пакеты можно перехватить и узнать MAC адрес Вашего узла. Дальше берём EUI-64, который используется всеми известными мне linux дистрибутивами,  и получаем IPv6 link local адрес Вашего узла. И что, скажите Вы, "у меня же там есть firewall, который запретит все ненужные входящие подключения".  Да, но есть одно но.

Кто помешает злодею запустить radvd(8) и анонсировать доступность какого либо префикса, например, из диапозона Unique Local Address? После чего, в связи с использованием настроек IPv6 по умолчанию, Ваш узел получит этот префикс, добавит к нему уже известный нам идентификатор интерфейса, и в выводе ifconfig(8) Вы получите примерно следующее:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::5054:ff:fecf:b25d  prefixlen 64  scopeid 0x20<link>
        inet6 fd13:dead:beef:0:5054:ff:fecf:b25d  prefixlen 64  scopeid 0x0<global>
        ether 52:54:00:cf:b2:5d  txqueuelen 1000  (Ethernet)
        RX packets 16174619  bytes 12897398075 (12.0 GiB)
        RX errors 0  dropped 22  overruns 0  frame 0
        TX packets 264  bytes 18868 (18.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

При этом Ваш узел пошлёт DAD (duplicate address detection) пакет, перехватив который злодей сможет узнать адрес Вашего узла даже не занимаясь анализом IPv4 пакетов - linux сам во всём сознается.

Но и этого мало. Получив Router Advertisement, linux узел добавит в свою таблицу маршрутизации марштут по умолчанию для IPv6:

[::]/0                         fe80::5054:ff:feb5:5748    UGDAe 1024 1     0 eth0
[::]/0                         fe80::5054:ff:fed3:ef48    UGDAe 1024 1     0 eth0

Таким образом, злодей становится еще и маршрутизатором по умолчанию для Вашего linux узла. А, так как в linux по умолчанию установлен приоритет использования IPv6, при получении правильного GUA префикса практически все штатные утилиты будут пытаться попасть в сеть сеть через IPv6, т.е. через узел злодея. И, в зависимости от того, на сколько защищённые протоколы при этом используются Вами, злодей может или полностью контролировать передаваемые данные, или блокировать часть функционала Вашего узла, такую как установка пакетов и обновлений.

Самым простым способом избежать этого, особенно если интерфейсов на узле много, является полный запрет IPv6 на узле. Для этого в файл /etc/sysctl.d/ipv6.conf записываем строку:

net.ipv6.conf.all.disable_ipv6=1

И выполняем или команду:

systemctl restart systemd-sysctl

или команду:

sysctl net.ipv6.conf.all.disable_ipv6=1

Это уже в зависимости от Вашей религии.

Следует отдельно отметить, что описанное относится практически к любым linux узлам. Но особенно важно об этом помнить, если Вы настраиваете некоторый гипервизор. Вполне ожидаемо IP интерфейсы гипервизора вынесены в специальную сеть управления и/или сеть хранения, и, предполагается, что узел является изолированным от общей сети, но, в соответствии со своей задачей, имеет bridge интерфейсы. И если Вы случайно ли, осознанно ли опустили насройки IPv6 для этих bridge интефейсов, то фактически даёте возможность злодею, управляющему виртуальной машиной на гипервизоре, получить IPv6 доступ к самому гипервизору.

Также отмечу, что в своей практике, я сталкивался с ситуацией, когда linux узел, не имеющий IPv6 доступа в сеть, по какой-то причине переставал пытаться использовать IPv4 адреса для узлов, у которых в DNS есть и A и AAAA записи, и попытка отправить пакет заканчивалась сообщением no route to host. В этом случае полный запрет IPv6 также решает проблему.

Коротко о себе:

Работаю в компании Tune-IT и тьютором кафедры Вычислительной техники в СПбГУИТМО.

Очень люблю команду cat, core solaris и IPv6.