Как настроить ipv6 linux

Обновлено: 07.07.2024

В Arch Linux протокол IPv6 включён по умолчанию.

Статья Linux IPv6 HOWTO, хоть и давно не обновлялась, содержит подробную информацию об IPv6, от основ до более сложных тем. Если вы слабо знакомы с данным протоколом, то стоит сначала прочесть её.

Contents

Обнаружение соседей

Пинг по адресу многоадресной рассылки ff02::1 заставит все хосты в локальной сети ответить. При этом нужно указать сетевой интерфейс:

После этого список "соседей" по локальной сети можно вывести командой

Аналогично, если сделать пинг по адресу ff02::2 , то ответят только маршрутизаторы локальной сети.

Если добавить опцию -I ваш-глобальный-ipv6 в пинг-запрос, хосты локальной сети ответят с использованием глобальных адресов. В этом случае сетевой интерфейс можно не указывать:

Автоконфигурация узла (SLAAC)

Простейший способ получения IPv6-адреса в уже настроенной сети — автоконфигурация узла (SLAAC, Stateless address autoconfiguration). При этом адрес автоматически вычисляется на основании объявленного маршрутизатором префикса сети. Никакие дальнейшие настройки или использование специализированного ПО вроде DHCP-клиента не требуются.

Клиент

Если вы используете netctl, то нужно только добавить одну строку в файл настроек вашей проводной или беспроводной сети.

Если вы используете NetworkManager, то он автоматически включит использование IPv6-адресов, если таковые объявлены в сети.

Нужно также заметить, что для нормальной работы автоконфигурации должны быть разрешены пакеты ICMP для IPv6. Поэтому необходимо добавить разрешения для пакетов ipv6-icmp в настройки межсетевого экрана. Если вы используете брандмауэр на основе iptables, то добавьте следующее правило:

Если вы используете другой интерфейс межсетевого экрана (ufw, shorewall и т.д.), то инструкции по разрешению пакетов ipv6-icmp нужно искать в документации.

Если вы выбрали сетевой менеджер, который не поддерживает разрешение DNS с бесконтекстным (stateless) IPv6 (например, netctl), то для этох целей можно воспользоваться демоном rdnssd(8) из пакета ndisc6 .

Чтобы соответствующим образом работать с адресами IPv6 клиентских устройств вашей сети, нужно настроить демон объявлений (advertisement daemon). Для этой задачи используется входящий в официальные репозитории пакет radvd . Настройка radvd довольно проста. Добавьте следующие строки в файл /etc/radvd.conf , заменив LAN на название вашего сетевого интерфейса:

Такая настройка скажет клиентам выбрать адреса из объявленного блока /64 . Обратите внимание, что эта настройка объявляет все доступные префиксы, привязанные к сетевому интерфейсу. Если вы хотите указать конкретные префиксы, то замените ::/64 на необходимый, например, 2001:DB8::/64 . Блок настроек prefix нужно повторить для каждого указанного префикса.

Чтобы объявить DNS-сервера клиентам вашей локальной сети, можно использовать предлагаемую протоколом обнаружения соседей функциональность RDNSS. Например, добавьте следующие строки к файлу /etc/radvd.conf , чтобы объявить DNSv6-сервер Google:

Шлюз должен также разрешать трафик ipv6-icmp во всех основных цепочках межсетевого экрана. Для брэндмауэра/iptables добавьте правила:

Для других интерфейсов межсетевого экрана выполните аналогичные настройки и в конце не забудьте включить radvd.service .

Privacy Extensions

Когда устройство-клиент получает адрес посредством SLAAC, его IPv6-адрес вычисляется на основании префикса сети и MAC-адреса сетевого интерфейса. Это может иметь определённые последствия с точки зрения безопасности, поскольку MAC-адрес компьютера теперь можно узнать по IPv6-адресу. Для решения этой проблемы был разработан стандарт IPv6 Privacy Extensions (RFC 4941). В соответствии с ним ядро видоизменяет исходный адрес, генерируя вместо него временный. Такой подход используется, когда необходимо скрыть настоящий адрес при подключении к удалённому серверу.

Чтобы включить Privacy Extensions, добавьте в файл /etc/sysctl.d/40-ipv6.conf следующие строки:

После перезагрузки Privacy Extensions будут включены.

dhcpcd

Стандартная конфигурация dhcpcd содержит опцию slaac private (RFC 7217), которая включает назначение стабильных приватных адресов вместо вычисления оных на основе аппаратных параметров. Дополнительная настройка не требуется, если, конечно, вы не хотите изменять адрес IPv6 чаще, чем в начале каждого нового подключения к сети. Если задать опцию slaac hwaddr , то будут назначаться постоянные адреса.

NetworkManager

