IPv6 на Linux-сервере часто «заводится сам»: интерфейс получает адрес, пинги ходят, AAAA-записи резолвятся. А потом внезапно отваливается доступ по SSH, часть сайтов «подвисает», или адрес меняется «сам по себе». Почти всегда причина в сочетании трёх вещей: как назначен адрес (SLAAC или статически), включены ли privacy extensions, и насколько аккуратно настроен firewall, который не должен ломать Neighbor Discovery и Path MTU Discovery.
Ниже — практическая шпаргалка: что выбрать на сервере (SLAAC vs static IPv6), когда privacy extensions полезны и когда вредят, какие ICMPv6-пакеты жизненно важны, и как фильтровать IPv6 в nftables без неприятных сюрпризов.
Базовая модель IPv6 на хосте: адреса, маршруты, соседи
У IPv6 есть несколько особенностей, из-за которых привычные IPv4-паттерны (DHCP + ARP + «режем ICMP») работают плохо:
Адресов может быть несколько на одном интерфейсе: глобальный, временный (temporary), ULA, link-local (
fe80::/10).Link-local обязателен: он используется для служебного обмена на канальном уровне, в том числе для Neighbor Discovery.
ARP заменён на Neighbor Discovery (ND), который построен поверх ICMPv6. Если «запретить ICMP», вы запретите фундаментальные механизмы доставки.
Маршруты и параметры сети часто приходят через Router Advertisement (RA) — даже если адрес задан статически.
SLAAC vs static IPv6: что выбрать на сервере
SLAAC (Stateless Address Autoconfiguration) — способ, при котором хост сам формирует IPv6-адрес на основе префикса из RA. Обычно это выглядит так: роутер объявляет 2001:db8:1234:5678::/64, а сервер выбирает «хвост» и получает полный адрес.
Static IPv6 — когда вы вручную задаёте адрес(а) и, при необходимости, маршрут/шлюз. Это чаще даёт предсказуемость для сервисов, ACL, PTR/DNS, мониторинга и автоматизации.
Когда SLAAC уместен
В локальных сетях, где важна простота, и адрес хоста не обязан быть стабильным для внешнего мира.
На рабочих станциях и ноутбуках, где privacy extensions дают реальную пользу.
В средах, где RA стабилен и вы готовы жить с тем, что адрес может меняться (или появляться дополнительный).
Почему на сервере чаще нужен static IPv6
Стабильность endpoint: IP должен оставаться тем же для SSH, API, allowlist и интеграций.
DNS и обратная зона: для почты и многих корпоративных сценариев критичны AAAA и PTR, а они привязаны к конкретному адресу.
Firewall/ACL: правила проще писать на фиксированные адреса, а не на «всё /64».
Понятная эксплуатация: меньше сюрпризов после ребута, обновлений, смены RA-политик.
Практическое правило: для публичных сервисов и админского доступа используйте статический IPv6-адрес. SLAAC оставляйте как вспомогательный механизм или для клиентских машин.
Если вы поднимаете сервер с нуля, проще всего сразу зафиксировать адреса и правила на уровне хоста. На практике это удобнее делать на VDS, где вы контролируете сетевую конфигурацию, sysctl и firewall без ограничений «внутренней кухни».

Privacy extensions: что это и почему серверу они часто мешают
Privacy extensions — механизм генерации временных IPv6-адресов (temporary addresses), чтобы снизить отслеживаемость устройства по стабильному идентификатору интерфейса. Это полезно на клиентских устройствах, но на сервере приводит к неожиданным эффектам:
У интерфейса появляется дополнительный глобальный адрес, который периодически меняется.
Исходящие соединения могут уходить с временного адреса, если он становится preferred для исходящего трафика.
Логи, allowlist и внешние интеграции начинают видеть «плавающий» источник.
Как понять, включены ли temporary addresses
Посмотрите адреса на интерфейсе:
ip -6 addr show dev eth0
Если видите отметки вроде temporary, mngtmpaddr или несколько глобальных адресов в одном /64 — временные адреса включены.
Как отключить privacy extensions на сервере
В Linux это контролируется net.ipv6.conf.*.use_tempaddr:
sysctl net.ipv6.conf.all.use_tempaddr
sysctl net.ipv6.conf.default.use_tempaddr
Типичные значения:
0— temporary адреса выключены (обычно то, что нужно на сервере).2— включены, temporary предпочитаются для исходящих.
Временно отключить:
sysctl -w net.ipv6.conf.all.use_tempaddr=0
sysctl -w net.ipv6.conf.default.use_tempaddr=0
Чтобы сделать постоянным — добавьте в /etc/sysctl.d/99-ipv6.conf:
net.ipv6.conf.all.use_tempaddr=0
net.ipv6.conf.default.use_tempaddr=0
И примените:
sysctl --system
А что насчёт stable privacy (RFC 7217)
Есть компромиссный вариант: «стабильный, но не привязанный к MAC» идентификатор интерфейса. На Linux это обычно проявляется как режим генерации адреса (addrgenmode). Он не включает временные адреса, но делает хвост менее предсказуемым, чем EUI-64.
Проверить параметры интерфейса можно так:
ip link show dev eth0
Для серверов чаще всего достаточно схемы «static IPv6 + temporary выключены»: вы получаете и стабильность, и управляемость.
Neighbor Discovery и ICMPv6: что нельзя ломать
Neighbor Discovery (ND) — это «IPv6-эквивалент ARP плюс немного больше». ND отвечает за разрешение соседей, обнаружение роутера, DAD (проверку уникальности адреса) и поддержание neighbor cache. И всё это работает поверх ICMPv6.
Критичные классы сообщений, которые должны проходить через firewall:
Neighbor Solicitation и Neighbor Advertisement — «кто владеет адресом» и «я владею».
Router Solicitation и Router Advertisement — запрос/объявление роутера, префиксов и параметров сети.
Packet Too Big — основа Path MTU Discovery. Если блокировать, получите таймауты и «часть сайтов не открывается», особенно на TCP.
Destination Unreachable, Time Exceeded, Parameter Problem — ошибки маршрутизации и диагностика.
В IPv6 «закрыть весь ICMP» почти всегда означает «сломать сеть». Правильный подход — разрешить необходимые ICMPv6-типы и уже поверх этого ужимать остальное.
Если хотите глубже разобраться, как взаимодействуют SLAAC, DHCPv6 и маршрутизация по RA на хосте, пригодится отдельный разбор: SLAAC, DHCPv6 и маршруты в IPv6: где что включается.
Firewall для IPv6 в nftables: минимальный рабочий базис
Ниже — шаблон, который закрывает входящие по умолчанию, разрешает установленные соединения, SSH (пример) и пропускает ICMPv6, необходимый для работы IPv6, включая ND и PMTU. Это заготовка: в продакшене обычно добавляют ограничения по источникам, отдельные цепочки под сервисы, логирование и лимиты.
Пример: таблица inet, единые правила для IPv4/IPv6 и нюансы для IPv6
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0; policy drop; }
nft add chain inet filter forward { type filter hook forward priority 0; policy drop; }
nft add chain inet filter output { type filter hook output priority 0; policy accept; }
nft add rule inet filter input iif lo accept
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input ct state invalid drop
nft add rule inet filter input tcp dport 22 accept
nft add rule inet filter input meta l4proto ipv6-icmp icmpv6 type { echo-request, echo-reply, destination-unreachable, packet-too-big, time-exceeded, parameter-problem } accept
nft add rule inet filter input meta l4proto ipv6-icmp icmpv6 type { nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, nd-redirect } accept
nft add rule inet filter input udp dport 546 accept
Пояснения к правилам
ct state established,related— пропускает ответы и связанные пакеты. Без этого соединения будут «странно» работать.ICMPv6 лучше разделять на «ошибки/PMTU» и «ND». Особенно важны
packet-too-bigи ND-типы.udp dport 546— клиентский порт DHCPv6. Он нужен только если вы используете DHCPv6-клиент (часто — для получения DNS или опций, даже при статическом адресе).
Частая ошибка: разрешить ICMPv6 только для link-local
ND действительно активно использует link-local адреса, но «ошибочные» ICMPv6 (например, packet-too-big) приходят с маршрутизируемых адресов. Если ограничить ICMPv6 по ip6 saddr fe80::/10, вы рискуете поймать трудноуловимые проблемы с MTU и доставкой.
Лимиты, чтобы ICMPv6 не стал шумом
Если опасаетесь флуда, добавляйте rate limit, а не тотальный запрет:
nft add rule inet filter input meta l4proto ipv6-icmp limit rate 50/second accept
Не ставьте слишком низкий лимит: при массовых рестартах/поднятии интерфейсов может быть всплеск ND, и сеть начнёт «сыпаться».
На виртуальном хостинге IPv6 обычно уже включён на уровне платформы, но если вы используете собственные правила фильтрации в контейнере/приложении или на отдельном сервере, держите принцип: ND и PMTU должны проходить всегда, иначе «вроде всё настроено», а доступность плавает.

Static IPv6 и RA: неожиданная пара
Даже при статическом IPv6 сервер часто продолжает принимать RA от роутера, потому что через RA приходят default route (шлюз), MTU для линка и дополнительные параметры. Проблемы начинаются, когда вы статически задали адрес и маршруты, а RA внезапно приносит другой default route, или добавляет SLAAC-адрес, который становится preferred.
Что проверить в первую очередь:
ip -6 route show
ip -6 addr show dev eth0
sysctl net.ipv6.conf.eth0.accept_ra
Иногда разумно выключать приём RA (accept_ra=0) и держать маршрутизацию в статике. Но на многих VPS/VDS-сетях RA — нормальный источник default route. Важно не «выключать по привычке», а понимать, что именно вы получаете через RA и как это влияет на приоритет адресов и маршрутов.
Проверка работоспособности IPv6: короткий чек-лист
Когда кажется, что «IPv6 есть, но не работает», идите по цепочке:
Адреса: есть ли глобальный адрес, правильный ли префикс, нет ли неожиданного temporary.
ip -6 addr show dev eth0Маршруты: есть ли default route
::/0, нет ли конфликтующих метрик.ip -6 route showND-соседи: видит ли сервер роутер как соседа, есть ли записи.
ip -6 neigh show dev eth0Firewall: не режете ли вы ND-типы и
packet-too-big(а также другие ICMPv6-ошибки).MTU: если «часть ресурсов не открывается», очень часто виноваты PMTU и фильтрация ICMPv6.
Типовые сценарии и рекомендуемая стратегия
1) Публичный сервер (web/API/SSH), нужен предсказуемый адрес
Используйте static IPv6 для основного адреса.
Отключите privacy extensions (
use_tempaddr=0), чтобы исходящие не «плясали».В
nftablesпропускайте ND и необходимые ICMPv6-ошибки (включаяpacket-too-big).
2) Внутренняя VM/контейнер-хост в корпоративной сети
SLAAC допустим, но лучше фиксировать адрес (static или DHCPv6-reservation), если есть зависимости и интеграции.
Если много L2-шумов — добавляйте rate limit на ICMPv6 аккуратно, не запрещая ND.
3) Сервер «только исходящий» (агенты, бэкапы, CI)
Можно жить на SLAAC, но следите, чтобы temporary адреса не ломали allowlist на стороне получателя.
Даже для исходящих крайне важно не ломать
packet-too-big, иначе получите странные таймауты.
Вывод
В IPv6 «магия» чаще всего объясняется тремя настройками: как назначен адрес (SLAAC или static), включены ли privacy extensions, и не ломает ли firewall Neighbor Discovery и PMTU. Для сервера почти всегда выигрывает простая схема: фиксированный IPv6-адрес, временные адреса выключены, а в nftables разрешены необходимые ICMPv6-типы.
Если после внедрения базовых правил хочется сделать конфигурацию более «боевой» (ограничить доступ по подсетям, добавить наборы, логирование, rate limit на сервисы), делайте это по шагам: сначала стабильная работа ND/маршрутов/PMTU, и только потом ужимайте поверхность атаки.


