Thursday, December 3, 2020

Anotaciones sobre IPv6: Tunnelbroker en una red doméstica

Hace unos meses pusimos fibra en casa con un nuevo ISP y, para dar soporte al número de dispositivos que tenemos y a la nueva velocidad, compré un router nuevo de ASUS bastante tocho. Indagando por el panel de administración vi que había una sección para IPv6, el gran olvidado.

Según había leído "por ahí", este ISP soporta IPv6 nativamente, pero luego vi que no es así. Tienen presencia en muchas localidades de distintos tamaños (en algunas incluso dan servicio por coaxial) y la red está muy segmentada; en mi pueblo todo el mundo pasa por CG-NAT y no hay conectividad IPv6 en absoluto. Tras mucho discutir con ellos conseguí que me diesen una dirección IP pública y estática sin pagar.

Volviendo al router, este tiene soporte para varios sistemas de túneles IPv6, entre ellos 6in4, que es el que ofrece gratuitamente Hurricane Electric mediante Tunnelbroker. Es posible que conozcáis HE por su excelente herramienta, el BGP Toolkit. Recuerdo haber jugueteado mucho en el pasado con los túneles de Tunnelbroker. Con unos cuantos comandos en Linux podías configurar un túnel y acceder a servicios de IPv6. La utilidad era (y es) discutible, puesto que no hay prácticamente ningún servicio a día de hoy que sólo esté disponible mediante IPv6. En cierto modo lo único interesante que se podía hacer con ese túnel era cambiarte la dirección IP constantemente para evadir banes en el IRC hasta que encontrabas a un operador competente.

Las cosas que digo en este artículo están basadas en gran parte en mis observaciones y mi intuición, por lo que pueden no ser correctas. 

Pidiendo y configurando el túnel

Esta parte es sencilla: sólo con registrarte en Tunnelbroker tienes la opción de crear un túnel de manera gratuita. El protocolo 6in4 no tiene ningún sistema de autenticación, por lo que la única manera que tiene el servidor de identificarte es mediante tu dirección IPv4. Por lo tanto, al darte de alta tendrás que especificar tu dirección, ser capaz de responder a ping, y tener en cuenta que si la cambias (por ejemplo, porque tengas dirección IP dinámica) tendrás que usar alguno de estos scripts al estilo dyndns para notificar a Tunnelbroker del cambio.

Debes también elegir un servidor de túnel. No hay ninguno disponible en España, por lo que tus mejores opciones son Portugal y Francia. Junto a cada servidor tienes una dirección IP a la que puedes hacer ping/traceroute/etc. Recuerda que la latencia que tendrás no sólo dependerá de tu latencia con el servidor de túnel sino también de la latencia desde el servidor de túnel al servidor final, por lo que Francia, aun estando un poco más lejos que Portugal, podría ser mejor opción para llegar a servidores de Europa Central.

Una vez creado el túnel llegarás a una pantalla con información sobre tu túnel. Es esa la configuración que tendrás que introducir en el panel del router. En este lamentable collage hecho con Paint muestro la equivalencia de las opciones:

Si te has fijado, en la pantalla de información del túnel tienes la opción de pedir un prefijo /48. No es estrictamente necesario, pero lo puedes hacer si te apetece. Rellenar los servidores DNS es opcional (no aparecen en la captura, pero están más abajo). El servidor DNS de IPv4 que estés usando debería responder con los registros AAAA, pero si no lo hace, puedes o bien cambiar a otro servidor DNS de IPv4 que sí lo haga o rellenar los DNS de esta página con el contenido del campo "Anycast IPv6 Caching Nameserver" del túnel.

El router se reiniciará (o no, depende por dónde le dé) y el túnel debería estar funcionando. Lo podemos comprobar usando cualquier web como Test your IPv6, donde deberíamos obtener una puntuación de 10/10.

Uso de IPv6 en la red doméstica: privacidad, direcciones permanentes y temporales

Una de las promesas de IPv6, quizá la principal, es olvidarnos de los puñeteros sistemas de NAT que estamos obligados a usar debido a la escasez de direcciones IP. Lo que quiere esto decir es que ahora todos los dispositivos que están en tu red local tendrán una dirección IP pública (más bien varias, ahora lo veremos) que es accesible para el resto del mundo.

El uso de NAT, CG-NAT y direcciones IP dinámicas ha complicado tradicionalmente el rastreo de los usuarios mediante sus direcciones IP, pero con las direcciones únicas de IPv6, se origina un posible problema de privacidad y seguridad.

(El resto de esta sección está muy, muy simplificado y no es totalmente correcto, pero es lo suficientemente correcto para el nivel del artículo y para no perderme en los detalles).

Como todos sabemos cómo se obtiene una dirección IP con DHCP bajo IPv4 me voy a ahorrar esa parte. Las conexiones residenciales que dan soporte a IPv6, a grandes rasgos, funcionan mediante prefix delegation: tu router habla con tu ISP para recibir un prefijo usando NDP, y luego comunica dicho prefijo a los equipos de tu LAN usando SLAAC. Una vez tus equipos conocen el prefijo que pueden usar, son libres de asignarse las direcciones IPv6 que quieran: una o varias y del valor que les venga en gana.

Antiguamente, muchos equipos tenían la costumbre de usar una sola dirección IPv6 y encima basarla en la dirección MAC de la tarjeta de red, con las implicaciones obvias. Hoy día, lo común en los equipos modernos es que usen dos direcciones IPv6 distintas: la dirección permanente o pública y la dirección temporal, sistema más o menos descrito en el RFC de IPv6 Privacy Extensions. Si usas Windows, puedes ver ambas usando el comando netsh interface ipv6 show addresses:

Interface 8: Wi-Fi

Addr Type  DAD State   Valid Life Pref. Life Address
---------  ----------- ---------- ---------- ------------------------
Public     Preferred        9m58s      9m58s 2001:470:c8f9:0:xxxx:yyyy:zzzz:aaaa
Temporary  Preferred        9m58s      9m58s 2001:470:c8f9:0:a53b:cf29:a6af:e8f3
Other      Preferred     infinite   infinite fe80::xxxx:yyyy:zzzz:aaaa%8

Es decir:

  • La dirección pública o permanente, que está generada de manera pseudo-aleatoria y es única para la tarjeta de red y la red a la que estás conectado. Esta dirección no cambia nunca bajo circunstancias normales, aunque pase el tiempo o reinicies el ordenador o el router. Esta dirección no se usa por defecto para hacer conexiones salientes pero puede recibir conexiones entrantes en todo momento (depende del firewall de tu router, luego hablaré de ello).
  • La dirección temporal, que está generada de manera aleatoria y cambia a intervalos regulares (normalmente un día, pero depende del sistema operativo y su configuración) y cada vez que reconectas a la red. Esta es la dirección que se usa por defecto para conectar a otros equipos (es decir, la que aparecerá si pones en Google "what's my ip", o la que sale cuando entras al IRC) y también puede recibir conexiones entrantes (una vez más, dependiendo del firewall).
  • La dirección de enlace local, que sólo es válida dentro de tu LAN. El %8 se refiere a tu tarjeta de red (ya que si tienes varias, tendrás varias direcciones de enlace local y todas comienzan por fe80).

Si te has fijado bien, ambas direcciones públicas comienzan por 2001:470:c8f9. Esto es así porque ese es el prefijo /48 que mi ISP me ha delegado (bueno, en este caso, Tunnelbroker). Y si te has fijado aún mejor, la dirección de enlace local es igual que la pública cambiando el prefijo de mi ISP por fe80.

De todo esto desprendemos:

  • Ya que la dirección permanente no cambia, conviene no divulgarla a no ser que sea estrictamente necesario. El sistema no la usa por defecto para realizar conexiones salientes, pero puede recibir conexiones entrantes por ella.
  • Si queremos recibir conexiones, tendremos que usar la dirección permanente, ya que la temporal se renueva constantemente y no podremos recibir más conexiones en cuanto esto ocurra. También tenemos la opción de usar direcciones estáticas manuales (más adelante hablaré de ello).
  • El hecho de que se renueve la dirección temporal no quiere decir que todas las conexiones que la estén usando se interrumpan. Si a la hora de renovar la dirección hay conexiones abiertas, dicha IP seguirá existiendo hasta que dichas conexiones se cierren, pero se generará una IP nueva igualmente que se usará para las nuevas conexiones.
    En la salida del comando que he puesto antes se mostrarían también las direcciones que están esperando para morir (en el ejemplo de arriba no hay ninguna).

Direcciones estáticas manuales y firewall

Como dije antes, si bien lo normal es tener dos, cualquier dispositivo puede tener tantas direcciones IP asignadas como quiera. Al contrario que en IPv4, no es el router (mediante el servidor DHCP) el que decide qué dirección va a usar el dispositivo sino el propio dispositivo, por lo que la necesidad de usar direcciones estáticas se desvanece, pero es posible tenerlas si así lo deseas. Por ejemplo, si tienes varios sistemas operativos o si quieres que conteste un dispositivo distinto dependiendo de cuál esté conectado.

El comando para añadir una dirección nueva es netsh interface ipv6 add address Wi-Fi address=ffff:2/64. En mi caso, tal y como vi antes, mi prefijo es 2001:470:c8f9 con longitud 48 por lo que para añadir una IP estática puedo escribir: netsh interface ipv6 add address Wi-Fi address=2001:470:c8f9::1234. Si usamos el comando de "show addresses" que vimos antes podremos ver esta nueva dirección IP junto a la permanente y la temporal.

Como dije más atrás, por defecto el sistema sólo usa la dirección temporal para realizar conexiones salientes. ¿Qué pasa si queremos que las conexiones salientes usen la dirección permanente o una dirección manual? Muchos programas te lo permiten en las opciones. Por ejemplo, el cliente de BitTorrent uTorrent:

Gracias al NAT, no estamos muy acostumbrados a tratar con sistemas de firewall en la configuración de los routers. Lo que coloquialmente conocíamos como "abrir los puertos" no suponía manipular las opciones de un firewall sino crear una redirección de NAT. En IPv6, al ser todas las direcciones públicas, sí se hace necesario un firewall en el router para las conexiones entrantes. En este caso, creo una sencilla regla para permitir conexiones hacia mi servidor HTTP:

Al tratarse de un firewall y no una NAT, es posible abrir el mismo puerto "varias veces". Es decir, no hay problema en tener el puerto 80 abierto en varios dispositivos a la vez, ya que las conexiones no pasan por el NAT sino que van directamente a los equipos. Para comprobar que la regla está bien puesta puedes usar el IPv6 Online Port Scanner (recuerda introducir la dirección IP que añadimos manualmente y no la que te aparecerá en la web, que es la temporal).

Conclusión

No hay.