NetworkManager использует IPv6 Privacy Extensions в соответствии с настройкой ipv6.ip6-privacy в файле NetworkManager.conf(5) или в профиле соединения. Если параметр не задан ни глобально, ни для соединения, NetworkManager будет использовать /proc/sys/net/ipv6/conf/default/use_tempaddr .

Чтобы включить IPv6 Privacy Extensions явно, добавьте следующие строки в файл NetworkManager.conf(5) :

Примените настройки и переподключитесь ко всем активным соединениям.

Чтобы включить IPv6 Privacy Extensions для отдельных соединений под управлением NetworkManager, отредактируйте соответствующий нужному соединения файл в каталоге /etc/NetworkManager/system-connections/ , добавив к разделу [ipv6] пару ключ-значение ip6-privacy=2 :

Перезагрузите соединение и подключитесь к нему снова.

Примечание: Может показаться, что временный адрес IPv6, созданный при включении Privacy Extensions, никогда не обновляется (он не переходит в статус deprecated после истечения времени жизни valid_lft ). На самом деле это не совсем так: через больший промежуток времени адрес всё же изменится.

systemd-networkd

Тем не менее, учитываются некоторые другие опции:

Примечание: temp_prefered_lft — корректное имя переменной, хотя допущена грамматическая ошибка (правильно preferred).

connman

Добавьте следующую строку в файл службы (например, /var/lib/connman/название_службы/settings ):

Постоянный приватный адрес

Другой полезной возможностью являются описанные в RFC 7217 постоянные приватные IP-адреса (stable private addresses). Эта технология позволяет назначать интерфейсам постоянные адреса, для вычисления которых вместо MAC-адреса устройства используется специально сгенерированный ключ.

Чтобы заставить ядро сгенерировать ключ (например, для интерфейса wlan0 ), необходимо задать параметр ядра:

Примечание: Если адрес IPv6 полчен от dhcpcd, то флага stable-privacy у него не будет.

NetworkManager

Описанные выше настройки не работают для NetworkManager, но он использует постоянные приватные адреса по умолчанию [1],[2].

Статический адрес

Иногда использование статического адреса может быть применено в качестве одной из мер обеспечения безопасности. Например, если ваш локальный маршрутизатор использует обнаружение соседей (Neighbor Discovery) или radvd (RFC 2461), вашему интерфейсу будет автоматически присвоен адрес, который содержит часть MAC-адреса сетевого интерфейса (используя SLAAC). Это может быть не слишком хорошо для безопасности, так как позволяет без труда отслеживать систему даже если часть IPv6-адреса сменилась.

Чтобы присвоить статический IP-адрес при помощи netctl, используйте шаблон профиля /etc/netctl/examples/ethernet-static . Следующие строки особенно важны:

Примечание: Если вы подключены к сети только посредстмов IPv6, то необходимо определить соответствующий DNS-сервер. Например: Если ваш провайдер не предоставляет DNS для IPv6 и вы не хотите настраивать свой сервер, то можно выбрать его по рекомендациям в статье Разрешение доменных имён.

IPv6 и PPPoE

Стандартный инструмент для PPPoE, pppd , позволяет использовать IPv6 в PPPoE, если это поддерживается вашим провайдером и модемом. Добавьте одну строку в файл /etc/ppp/options :

Если вы используете netctl для PPPoE, тогда вместо этого добавьте следующую строку в файл настроек netctl:

Делегирование префикса (DHCPv6-PD)

Примечание: В этом разделе рассматривается настройка пользовательского шлюза, а не клиентских машин. Для стандартных маршрутизаторов, доступных на рынке, рекомендуется предварительно изучить документацию по включению функции делегирования префикса.

Делегирование префикса (prefix delegation) — широко распространённая технология развёртывания IPv6, используемая многими интернет-провайдерами. Представляет собой метод назначения сетевого префикса пользователю (например, локальной сети). Маршрутизатор может быть настроен на привязку разных сетевых префиксов к различным подсетям. Провайдер выдаёт префикс с помощью DHCPv6 (обычно это префикс /56 или /64 ), а dhcp-клиент назначает префикс локальной сети. В случае простого шлюза с двумя интерфейсами клиент обычно получает адрес через WAN-интерфейс (или псевдоинтерфейс вроде ppp) и на его основании присваивает IPv6-префикс интерфейсу, обращённому к локальной сети.

Клиент DHCPv6 принимает входящие соединения на UDP-порт 546. Чтобы настроить доступ к этому порту в межсетевом экране nftables, в файле /etc/nftables.conf добавьте следующее правило в цепочку input:

dhcpcd

dhcpcd помимо поддержки dhcp для IPv4 также предлагает полноценную реализацию протокола DHCPv6 (включая DHCPv6-PD). Если вы используете dhcpcd , отредактируйте файл /etc/dhcpcd.conf . Скорее всего, вы уже используете dhcpcd для IPv4, поэтому просто обновите существующую конфигурацию.

