ping6.net
Seguridad

Configuración de firewall IPv6: Reglas esenciales

Configura tu firewall para IPv6 sin romper la conectividad. Reglas ICMPv6 esenciales, ejemplos para Linux y errores comunes a evitar.

ping6.net14 de diciembre de 202410 min read
IPv6firewallseguridadiptablesnftablesICMPv6

Los firewalls IPv4 te permiten bloquear ICMP sin consecuencias mayores. IPv6 no funciona así. Bloquea los mensajes ICMPv6 incorrectos y romperás el descubrimiento de MTU de ruta, descubrimiento de vecinos y conectividad básica. Tu firewall causará silenciosamente fallos de conexión que toman horas depurar.

TL;DR - Resumen rápido

Puntos clave:

  • ICMPv6 es esencial: A diferencia de ICMP IPv4, bloquear ICMPv6 rompe operaciones básicas de red
  • Permite tipos específicos: Tipos 1-3 (errores), 128-129 (ping), 133-136 (NDP) son requeridos
  • Nunca bloquees Tipo 2: Los mensajes Packet Too Big son críticos para Path MTU Discovery
  • Usa hop limit 255 para NDP: Previene spoofing fuera de enlace del descubrimiento de vecinos
  • Aplica a todas las familias de protocolos: No olvides configurar tanto iptables como ip6tables

Ir a: Tipos ICMPv6 esenciales | Ejemplos Linux | Errores comunes


Por qué los firewalls IPv6 son diferentes#

En IPv4, ICMP maneja diagnósticos como ping y traceroute. Puedes bloquearlo completamente y la mayoría de las cosas siguen funcionando. ARP funciona en capa 2, DHCP usa UDP y los routers usan protocolos dedicados.

IPv6 fusionó estas funciones en ICMPv6. Resolución de direcciones, descubrimiento de router y detección de direcciones duplicadas dependen de tipos ICMPv6 específicos. Bloquéalos y los hosts no pueden encontrar su gateway predeterminado, los vecinos no pueden comunicarse en el mismo enlace y las conexiones se cuelgan cuando ocurren desajustes de MTU.

Los diseñadores del protocolo hicieron esta elección deliberadamente. ICMPv6 es parte de la especificación IPv6, no un complemento de diagnóstico.

Tipos ICMPv6 esenciales#

Tu firewall debe permitir estos tipos ICMPv6 para funcionalidad básica:

TipoNombrePropósito¿Bloquear?
1Destino inalcanzablePuerto/protocolo cerradoNo - rompe TCP
2Paquete demasiado grandeDescubrimiento de MTU de rutaNUNCA - rompe conexiones
3Tiempo excedidoLímite de saltos alcanzadoNo - rompe traceroute
128Solicitud de ecoSolicitud de pingOpcional (¿pero por qué?)
129Respuesta de ecoRespuesta de pingOpcional (¿pero por qué?)
133Solicitud de routerEncontrar gateway predeterminadoNUNCA - rompe conectividad
134Anuncio de routerAnuncios de gatewayNUNCA - rompe conectividad
135Solicitud de vecinoResolución de direcciones (equivalente ARP)NUNCA - rompe todo
136Anuncio de vecinoRespuestas de resolución de direccionesNUNCA - rompe todo

Bloquear tipos ICMPv6 2, 133, 134, 135 o 136 romperá la conectividad IPv6 de formas sutiles y difíciles de depurar. No lo hagas.

El tipo 2 (Paquete demasiado grande) merece atención especial. IPv6 no tiene fragmentación en routers intermedios. Cuando un paquete excede el MTU de ruta, el router lo descarta y envía de vuelta un mensaje Paquete demasiado grande. Bloquea esto y las conexiones se cuelgan después del SYN/ACK inicial. Pasarás horas depurando por qué HTTPS funciona pero las transferencias grandes fallan.

Ejemplos de ip6tables para Linux#

Firewall mínimo de host#

Para una máquina cliente o servidor que no enruta tráfico:

# Limpiar reglas existentes
ip6tables -F
ip6tables -X
 
# Políticas predeterminadas
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT
 
# Permitir loopback
ip6tables -A INPUT -i lo -j ACCEPT
 
# Permitir conexiones establecidas
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# Permitir ICMPv6 esencial
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 1 -j ACCEPT   # Destino inalcanzable
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 2 -j ACCEPT   # Paquete demasiado grande
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 3 -j ACCEPT   # Tiempo excedido
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -j ACCEPT # Solicitud de eco
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 129 -j ACCEPT # Respuesta de eco
 
# Permitir descubrimiento de vecinos (debe ser link-local con límite de saltos 255)
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 133 -m hl --hl-eq 255 -j ACCEPT # Solicitud de router
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 134 -m hl --hl-eq 255 -j ACCEPT # Anuncio de router
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 135 -m hl --hl-eq 255 -j ACCEPT # Solicitud de vecino
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 136 -m hl --hl-eq 255 -j ACCEPT # Anuncio de vecino
 
# Permitir DHCPv6 (si es necesario)
ip6tables -A INPUT -p udp --dport 546 -j ACCEPT
 
# Registrar paquetes descartados (opcional)
ip6tables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables-dropped: "

La verificación de límite de saltos (--hl-eq 255) previene paquetes de descubrimiento de vecinos suplantados desde fuentes fuera del enlace. El descubrimiento de vecinos legítimo siempre usa límite de saltos 255.

Firewall de servidor#

Añade tus servicios después de las reglas 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 (si ejecutas un servidor DNS)
ip6tables -A INPUT -p udp --dport 53 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 53 -j ACCEPT

La regla SSH usa recent para implementar limitación de tasa básica. Después de 4 intentos de conexión en 60 segundos desde la misma dirección, los intentos adicionales se descartan.

Reglas de reenvío de router#

Para routers o sistemas que reenvían tráfico:

ip6tables -P FORWARD DROP
 
# Permitir conexiones establecidas
ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# Permitir reenvío ICMPv6 (crítico para 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
 
# Permitir red interna para acceder a internet
ip6tables -A FORWARD -i eth1 -o eth0 -j ACCEPT

No reenvíes mensajes de descubrimiento de vecinos (133-136). Esos son solo link-local.

Ejemplos de nftables para Linux#

Las distribuciones modernas usan nftables en lugar de iptables. La sintaxis es más limpia:

# Crear tabla
nft add table ip6 filter
 
# Crear cadenas
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
 
# Conexiones establecidas
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
 
# Descubrimiento de vecinos con verificación de límite de saltos
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 con limitación de tasa
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

La notación de conjunto ({ 80, 443 }) crea una regla en lugar de dos, haciendo el conjunto de reglas más eficiente.

Firewall de Windows#

Windows Firewall habilita ICMPv6 por defecto para la mayoría de los tipos esenciales, pero debes verificar:

# Mostrar reglas ICMPv6 actuales
Get-NetFirewallRule -DisplayName "*ICMPv6*" | Format-Table DisplayName, Enabled, Direction
 
# Habilitar todo ICMPv6 entrante (si está deshabilitado)
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)"
 
# Permitir servidor SSH en IPv6
New-NetFirewallRule -DisplayName "SSH (IPv6)" -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow -Profile Any -RemoteAddress Any

Para servidores web:

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

Grupos de seguridad en la nube#

AWS#

Los grupos de seguridad tienen estado y permiten tráfico de retorno establecido automáticamente. Añade reglas explícitas para:

  • ICMPv6: Usa "All ICMPv6" o selecciona tipos específicos
  • Servicios: Añade tus puertos TCP/UDP

Azure#

Los grupos de seguridad de red (NSGs) manejan IPv6. Las reglas predeterminadas permiten tráfico saliente y establecido. Añade reglas entrantes para servicios.

GCP#

Las reglas de firewall soportan IPv6. Crea reglas separadas con --source-ranges=::/0 para IPv6. Las reglas predeterminadas no incluyen ICMPv6, así que añádelo explícitamente.

Los tres proveedores requieren que habilites IPv6 en la VPC/red primero. IPv6 no está habilitado por defecto.

Errores comunes#

Bloquear todo ICMPv6#

El error de firewall IPv6 más común. Los administradores portan reglas IPv4 que bloquean todo ICMP y se preguntan por qué IPv6 no funciona. Si solo recuerdas una cosa de este artículo: nunca bloquees todo ICMPv6.

Sin reglas de firewall IPv6#

Algunos administradores configuran iptables cuidadosamente pero ignoran ip6tables completamente. IPv6 entonces está completamente abierto. Ambas familias de protocolos necesitan reglas de firewall.

Olvidar el filtrado de egreso#

La mayoría de los ejemplos muestran solo reglas de ingreso. Si implementas filtrado de egreso estricto (deberías), permite tipos ICMPv6 salientes 133, 135 y 128. Bloquear solicitudes de vecino salientes previene que el host resuelva vecinos.

Límite de saltos incorrecto en descubrimiento de vecinos#

Aceptar paquetes de descubrimiento de vecinos sin verificar límite de saltos (255) permite que atacantes envíen anuncios de router o vecino suplantados desde cualquier lugar en internet. Siempre verifica límite de saltos.

Permitir demasiado#

Habilitar "todo ICMPv6" es más seguro que bloquearlo todo, pero sigue siendo excesivo. No necesitas permitir mensajes de Multicast Listener Discovery desde internet, por ejemplo. Usa tipos específicos.

Probar tu firewall#

Después de configurar reglas, verifica conectividad básica:

# Probar ping (requiere tipos ICMPv6 128/129)
ping6 -c 3 2001:4860:4860::8888
 
# Probar descubrimiento de MTU de ruta (requiere tipo ICMPv6 2)
# Enviar paquete grande, verificar que no se cuelgue
curl -6 -v https://ipv6.google.com/
 
# Verificar descubrimiento de vecinos (requiere tipos 135/136)
ip -6 neigh show
 
# Verificar rutas (requiere tipos 133/134)
ip -6 route show

Desde otro host, prueba que los puertos no autorizados estén realmente bloqueados:

# Debería agotar tiempo o devolver "Connection refused"
telnet -6 tu:servidor::direccion 23
 
# Debería funcionar (si SSH está permitido)
ssh -6 tu:servidor::direccion

Usa escáneres en línea como IPv6 Port Scanner (ipv6-tools.com) o test-ipv6.com para verificar tu firewall desde redes externas.


Los firewalls IPv6 requieren entender qué hace ICMPv6. El protocolo no es opcional o solo para diagnósticos. Permite los tipos esenciales, verifica que el descubrimiento de vecinos funcione y prueba el descubrimiento de MTU de ruta con tráfico real. Hazlo bien y tu firewall IPv6 será tanto seguro como funcional.