ping6.net
Безопасность

Конфигурация IPv6-файрвола: необходимые правила

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

ping6.net14 декабря 2024 г.9 min read
IPv6файрволбезопасностьiptablesnftablesICMPv6

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 для базовой функциональности:

ТипНазваниеЦельБлокировать?
1Destination UnreachableПорт/протокол закрытНет — ломает TCP
2Packet Too BigPath MTU discoveryНИКОГДА — ломает соединения
3Time ExceededДостигнут предел хоповНет — ломает traceroute
128Echo RequestPing-запросОпционально (но зачем?)
129Echo ReplyPing-ответОпционально (но зачем?)
133Router SolicitationНайти шлюз по умолчаниюНИКОГДА — ломает связность
134Router AdvertisementАнонсы шлюзаНИКОГДА — ломает связность
135Neighbor SolicitationРазрешение адресов (эквивалент ARP)НИКОГДА — ломает всё
136Neighbor 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 ACCEPT

SSH-правило использует 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-файрвол будет одновременно безопасным и функциональным.