Эта конфигурация запросит префикс на WAN-интерфейсе ( WAN ) и делегирует его внутреннему интерфейсу ( LAN ). Если вдруг с диапазоном /64 возникнут проблемы, то нужно использовать вторую инструкцию ia_pd , которая в примере выше закомментирована. Кроме того, приведённая конфигурация также отключит вызовы маршрутизатора (router solicitation) для всех интерфейсов, кроме WAN.

WIDE-DHCPv6

WIDE-DHCPv6 — свободная реализация протокола DHCP для IPv6 (DHCPv6), первоначально разработанная проектом KAME. Установите его с пакетом wide-dhcpv6 AUR .

Если вы используете wide-dhcpv6 , отредактируйте файл /etc/wide-dhcpv6/dhcp6c.conf , заменив WAN и LAN названиями соответвующих интерфейсов:

Примечание: Параметр sla-len нужно назначить таким образом, чтобы выполнялась формула (WAN-prefix) + (sla-len) = 64 . В нашем случае для сети с префиксом /56 формула примет вид 56+8=64. Для префикса /64 sla-len будет равен 0 .

Клиент wide-dhcpv6 можно запустить/включить с помощью файла юнита systemd dhcp6c@interface.service , где interface — название интерфейса в файле настроек, т.е. например для интерфейса "WAN" используйте dhcp6c@WAN.service .

Совет: См. также dhcp6c(8) и dhcp6c.conf(5) .

systemd-networkd

Настройте внешний (wan) и внутренний (lan) интерфейсы. Это включит DHCPv6-PD для интерфейса с запущенным DHCPv6-клиентом. Делегированные префиксы предоставляются посредством IPv6 Router Advertisement во внутренней (локальной) сети.

Другие клиенты

Отключение IPv6

Примечание: Поддержка IPv6 встроена в ядро Arch Linux, поэтому отключить модуль просто добавив его в чёрный список не получится.

Отключение функциональности

Параметр ядра ipv6.disable=1 отключает весь стек IPv6, что в большинстве случаев помогает добиться желаемого результата. О параметрах ядра см. Kernel parameters.

Другой параметр, ipv6.disable_ipv6=1 , оставит стек IPv6 работающим, но адреса IPv6 не будут присваиваться сетевым интерфейсам.

Также вы можете отключить присвоение адреса IPv6 конкретным сетевым интерфейсам, добавив следующие строки в файл настроек sysctl /etc/sysctl.d/40-ipv6.conf :

Перезапустите юнит systemd-sysctl.service , чтобы изменения вступили в силу.

Необходимо перечислить здесь все сетевые интерфейсы, для которых требуется отключение IPv6, так как опция all.disable_ipv6 не будет применена к сетевым интерфейсам, которые уже включены на момент выполнения инструкций из файла настроек.

Примечание: Обратите также внимание, что при таком способе отключения IPv6 необходимо закомментировать все IPv6-хосты в файле /etc/hosts . В противном случае могут происходить ошибки подключения, если при определении адреса произошло разрешение имени хоста на недоступный 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.

Чтобы определить, как systemd должен запускать службу ntpd, необходимо внести изменения в файл ntpd.service .

Это создаст drop-in сниппет, который будет запускаться вместо стандартного ntpd.service . Флаг -4 отключает использование IPv6 демоном ntp. Поместите следующее в drop-in сниппет:

Здесь сначала очищается значение ExecStart , а затем устанавливается новая команда.

GnuPG

Отключите IPv6 в настройка dirmngr:

После этого перезапустите пользовательскую службу dirmngr.service .

Добавьте следующие строки в файл sshd_config , чтобы убедиться, что sshd использует IPv4-адрес:

После этого перезапустите службу sshd.service .

systemd-timesyncd

Команда systemctl status systemd-timesyncd в пункте "Status" выведет IPv6-адрес целевого сервера:

systemd-networkd

networkd позволяет отключить IPv6 для отдельного интерфейса. Когда в разделе [Network] сетевого юнита указан параметр LinkLocalAddressing=ipv4 или LinkLocalAddressing=no , networkd не будет настраивать IPv6 на соответствующих сетевых интерфейсах.

Следует однако отметить, что даже при использовании указанных выше опций networkd всё еще будет ожидать получения "объявлений маршрутизатора" (router advertisements, RA), если IPv6 не был отключён глобально для всей системы. Если трафик IPv6 не будет доходить до интерфейса (например, из-за настроек sysctl или ip6tables), то интерфейс останется в состоянии настройки и потенциально может стать причиной превышения времени ожидания (timeout) для служб, требующих полной настройки сети. Чтобы этого избежать, добавьте опцию IPv6AcceptRA=no в раздел [Network] .


