IPv6 перестал быть экзотикой: провайдеры выдают префиксы, мобильные сети работают только на нём, а многие сервисы отдают AAAA-записи по умолчанию. Принципы другие: адресов хватает всем, NAT не нужен, а автоконфигурация часто обходится без DHCP. Ниже — практическая настройка на Linux Mint и Ubuntu, маршруты и команды для диагностики.
Как читать адрес
Адрес занимает 128 бит и записывается восемью группами по четыре шестнадцатеричные цифры. Ведущие нули опускают, одну непрерывную последовательность нулевых групп заменяют двойным двоеточием. Оно может встречаться только один раз, иначе запись неоднозначна.
- 2000::/3 — глобальные адреса, которые маршрутизируются в интернете.
- fc00::/7 — уникальные локальные адреса (ULA), аналог частных сетей; на практике берут fd00::/8.
- fe80::/10 — link-local, автоматически появляется на каждом интерфейсе.
- ff00::/8 — multicast; ::1 — loopback, :: — неопределённый адрес.
Для локальной сети стандартом остаётся префикс /64: только он работает с SLAAC. Дробить его на /72 ради «экономии» нельзя — автоконфигурация сломается.
Проверка поддержки
Сначала убедитесь, что модуль IPv6 не отключён в ядре или параметрах загрузки. Команда ip -6 addr покажет адреса, ip -6 route — таблицу маршрутизации. Если вывод пуст, проверьте sysctl: иногда IPv6 выключают ради «безопасности» и забывают вернуть.
ip -6 addr show
ip -6 route show
sysctl net.ipv6.conf.all.disable_ipv6
ping -6 -c 3 ::1
Обратите внимание на флаги в выводе: deprecated означает устаревший адрес, temporary — временный для исходящих соединений, mngtmpaddr — адрес, управляемый демоном. Если глобального адреса нет, а link-local есть, проблема в router advertisement или в том, что интерфейс не получил префикс. Для проверки одного интерфейса используйте ip -6 addr show dev eth0: вывод короче, а в скриптах его проще разобрать.
Настройка через NetworkManager
В Linux Mint и Ubuntu настольные подключения обычно управляются NetworkManager. Для автоматического получения адреса достаточно метода auto: он принимает router advertisement и при необходимости запускает DHCPv6. Для статической схемы задайте адрес, шлюз и DNS явно. Шлюзом может быть link-local адрес роутера — тогда обязательно указывайте интерфейс.
nmcli con show
nmcli con mod "Wired connection 1" ipv6.method auto
nmcli con mod "Wired connection 1" ipv6.method manual ipv6.addresses 2001:db8:10::10/64 ipv6.gateway 2001:db8:10::1 ipv6.dns "2001:4860:4860::8888"
nmcli con up "Wired connection 1"
Параметр ipv6.addr-gen-mode управляет формированием адреса: stable-privacy даёт стабильный, но не привязанный к MAC адрес, eui64 — старый вариант с MAC в младших битах. Для ноутбука разумнее stable-privacy, для сервера — предсказуемый eui64 или статика.
Маршруты
Маршрут по умолчанию в IPv6 почти всегда указывает на link-local адрес роутера. Такой адрес действителен только в пределах интерфейса, поэтому в команде нужен dev. Проверить выбранный путь можно через ip -6 route get: ядро покажет, через какой интерфейс и шлюз уйдёт пакет.
ip -6 route get 2001:4860:4860::8888
ip -6 route add 2001:db8:20::/64 via fe80::1 dev eth0
ip -6 neigh show
sysctl net.ipv6.conf.all.forwarding
Для маршрутизатора включите forwarding. Учтите, что при forwarding=1 ядро по умолчанию перестаёт принимать router advertisement; для получения адреса от вышестоящего роутера выставьте accept_ra=2 на внешнем интерфейсе.
Автоконфигурация и privacy
SLAAC строит адрес из префикса /64 и идентификатора интерфейса. Временные адреса (privacy extensions) меняются по расписанию и защищают от отслеживания по постоянному суффиксу. Включаются параметром use_tempaddr=2; при этом постоянный адрес остаётся для входящих соединений.
sysctl net.ipv6.conf.eth0.accept_ra=2
sysctl net.ipv6.conf.eth0.use_tempaddr=2
sysctl -w net.ipv6.conf.all.forwarding=1
ip -6 addr show dev eth0 scope global
Постоянные значения записывайте в /etc/sysctl.d/99-ipv6.conf, иначе после перезагрузки всё вернётся. Не отключайте IPv6 целиком, если что-то не работает: чаще виноват firewall или отсутствие ICMPv6, а не протокол.
Диагностика
Набор инструментов тот же, что для IPv4, но с флагом -6. ping проверяет доступность, mtr показывает потери по хопам, traceroute — путь. Для сокетов используйте ss -6, для пакетов — tcpdump с фильтром icmp6. DNS проверяется запросом AAAA: если запись есть, а соединения нет, проблема в маршруте или firewall.
ping -6 -c 4 2001:4860:4860::8888
mtr -6 -rwzc 20 example.com
ss -6 -tulpn
tcpdump -ni eth0 icmp6
dig AAAA example.com +short
Отдельно проверьте TCP и HTTP: curl -6 -I покажет, устанавливается ли соединение именно по IPv6. Если curl без флага работает, а с -6 нет, сравните маршруты и попробуйте ping того же адреса.
Firewall и ICMPv6
Это самая частая причина «IPv6 не работает». Neighbor Discovery использует ICMPv6 типы 133–136, а Path MTU Discovery — тип 2. Если срезать весь ICMPv6, адреса не разрешаются, а большие пакеты молча теряются. В nftables разрешите ICMPv6 целиком либо перечислите нужные типы и добавьте rate limit.
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
iif "lo" accept
ip6 nexthdr icmpv6 accept
tcp dport 22 accept
}
}
Проверка правил — nft list ruleset, счётчики видны там же. Помните, что минимальный MTU для IPv6 — 1280 байт; туннели и overlay-сети часто нарушают это требование.
Docker и контейнеры
Docker по умолчанию IPv6 в пользовательских сетях не включает. Для включения добавьте в /etc/docker/daemon.json параметры ipv6 и fixed-cidr-v6, затем перезапустите службу. Адресация должна быть из вашего ULA-префикса, а не из глобального диапазона провайдера.
{
"ipv6": true,
"fixed-cidr-v6": "fd00:dead:beef:1::/64"
}
После перезапуска проверьте docker network inspect bridge: должна появиться секция EnableIPv6 с назначенным префиксом. Если адрес не появился, убедитесь, что служба перезапущена полностью, а не только перечитала конфигурацию.
Чек-лист
- Убедитесь, что IPv6 не отключён в sysctl и параметрах загрузки.
- Для LAN используйте /64 и не включайте NAT без необходимости.
- Проверьте, что firewall пропускает ICMPv6 и не режет PMTU.
- Для сервера зафиксируйте адрес статически или через DHCPv6 с резервированием.
- Мониторьте AAAA-записи и доступность по IPv6 отдельно от IPv4.
Итог
IPv6 на практике сводится к трём вещам: корректному префиксу /64, работающим router advertisement и разрешённому ICMPv6. Настройка через NetworkManager занимает пару команд, маршруты проверяются ip -6 route get, а диагностика — ping, mtr и tcpdump. Если следовать этим шагам, сеть работает без NAT и лишних прослоек.