
Ryan Giobbi nos brinda en Vulnerability Analysis Blog unas rápidas recomendaciones acerca del filtrado ICMPv6 con ip6tables y el firewall de Microsoft Vista.
ICMPv6 es un protocolo que forma parte de IPv6 y está definido en RFC 4443. Ryan Giobbi nos comenta que no es fácil mantener una red IPv6 sin permitir algunos tipos ICMPv6, así que nos muestra algunos pocos ejemplos de cómo filtrar ICMPv6 en las máquinas usando ip6tables y el firewall de Windows Vista.
En un principio hay que considerar alguna recomendación antes de pasar con el análisis del filtrado que puede resumirse en que no se debe usar las reglas directamente en producción sin pasar por test.
Los tipos ICMPv6 listados a continuación pueden ser representados por otras reglas u otros códigos.
Cuando administramos un firewall a través de reglas, la RFC 4890, “Recommendations for Filtering ICMPv6 Messages in Firewalls,” nos facilita el camino. Si miramos la sección 4.4 y sus subsecciones encontramos los tipos ICMPv6 agrupados en cuatro categorías:
Tráfico que no debe ser cortado:
Types 1, 2, 3, 4, 128, 129, 130, 131, 132, 143, 148, 149, 151, 152, 153, 133, 134, 135, 136, 141, 142
Tráfico que normalmente no debería ser cortado:
Types Type 3 - Code 1, Type 4 - Code 0
Tráfico que debería ser cortado siempre y que no necesita especial atención:
Types 138,144,145,146,147
Tráfico al que hay que aplicar la política de empresa:
Types 137, 139, 140, 5-99, 102, 126
Las siguientes reglas aprovechan algunas de las nuevas funcionalidades ofrecidas por IPv6.
Lo primero, como siempre, poner por defecto una política denegatoria ya que sin ella un firewall deja de tener sentido:
ip6tables -P INPUT -j DROP
ip6tables -P OUTPUT -j DROP
En las reglas anteriores estamos cortando el tráfico de entrada y de salida de la máquina en cuestión. Ahora vamos a añadir, poco a poco las reglas para el tráfico que debe ser permitido:
La sección para “Tráfico que no debe ser cortado” nos muestra el echo request (128) y el echo response (129). Llegados a este punto muchos de vosotros os estaréis preguntando que un supuesto atacante usará estos echo request (pings) como ayuda para un ataque de denegación de Servicio (DoS) así que deberíamos bloquear, o al menos limitar, estas peticiones pero, claro, hablando de firewalls software no podemos rechazar las echo request a la máquina porque influiría en la visibilidad de la máquina pero sí que podemos limitar cómo respondemos a esas peticiones:
ip6tables -A INPUT -p icmpv6 --icmpv6-type 128 -m limit --limit 900/min -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type 129 -m limit --limit 900/min -j ACCEPT
Si nuestras máquinas usan DHCPv6 o las IPs son asignadas manualmente junto con la puerta de enlace podemos cortar estas peticiones al router.
Se podría deshabilitar estas peticiones en el kernet usando sysctl y el tráfico sería cortado por la política por defecto:
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type 133 -j REJECT
ip6tables -A INPUT -p icmpv6 --icmpv6-type 134 -j REJECT
El parámetro por defecto en el límite de salto es 255 y se va decrementando uno a uno cada vez que el router envía un paquete. Asumiendo que el router trabaja correctamente, esta regla permitiría sólo los echo request y echo response hacia y desde cada nodo de la red de área local. Usando este valor de límite de salto podemos permitir los tipos de tráfico desde otros nodos conectados al mismo router.
Este valor puede ser ajustado como creas razonablemente. Si sólo quieres usar los echo request y echo response provenientes de nodos vecinos, este campo del límite de saltos puede ser perfectamente válido. Estas reglas restringen el echo request y la respuesta a los paquetes con 255 como límite de salto:
ip6tables -A INPUT -p icmpv6 --icmpv6-type 128 -m limit --limit 900/min -m hl --hl-eq 255 -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type 129 -m limit --limit 900/min -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type 128 -m limit --limit 900/min -m hl --hl-lt 255 -j DROP
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type 129 -m limit --limit 900/min -m hl --hl-let 255 -j DROP
Hablemos ahora del criticado Vista. Como muchos sabéis, por defecto, el firewall de Windows Vista corta los paquetes de entrada y permite los de salida. Trabajemos, ahora, en el filtrado de las reglas “Tráfico en el que la política debería ser definida“.
Usa el siguiente comando para bloquear las redirecciones del router (tipo 137):
netsh advfirewall firewall add rule name "block icmpv6 type 137" dir=i action=block protocol=icmpv6:137,any
El estado por defecto del firewall de Windows Vista no permite especificar el permitir que el tráfico de entrada ICMPv6 pero se puede intentar algo un poco más avanzado. la siguiente regla permite la redirección de mensajes ICMPv6 pero sólo si la máquina está en nuestro dominio. Se podría lograr algo similar con ip6tables, pero solamente usando el script Networkmanager.
netsh advfirewall firewall add rule name "allow icmpv6 type 137 for the domain profile" dir=in action=allow protocol=icmpv6:137,any profile=domain
Esta regla impica que la máquina está logada dentro del dominio y autenticada vía Active Directory.
Para los administradores que estén preocupados por la gestión del ancho de banda la siguiente regla permite los echo request de entrada sólamente en las conexiones wireless:
netsh advfirewall firewall add rule name "allow icmpv6 type 128 when wired" dir=in action=allow protocol=icmpv6:128,any inerfacetype=lan
El firewall de Windows Vista incluye la capacidad de permitir o denegar las conexiones que son autenticadas por el protocolo IPsec utilizado en VPNs:
netsh advfirewall firewall add rule name "allow icmpv6 type 128 when wired" dir=in action=allow protocol=icmpv6:128,any security=authenticate
netsh advfirewall firewall add rule name "allow icmpv6 type 128 when wired" dir=in action=allow protocol=icmpv6:128,any security=authenc
Si quieres aprender más acerca de la configuración del firewall de Windows Vista usando los comandos netsh, puedes darle un vistazo al artículo “Netsh Commands for Windows Firewall with Advanced Security“
Si estás interesado en las reglas ip6tables de Linux puedes echar un vistazo a su entrada man.