Изложенный ниже материал не претендует на эксклюзивность. Однако мне пришлось собирать его по крупицам из разных источников, что-то проверяя экспериментально. После этого родилась идея систематизировать полученные знания и опыт, изложив все в одной заметке.

Linux Debian v7.XX, Ubuntu v14.XX
CentOS v6.XX
FreeBSD v10.XX

После внедрения поддержки IPv6, на хостинговой площадке компании в которой я работаю, у нас возникла необходимость автоматизировать настройку VDS соответствующим образом. Необходимо оговорится, что речь идет не о каком-либо туннелировании, а полноценной поддержке. Т.е. сетевая инфраструктура в дата-центре обеспечивает коммутацию и маршрутизацию IPv6, имеются соответствующие стыки по BGPv6 с магистральными провайдерами Internet.

Адреса назначаются и прописываются в настройках ОС статично, т.е. функционал автоматического конфигурирования IPv6 не задействуется. Это связано с особенностями учета адресного пространства и обеспечения безопасности. Задача осложняется тем, что адресов IPv4 и IPv6 у VDS может быть сразу несколько.

Linux Debian v7.XX, Ubuntu v14.XX

В достаточно свежих дистрибутивах ОС Linux уже присутствует полноценная поддержка IPv6. Поэтому доустанавливать что-либо вручную необходимости нет.
Рассмотрим пример настройки.
"/etc/network/interfaces"


Тут следует обратить внимание на два момента. Во-первых, все адреса IPv6 назначаются непосредственно на сам сетевой интерфейс: в отличие от IPv4 нет необходимости создавать виртуальные адаптеры типа «eth0:X». Во-вторых, шлюз по умолчанию для IPv6 указывается один раз для любого из адресов. Действовать он будет для всех.
Результат настроек в выводе команды «ifconfig»:

CentOS v6.XX

Настройка CentOS замысловатее из-за того, что опций несколько больше, и они раскиданы по нескольким файлам.
"/etc/sysconfig/network"


В целом картина аналогична Debian. Виртуальные сетевые интерфейсы «eth0:X» необходимы только для IPv4. Опции «NETWORKING_IPV6» и «IPV6INIT» включают поддержку IPv6. В «IPV6_DEFAULTGW» указываем шлюз по умолчанию. Первый адрес IPv6 назначается в «IPV6ADDR», все остальные перечисляются в «IPV6ADDR_SECONDARIES».

Вывод команды «ifconfig» аналогичен Debian:

FreeBSD v10.XX

В ОС FreeBSD уже также есть все необходимое для поддержки IPv6.
Рассмотрим пример настройки.
" /etc/rc.conf"


Основной адрес IPv6 указывается в опции «ifconfig_xn0_ipv6». Поскольку в FreeBSD механизм виртуальных сетевых интерфейсов для IPv4 не используется, то все дополнительные адреса, в том числе IPv6, перечисляются в «ifconfig_xn0_aliases».
Вывод команды «ifconfig» немного отличается от ОС Linux.


В данном случае адресом по умолчанию является тот, что указан самым последним в выводе команды: «2a04:XXXX:1::12».

Перед выполнением действи по этой статье рекомендуется ознакомиться со статьёй Настройка сети в ОС Astra Linux.

Следует понимать, что в настроенной по умолчанию системе к сетевым интерфейсам будут последовательно применены сначала настройки сетевой службы networking, а затем - настройки сетевой службы NetworkManager, которые перезаписывают настройки netwotking.

При этом в системе, настроенной по умолчанию, служба NetworkManager обслуживает все сетевые интерфейсы, кроме интерфейса обратной петли ("loopback", lo).

Данная статья применима к:

    Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7)

Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)

Astra Linux Special Edition РУСБ.10015-16 исп. 1

Astra Linux Special Edition РУСБ.10015-16 исп. 2 (кроме управления параметрами загрузки)

Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1) (кроме управления параметрами загрузки)

Astra Linux Common Edition 2.12

Управление параметрами загрузки в Astra Linux Special Edition РУСБ.10015-16 исп. 2 и Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1) см. статью Файл параметров загрузки /boot/boot.conf

Проверить наличие адресов IPv6 у сетевых интерфейсов можно командой

В версиях Astra Linux с установленными оперативными обновлениями IPv6 по умолчанию отключен на уровне службы networking.
См. файлы /etc/sysctl.conf и /etc/sysctl.d/999-astra.conf, для отключения IPv6 там должна быть указана строка net.ipv6.conf.all.disable_ipv6 = 1:

kernel.sysrq = 0
fs.suid_dumpable = 0
kernel.randomize_va_space = 2
net.ipv6.conf.all.disable_ipv6 = 1

