Tunel ipv6: montando un tunel 6in4 en Linux

Hoy les traigo una pequeña pero interesante prueba de concepto para los amantes del networking y las redes TCP/IP. Cómo montar un tunel IPv6 6in4 para poder enviar tráfico IPv6 sobre una red IPv4.

Hace un tiempo estuve dando unas charlas sobre introducción teórica y práctica a IPv6 para CLA, pueden ver los videos en https://juncotic.com/webinars-introduccion-a-ipv6/

Como todos sabemos, IPv6 es el futuro de las comunicaciones en Internet, IPv4, el estandar IP que utilizamos todo el tiempo en la actualidad tiene sus días contados, y en breve los ISP’s comenzarán a implementar mecanismos de migración a ipv6.

Los sistemas operativos de la actualidad soportan, en general, dual-stack, lo que significa que poseen tanto soporte para IPv4 como IPv6. Nuestro querido Linux, por supuesto, soporta dual stack por defecto.

Suponiendo que tenemos equipos en nuestra red, o en Internet, que están conectados vía IPv4, como seguramente ocurrirá, es una limitación si queremos conectarnos y probar herramientas diseñadas para IPv6, o que tengan soporte.

Para ello, en esta pequeña prueba de concepto vamos a montar un túnel 6in4 entre dos equipos Linux que, en mi caso particular, son máquinas virtuales, pero que tranquilamente puede funcionar entre dos direcciones IPv4 públicas en la red.

Prueba de concepto: tunel ipv6 6in4

El siguiente esquema ilustra el caso:

6in4 tunel ipv6

Disponemos de un host con dirección 10.0.0.30/24 en un extremo, y otro con dirección 10.0.0.60/24 en el otro, comunicados por ipv4 naturalmente.

Como se apreciará, también cada host dispone de su dirección de link global ipv6 que, al no tener una red ipv6 configurada con routers intermedios que encaminen el tráfico, no podrán conectarse entre si.

Lo que haremos es montar un túnel SIT entre los dos hosts, y enrutaremos el tráfico ipv6 que viaje entre ellos por medio de la interfaz del túnel.

Manos a la obra

Analicemos los siguientes comandos ejecutados en el host 10.0.0.30:

En la línea 1 creamos el túnel, llamado net6tun a elección, de tipo sit, con direccionamiento público ipv4, es decir, indicamos cuál es la dirección del host local y la del host remoto.

En la línea 2 levantamos la interfaz net6tun recién salida del horno.

En la línea 3 asociamos la dirección IPv6 de nuestro host a la interfaz del túnel.

Y finalmente en la línea 4 enrutamos todo el tráfico ipv6 con salida a la red por medio de la interfaz del túnel.

Por supuesto, es una prueba de concepto, algunos parámetros pueden cambiar en la realidad según las necesidades que tengamos.

Si nos fijamos ahora en la salida del comando “ip a” veremos algo similar a esto:

Vemos que tenemos configuración de red con la interfaz net6tun con los direccionamientos de túnel, y el direccionamiento ipv6 seteado, mientras que en la tabla de enrutamiento vemos que tódo el tráfico ipv6 por defecto (default) se enruta en la interfaz net6tun.

Hecho esto, repitamos los pasos en el host 10.0.0.60 cambiando, por supuesto, las direcciones ip de lugar. Aquí los comandos:

Y veamos la configuración final, tanto de direccionamiento como de enrutamiento:

Probando el túnel

Ahora la prueba de fuego, el ping6.

ping es la herramienta de testeo universal (siempre que el tráfico ICMP no esté filtrado xD).

Ping6 es el comando que nos va a permitir enviar tráfico por dentro del tunel.

Lo que haremos, en el host 10.0.0.30, ejecutaremos un comando ping que envíe mensajes echo-request en ICMPv6, es decir, icmp encapsulado en IPv6, que a su vez, irá encapsulado en IPv4, no es emocionante? :’)

Al parecer el ping funciona!

Vayamos ahora al host 10.0.0.60 y veamos qué pasa por el cable. Veamos qué trafico podemos capturar en la interfaz del tunel:

Efectivamente, viaja tráfico direccionado en IPv6, que dentro lleva mensajes ICMPv6 de echo-request y sus respuestas, echo-reply. Nótese las direcciones ipv6 de origen y destino y compárelas con las de las configuraciones.

Y finalmente, lo más interesante, capturemos tráfico en la interfaz eth0, la interfaz física que conecta nuestro equipo 10.0.0.60 a la red, o a Internet:

He filtrado algunas salidas de puerto 22 y otras yerbas para que no me ensucie de basura lo que realmente me interesa, lo que se ve en pantalla. Como se aprecia, tenemos tráfico IPv4 direccionado entre los hosts 10.0.0.30 y 10.0.0.60, que adentro lleva paquetes de protocolo número 41, es decir, IPv6. De esta forma se aprecia que tenemos en el stack tcp/ip paquetes de IPv4 que encapsulan paquetes de IPv6.

Los paquetes IPv6 son los mismos que vimos antes, pero ahora “metidos” dentro de paquetes IPv4. El paquete IPv6 a su vez encapsula los mensajes ICMPv6.

Gráficamente, podríamos dibujarlo así:

6in4scheme tunel ipv6

Espero que les sirva! Compartan si les pareció interesante!!

Hasta la próxima!!