Конфигурация IPv6-файрвола: необходимые правила
Настройте ваш файрвол для IPv6 без поломки связности. Необходимые правила ICMPv6, примеры для Linux и распространённые ошибки, которых следует избегать.
IPv4-файрволы позволяют вам блокировать ICMP без серьёзных последствий. IPv6 так не работает. Заблокируйте не те ICMPv6-сообщения, и вы сломаете path MTU discovery, neighbor discovery и базовую связность. Ваш файрвол будет молча вызывать отказы соединений, на отладку которых уйдут часы.
TL;DR - Краткое резюме
Ключевые моменты:
- ICMPv6 критически важен: В отличие от IPv4 ICMP, блокировка ICMPv6 ломает базовые сетевые операции
- Разрешите специфичные типы: Типы 1-3 (ошибки), 128-129 (ping), 133-136 (NDP) обязательны
- Никогда не блокируйте Тип 2: Сообщения Packet Too Big критичны для Path MTU Discovery
- Используйте hop limit 255 для NDP: Предотвращает подмену neighbor discovery вне канала
- Применяйте ко всем семействам протоколов: Не забудьте настроить и iptables, и ip6tables
Перейти к: Необходимые типы ICMPv6 | Примеры для Linux | Распространённые ошибки
Почему IPv6-файрволы отличаются#
В IPv4 ICMP обрабатывает диагностику вроде ping и traceroute. Вы можете полностью заблокировать его, и большинство вещей всё ещё будут работать. ARP работает на уровне 2, DHCP использует UDP, а маршрутизаторы используют выделенные протоколы.
IPv6 объединил эти функции в ICMPv6. Разрешение адресов, обнаружение маршрутизатора и обнаружение дубликатов адресов — всё зависит от специфичных типов ICMPv6. Заблокируйте их, и хосты не смогут найти свой шлюз по умолчанию, соседи не смогут коммуницировать на одном канале, а соединения зависнут при несовпадениях MTU.
Разработчики протокола сделали этот выбор намеренно. ICMPv6 — часть спецификации IPv6, а не диагностическая добавка.
Необходимые типы ICMPv6#
Ваш файрвол должен разрешать эти типы ICMPv6 для базовой функциональности:
| Тип | Название | Цель | Блокировать? |
|---|---|---|---|
| 1 | Destination Unreachable | Порт/протокол закрыт | Нет — ломает TCP |
| 2 | Packet Too Big | Path MTU discovery | НИКОГДА — ломает соединения |
| 3 | Time Exceeded | Достигнут предел хопов | Нет — ломает traceroute |
| 128 | Echo Request | Ping-запрос | Опционально (но зачем?) |
| 129 | Echo Reply | Ping-ответ | Опционально (но зачем?) |
| 133 | Router Solicitation | Найти шлюз по умолчанию | НИКОГДА — ломает связность |
| 134 | Router Advertisement | Анонсы шлюза | НИКОГДА — ломает связность |
| 135 | Neighbor Solicitation | Разрешение адресов (эквивалент ARP) | НИКОГДА — ломает всё |
| 136 | Neighbor Advertisement | Ответы разрешения адресов | НИКОГДА — ломает всё |
Блокировка типов ICMPv6 2, 133, 134, 135 или 136 сломает IPv6-связность тонкими, сложными для отладки способами. Не делайте этого.
Тип 2 (Packet Too Big) заслуживает особого внимания. В IPv6 нет фрагментации на промежуточных маршрутизаторах. Когда пакет превышает path MTU, маршрутизатор отбрасывает его и отправляет назад сообщение Packet Too Big. Заблокируйте это, и соединения зависнут после начального SYN/ACK. Вы проведёте часы, отлаживая, почему HTTPS работает, но большие передачи отказывают.
Примеры для ip6tables в Linux#
Минимальный файрвол хоста#
Для клиентской машины или сервера, который не маршрутизирует трафик:
# Очистить существующие правила
ip6tables -F
ip6tables -X
# Политики по умолчанию
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT
# Разрешить loopback
ip6tables -A INPUT -i lo -j ACCEPT
# Разрешить установленные соединения
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешить необходимый ICMPv6
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 1 -j ACCEPT # Destination Unreachable
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 2 -j ACCEPT # Packet Too Big
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 3 -j ACCEPT # Time Exceeded
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -j ACCEPT # Echo Request
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 129 -j ACCEPT # Echo Reply
# Разрешить neighbor discovery (должен быть link-local с hop limit 255)
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 133 -m hl --hl-eq 255 -j ACCEPT # Router Solicitation
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 134 -m hl --hl-eq 255 -j ACCEPT # Router Advertisement
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 135 -m hl --hl-eq 255 -j ACCEPT # Neighbor Solicitation
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 136 -m hl --hl-eq 255 -j ACCEPT # Neighbor Advertisement
# Разрешить DHCPv6 (если нужно)
ip6tables -A INPUT -p udp --dport 546 -j ACCEPT
# Логировать отброшенные пакеты (опционально)
ip6tables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables-dropped: "Проверка hop limit (--hl-eq 255) предотвращает поддельные пакеты neighbor discovery из источников вне канала. Легитимный neighbor discovery всегда использует hop limit 255.
Серверный файрвол#
Добавьте ваши сервисы после правил ICMPv6:
# SSH
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
# HTTP/HTTPS
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
# DNS (если запускаете DNS-сервер)
ip6tables -A INPUT -p udp --dport 53 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 53 -j ACCEPTSSH-правило использует recent для реализации базового ограничения скорости. После 4 попыток соединения за 60 секунд с одного адреса дополнительные попытки отбрасываются.
Правила пересылки для маршрутизатора#
Для маршрутизаторов или систем, которые пересылают трафик:
ip6tables -P FORWARD DROP
# Разрешить установленные соединения
ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешить пересылку ICMPv6 (критично для PMTUD)
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 1 -j ACCEPT
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 2 -j ACCEPT
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 3 -j ACCEPT
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 128 -j ACCEPT
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 129 -j ACCEPT
# Разрешить внутренней сети доступ к интернету
ip6tables -A FORWARD -i eth1 -o eth0 -j ACCEPTНе пересылайте сообщения neighbor discovery (133-136). Они только link-local.
Примеры для nftables в Linux#
Современные дистрибутивы используют nftables вместо iptables. Синтаксис чище:
# Создать таблицу
nft add table ip6 filter
# Создать цепи
nft add chain ip6 filter input { type filter hook input priority 0\; policy drop\; }
nft add chain ip6 filter forward { type filter hook forward priority 0\; policy drop\; }
nft add chain ip6 filter output { type filter hook output priority 0\; policy accept\; }
# Loopback
nft add rule ip6 filter input iif lo accept
# Установленные соединения
nft add rule ip6 filter input ct state established,related accept
# ICMPv6
nft add rule ip6 filter input icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, echo-request, echo-reply } accept
# Neighbor discovery с проверкой hop limit
nft add rule ip6 filter input icmpv6 type { nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } ip6 hoplimit 255 accept
# SSH с ограничением скорости
nft add rule ip6 filter input tcp dport 22 ct state new limit rate 4/minute accept
# HTTP/HTTPS
nft add rule ip6 filter input tcp dport { 80, 443 } acceptНотация множества ({ 80, 443 }) создаёт одно правило вместо двух, делая набор правил более эффективным.
Windows Firewall#
Windows Firewall включает ICMPv6 по умолчанию для большинства необходимых типов, но вы должны проверить:
# Показать текущие ICMPv6-правила
Get-NetFirewallRule -DisplayName "*ICMPv6*" | Format-Table DisplayName, Enabled, Direction
# Включить весь входящий ICMPv6 (если отключено)
Enable-NetFirewallRule -DisplayName "Core Networking - Destination Unreachable (ICMPv6-In)"
Enable-NetFirewallRule -DisplayName "Core Networking - Packet Too Big (ICMPv6-In)"
Enable-NetFirewallRule -DisplayName "Core Networking - Neighbor Discovery Solicitation (ICMPv6-In)"
Enable-NetFirewallRule -DisplayName "Core Networking - Neighbor Discovery Advertisement (ICMPv6-In)"
Enable-NetFirewallRule -DisplayName "Core Networking - Router Advertisement (ICMPv6-In)"
# Разрешить SSH-сервер на IPv6
New-NetFirewallRule -DisplayName "SSH (IPv6)" -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow -Profile Any -RemoteAddress AnyДля веб-серверов:
New-NetFirewallRule -DisplayName "HTTP (IPv6)" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
New-NetFirewallRule -DisplayName "HTTPS (IPv6)" -Direction Inbound -Protocol TCP -LocalPort 443 -Action AllowОблачные группы безопасности#
AWS#
Security groups stateful и автоматически разрешают обратный трафик установленных соединений. Добавьте явные правила для:
- ICMPv6: Используйте «All ICMPv6» или выберите специфичные типы
- Сервисы: Добавьте ваши TCP/UDP-порты
Azure#
Network Security Groups (NSG) обрабатывают IPv6. Правила по умолчанию разрешают исходящий и установленный трафик. Добавьте входящие правила для сервисов.
GCP#
Правила файрвола поддерживают IPv6. Создайте отдельные правила с --source-ranges=::/0 для IPv6. Правила по умолчанию не включают ICMPv6, поэтому добавьте его явно.
Все три провайдера требуют сначала включить IPv6 на VPC/сети. IPv6 не включён по умолчанию.
Распространённые ошибки#
Блокировка всего ICMPv6#
Самая распространённая ошибка IPv6-файрвола. Администраторы портируют IPv4-правила, которые блокируют весь ICMP, и удивляются, почему IPv6 не работает. Если вы запомните только одно из этой статьи: никогда не блокируйте весь ICMPv6.
Отсутствие правил IPv6-файрвола#
Некоторые администраторы тщательно настраивают iptables, но полностью игнорируют ip6tables. IPv6 тогда полностью открыт. Оба семейства протоколов нуждаются в правилах файрвола.
Забывание фильтрации исходящих#
Большинство примеров показывают только входящие правила. Если вы реализуете строгую фильтрацию исходящих (а вы должны), разрешите исходящие типы ICMPv6 133, 135 и 128. Блокировка исходящих neighbor solicitations предотвращает разрешение соседей хостом.
Неправильный Hop Limit для Neighbor Discovery#
Принятие пакетов neighbor discovery без проверки hop limit (255) позволяет атакующим отправлять поддельные router или neighbor advertisements откуда угодно из интернета. Всегда проверяйте hop limit.
Разрешение слишком многого#
Включение «all ICMPv6» безопаснее, чем полная блокировка, но всё ещё избыточно. Вам не нужно разрешать сообщения Multicast Listener Discovery из интернета, например. Используйте специфичные типы.
Тестирование вашего файрвола#
После настройки правил проверьте базовую связность:
# Тест ping (требует типы ICMPv6 128/129)
ping6 -c 3 2001:4860:4860::8888
# Тест path MTU discovery (требует тип ICMPv6 2)
# Отправить большой пакет, проверить, что не зависает
curl -6 -v https://ipv6.google.com/
# Проверить neighbor discovery (требует типы 135/136)
ip -6 neigh show
# Проверить маршруты (требует типы 133/134)
ip -6 route showС другого хоста протестируйте, что неавторизованные порты действительно заблокированы:
# Должно зависнуть или вернуть «Connection refused»
telnet -6 your:server::address 23
# Должно работать (если SSH разрешён)
ssh -6 your:server::addressИспользуйте онлайн-сканеры, такие как IPv6 Port Scanner (ipv6-tools.com) или test-ipv6.com, для проверки вашего файрвола из внешних сетей.
Связанные статьи#
- Безопасность IPv6 — Поймите более широкие соображения безопасности для IPv6-сетей
- Включение IPv6 — Научитесь настраивать IPv6 на ваших устройствах перед установкой правил файрвола
IPv6-файрволы требуют понимания того, что делает ICMPv6. Протокол не опционален и не только для диагностики. Разрешите необходимые типы, проверьте, что neighbor discovery работает, и протестируйте path MTU discovery с реальным трафиком. Сделайте это правильно, и ваш IPv6-файрвол будет одновременно безопасным и функциональным.