Однако, адреса IPv6 у сетевых интерфейсов по умолчанию присутствуют. Это происходит потому, что работающая по умолчанию служба NetworkManager сама настраивает сетевые интерейсы так, как считает нужным, перезаписывая настройки, установленные ранее службой networking (/etc/ssysctl/*).

Полное выключение стека IPv6 параметрами загрузчика GRUB2

В Astra Linux Special Edition РУСБ.10015-16 исп. 2 и в Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1) загрузчик GRUB2 не используется, а IPv6 выключается в файле /boot/boot.conf (параметр cmdline="ipv6.disable=1").

Для выключения IPv6 параметрами загрузки найти в файле /etc/default/grub строчку GRUB_CMDLINE_LINUX, добавить туда параметр "ipv6.disable=1", например

GRUB_CMDLINE_LINUX_DEFAULT="quiet net.ifnames=0 ipv6.disable=1"

Данный способ запрещает ядру загрузку модулей IPv6, и позволяет выключить IPv6 независимо от настроек служб NetworkManager и networking. Выключать протокол IPv6 таким способом НЕ РЕКОМЕНДУЕТСЯ, так как отсутствие модулей IPv6 может вызвать неработоспособность некоторых программ (Samba, FreeIPA). При необходимости отключить IPv6 рекомендуется использовать выключение настройками сети (см. ниже).

После внесения изменений в файл /etc/default/grub следует обновить конфигурацию загрузчика:

и перезагрузить машину.

Конфигурация IPv6 указанная в параметрах службы networking (файлы /etc/sysctl.conf и /etc/sysctl.d/*.conf) и службы NetworkManager (/etc/NetworkManager/system-connections/*) при использовании этого способа не имеет значения, однако следует убедиться, что настройки конфигурации не содержат параметров, относящихся к IPv6 (например, параметр net.ipv6.conf.eth0.disable_ipv6 = 1 в файлах /etc/sysctl.conf и /etc/sysctl.d/*.conf). При наличии таких параметров их следует удалить или закомментировать, так как попытки обращения к несуществующему стеку IPv6 будут вызвать ошибки.

Отключение IPv6 параметрами ядра с сохранением стека IPv6

Для сохранения стека IPv6 ледует внести изменения в параметр GRUB_CMDLINE_LINUX в файле /etc/default/grub, заменив в атрибуте "ipv6.disable_ipv6" значение 1 на значение 0:

GRUB_CMDLINE_LINUX_DEFAULT="quiet net.ifnames=0 ipv6.disable_ipv6=0"

После внесения изменений в файл /etc/default/grub следует обновить конфигурацию загрузчика:

Отключение настройки IPv6 сетевыми службами

Отключение IPv6 настройкой параметров ядра сделано в ОС Astra Linux по умолчанию (см. выше файл /etc/sysctl.d/999-astra.conf), однако при наличии загруженного модуля ядра IPv6 служба NetworkManager по умолчанию сама назначает сетевым интерфейсам адреса IPv6. Чтобы этого не происходило следует выполнить одно из действий:

Либо настроить все нужные параметры интерфейса в файле /etc/network/interfaces. Тогда параметры интерфейса будут задаваться службой networking, а служба NetworkManager будет игнорировать все интерфейсы, упомянутые в /etc/network/interfaces, и её можно даже отключить за ненадобностью:

    через графический интерфейс управления сетевыми интерфейсами в закладке "Параметры IPv6" выбрать метод "Игнорировать"
nmcli con down "Проводное соединение 1"
nmcli con mod "Проводное соединение 1" ipv6.method ignore
nmcli con up "Проводное соединение 1"

Убедиться, что IPv6 не отключен в файле параметров загрузки /etc/default/grub. Для этого найти в файле строку параметров загрузчика GRUB_CMDLINE_LINUX и убедиться, что там не указан параметр "ipv6.disable=1", если такой параметр указан - убрать его или изменить значение ппараметра на 0.
Если файл был изменён, то обновить загрузчик:

и перезагрузить компьютер.

Для включения протокола IPv6 с помощью настроек сети следует в файл /etc/sysctl.d/999-astra.conf строку

Можно также включать/отключать использование на отдельных сетевых интерфейсах, например, для интерфейса eth0 отключить, для интерфейса lo - включить:

net.ipv6.conf.eth0.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 0

После внесения изменений в файл для немедленного применения изменений выполнить команду:

Многие сетевые источники рекомендуют перезапускать сервис командой

однако с опцией -p будут выполнены только инструкции, находящиеся в файле /etc/sysctl.conf, файлы /etc/sysctl.d/*.conf будут проигнорированы.
Также заданные указанным способом параметры будут автоматически применяться при перезагрузке ОС.

В Astra Linux Special Edition РУСБ.10015-16 исп. 2 и в Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1) IPv6 включается в файле /boot/boot.conf. Для включения IPv6 следует в файле /boot/boot.conf в строке cmdline="ipv6.disable=1" поменять на cmdline="ipv6.disable=0".

Для включения протокола IPv6 следует:

    Убедиться, что IPv6 не отключен в файле параметров загрузки /etc/default/grub.
    Для этого найти в файле строку параметров загрузчика GRUB_CMDLINE_LINUX и убедиться, что там не указан параметр "ipv6.disable=1", если такой параметр указан - убрать его или заменить значение на 0;

Убедиться, что IPv6 не отключен в файле параметров сетевых служб /etc/sysctl.conf, и в файлах /etc/sysctl.d/* (в частности, в файлах /etc/sysctl.d/999-astra.conf).
Т.е., убедиться, что в файле отсутствуют строки вида

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

и, если таковые строки имеются, удалить их или закомментировать.

Если изменения были внесены в файл /etc/default/grub, то следует обновить загрузчик:

И перезагрузить машину.

Для установки реплики FreeIPA сетевой интерфейс обратной петли (loopback, lo) должен иметь адрес IPv6. Чтобы назначить такой адрес следует:

    Разрешить использовать стек IPv6 в параметрах загрузчика, если он не был ранее разрешен и перезагрузить машину;

Запретить использовать стек IPv6 всех сетевых интерфейсах, кроме сетевого интерфейса lo. Для этого добавить строку net.ipv6.conf.lo.disable_ipv6 = 0 в файл /etc/sysctl.d/999-astra.conf. В итоге файл должен выглядеть примерно так:

kernel.sysrq = 0
fs.suid_dumpable = 0
kernel.randomize_va_space = 2
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 0

sudo sysctl --system

или перезагрузить компьютер.

Если при этом каким-то другим сетевым интерфейсам назначены неиспользуемые адреса IPv6 (например, службой NetworkManager), то желательно их убрать, так как попытки их использовать могут замедлять работу FreeIPA.

IPv6 открывает много возможностей и решает многие давнишние проблемы, но требует небольшой корректировки некоторых из обычных сетевых конфигураций (если ранее использовался исключительно протокол IPv4). В этом руководстве речь пойдет об инструментах IPv6, аналогичных популярным инструментам и утилитам IPv4, а также о настройке некоторых сервисов для использования IPv6.

Диагностика сети с IPv6

Некоторые простейшие утилиты, используемые для диагностики проблем сети, были разработаны с ориентировкой на IPv4. Для работы с трафиком IPv6 можно использовать аналоги этих утилит протокола IPv6.

Прежде всего, чтобы просмотреть имеющиеся на данный момент настроенные IPv6-адреса сервера, используйте инструменты iproute2:

ip -6 addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 2400:6180:0:d0::41f/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::601:15ff:fe43:b201/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 fe80::601:15ff:fe43:b202/64 scope link
valid_lft forever preferred_lft forever

Чтобы вывести на экран таблицу маршрутизации IPv6, можно использовать netstat, набрав что-то вроде:

netstat -A inet6 -rn
Kernel IPv6 routing table
Destination Next Hop Flag Met Ref Use If
2400:6180:0:d0::/64 :: U 256 0 1 eth0
fe80::/64 :: U 256 0 0 eth1
fe80::/64 :: U 256 0 0 eth0
::/0 2400:6180:0:d0::1 UG 1024 0 0 eth0
::/0 :: !n -1 1 90 lo
::1/128 :: Un 0 1 20 lo
2400:6180:0:d0::41f/128 :: Un 0 1 86 lo
fe80::601:15ff:fe43:b201/128 :: Un 0 1 75 lo
fe80::601:15ff:fe43:b202/128 :: Un 0 1 0 lo
ff00::/8 :: U 256 0 0 eth1
ff00::/8 :: U 256 0 0 eth0
::/0 :: !n -1 1 90 lo

Пользователи, предпочитающие iproute2, могут получить эту информацию, введя:

ip -6 route show
2400:6180:0:d0::/64 dev eth0 proto kernel metric 256
fe80::/64 dev eth1 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
default via 2400:6180:0:d0::1 dev eth0 metric 1024

Теперь, научившись получать некоторую информацию IPv6, можно ознакомиться с использованием некоторых инструментов, которые работают с IPv6.

На самом деле, часто встречающийся ping является специфичной командой IPv4. Аналогичная команда для IPv6-адресов называется ping6. Например, следующая строка будет пинговать локальный кольцевой интерфейс:

ping6 -c 3 ::1
PING ::1(::1) 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.021 ms
64 bytes from ::1: icmp_seq=2 ttl=64 time=0.028 ms
64 bytes from ::1: icmp_seq=3 ttl=64 time=0.022 ms
--- ::1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.021/0.023/0.028/0.006 ms

Как видите, эта команда работает таким же образом, как и ping, с той лишь разницей, что для адресации используется версия протокола.

tracepath6 ::1
1?: [LOCALHOST] 0.045ms pmtu 65536
1: ip6-localhost 0.189ms reached
1: ip6-localhost 0.110ms reached
Resume: pmtu 65536 hops 1 back 64

Чтобы контролировать входящий трафик, как правило, используется программа tcpdump. Эта утилита может отфильтровывать IPv6-трафик с помощью выражения ip6 or proto ipv6, введенного после опций.

Например, можно измерить быстрый трафик IPv6, сказав утилите вывести только важную информацию. Данная команда собирает резюме информации, чтобы избежать задержки выхода:

tcpdump -t -n -i eth0 -s 512 -vv ip6 or proto ipv6

Проверка информации DNS

С помощью типичных инструментов IPv6 можно быстро проверить информацию о доменах. Главное отличие от IPv4 состоит в том, что нужно запрашивать записи AAAA ((IPv6 address record), которые используются в IPv6 вместо записей А (в IPv4).

Чтобы получить запись об IPv6-адресе домена, можно просто запросить запись AAAA. С помощью команды host это делается следующим образом:

Подобный результат можно получить при помощи команды dig:

Как видите, работая с IPv6-адресами, можно легко проверить, правильно ли разрешается DNS.

Сетевые сервисы IPv6

Большинство общих сетевых сервисов могут обрабатывать трафик IPv6. Иногда они нуждаются в специальных флагах или синтаксисе, а в некоторых случаях они имеют альтернативную версию, разработанную специально для IPv6.

Настройка SSH

В SSH можно настроить демона на прослушивание IPv6-адресов. Это делается в конфигурационном файле, который можно открыть так:

sudo nano /etc/ssh/sshd_config

Директива ListenAddress указывает, к какому адресу должен привязываться демон SSH. Для адресов IPv4 это выглядит так:

То есть, демон прослушивает IPv4-адрес 111.111.111.111 на порту 22. В случае с IPv6-адресами сам адрес нужно взять в квадратные скобки:

Это скажет демону SSH слушать адрес 1341:8954:a389:33:ba33::1 на порту 22. Чтобы сказать демону слушать все доступные адреса IPv6, наберите:

Не забывайте перезагрузить демона после внесения изменений.

sudo service ssh restart

Если на стороне клиента демон, к которому нужно подключиться, настроен на прослушивание адресов IPv4 и IPv6, клиента можно заставить использовать IPv6 только с помощью флага -6, вот так:

Настройка веб-сервера

Как и SSH-демон, веб-сервер должен быть настроен на прослушивание адресов IPv6.

Чтобы Apache отвечал на запросы определенных IPv6-адресов, используйте синтаксис:

Это скажет серверу прослушивать указанный адрес на порту 80. Для большей гибкости эту строку можно скомбинировать с адресами IPv4; это делается так:

Listen 111.111.111.111:80
Listen [1341:8954:a389:33:ba33::1]:80

При необходимости слушать соединения на порт 80 на всех интерфейсах во всех протоколах можно использовать просто:

Указать адрес IPv6 можно также на уровне виртуального хоста. Как видите, здесь можно настроить virtualhost для IPv6- и IPv4-адреса:

<VirtualHost 111.111.111.111:80, [1341:8954:a389:33:ba33::1]:80>
. . .
</VirtualHost>

Не забудьте перезагрузить сервис для активации внесенных изменений.

sudo service apache2 restart

Пользователи, предпочитающие использовать в качестве веб-сервера Nginx, могут выполнить подобную конфигурацию. За прослушивание адресов отвечает директива listen; чтоб прослушивать трафик IPv6:

На самом деле, в Linux трафик IPv4 тоже будет прослушиваться на порту 80, потому что запросы IPv4 автоматически преобразовываются в адрес IPv6. Потому не нужно указывать адреса IPv6 и IPv4 отдельно следующим образом:

listen [1341:8954:a389:33:ba33::1]:80;
listen 111.111.111.111:80;

Это приведет к ошибке, сообщающей, что порт уже привязан к другому сервису. Чтобы использовать отдельные директивы, отключите эту функцию с помощью sysctl:

sysctl -w net.ipv6.bindv6only=1

Чтобы эта строка автоматически выполнялась при загрузке, добавьте ее в /etc/sysctl.conf:

sudo nano /etc/sysctl.conf
. . .
net.ipv6.bindv6only=1

После этого можно использовать отдельные директивы для IPv4 и IPv6, добавив флаг ipv6only=on к директиве, прослушивающей IPv6:

listen [1341:8954:a389:33:ba33::1]:80 ipv6only=on;
listen 111.111.111.111:80;

Опять же, нужно перезапустить Nginx для активации новых настроек:

sudo service nginx restart

Настройки брандмауэра

К счастью, пользователи, привыкшие настраивать правила брандмауэра при помощи фронт-эндов netfilter (например, iptables), могут использовать аналогичный инструмент, который называется ip6tables.

Чтобы узнать, как настроить iptables в Ubuntu, читайте данную статью.

Для управления правилами фильтрации пакетов IPv6 можно просто заменить команду на ip6tables. Например, в список правил IPv6 можно ввести:

sudo ip6tables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

При использовании на сервере инструмента ufw все уже готово! Дело в том, что ufw настраивает сразу оба стека, если не указано иное. Возможно, придется добавить некоторые правила для конкретных адресов IPv6, но использовать другой инструмент не понадобится.

Чтобы узнать больше об использовании ufw, читайте данное руководство.

Настройка TCP-оболочек

При использовании TCP-оболочек для управления доступом к серверу через файлы /etc/hosts.allow и /etc/hosts.deny просто используйте синтаксис IPv6, чтобы соответствовать определенным правилам.

Например, можно разрешить подключаться по SSH только адресам IPv4 и IPv6; для этого внесите в файл /etc/hosts.allow следующее:

sudo nano /etc/hosts.allow
. . .
sshd: 111.111.0.0/255.255.254.0, [1341:8954:a389:33::]/64

Как видите, адаптировать текущие правила оболочки TCP очень легко.

Итоги

Конечно, для рационального использования ресурсов IPv6 часто приходится изучать сетевые сервисы по отдельности, чтобы узнать о необходимости каких-либо дополнительных изменений в конфигурациях. Тем не менее, теперь работать с IPv6, используя основные утилиты и сервисы, будет более комфортно.


Преимущества IPv6

Чем же IPv6 лучше своего предшественника? Кроме того, что мы избавляемся от проблем в IPv4-адресацией, у нас теперь есть:

Основным недостатком IPv6 можно назвать длинные адреса в шестнадцатеричном виде. Четыре фрагмента адреса IPv4, разделённые точками, легки для запоминания, а вот восемь кусков шестнадцатиричных чисел запомнить куда труднее.

Моя система поддерживает IPv6?

Как узнать, включена ли поддержка IPv6 в вашем Linux? Очень просто:

Пинг IPv6

Если вам нужно выполнить пинг IPv6-системы, вам понадобится утилита ping6. Следующая команда отправляет два пакета к localhost:

Исследование сети

Хотите узнать, есть ли кто-то в вашей сети, кто имеет поддержку IPv6? Легко!

После того, как ваш хост обменялся данными с другими хостами по IPv6, адреса последних попадут в таблицу окружения (neighbor table) IPv6 (это что-то вроде ARP-таблицы). Содержимое neighbor table вы можете просмотреть при помощи утилиты ip:

Использование сетевых имён

fe80::20b:6aff:feef:7e8d fatfreddy
fe80::221:97ff:feed:ef01 phineas
fe80::3f1:4baf:a7dd:ba4f franklin

$ ping6 -I eth0 phineas
PING phineas(phineas) from fe80::221:97ff:feed:ef01 eth0: 56 data bytes
64 bytes from phineas: icmp_seq=1 ttl=64 time=17.3 ms

SSH и SCP

SSH и SCP умеют работать c IPv6. Внимание, при передаче параметров этим утилитам из командной строки, имеются определённые синтаксические особенности, так что будьте внимательны! Если у вас настроено корректное разрешение имён IPv6-хостов, то разницы при вызове утилит вообще никакой. Вы таким же образом можете подключаться к удалённой оболочке:

А вот в случае использования IPv6-адресов всё чуток сложнее. Установка SSH-сессии:

И опять же, если вы используете link-local адрес, то вы должны указать имя интерфейса с которого будете осуществлять подключение. Как показано выше, делается это путём добавления знака процента и имени интерфейса. Вызов scp имеет ещё более дурацкий синтаксис:

IPv6-адрес вместе именем интерфейса необходимо заключать в квадратные скобки, а квадратные скобки в свою очередь экранировать, чтобы оболочка не узрела в них спецсимволов.

Какой у меня IPv6-адрес?

Команда 'ifconfig -a' выводит информацию обо всех сетевых интерфейсах, находящихся в системе: как о физических, так и о виртуальных. Получив информацию по конкретному интерфейсу вы можете воспользоваться grep, чтобы отфильтровать информацию об IPv6-адресе интерфейса:

Интернет

Так же, как и в случае с IPv4, ваш провайдер должен выделить вам блок адресов IPv6. Адреса из этого блока являются глобальными адресами, находящимися в диапазоне 2000::/3. Давайте в качестве эксперимента попробуем присвоить какому-нибудь сетевому интерфейсу адрес из этого диапазона:

Читайте также: