Un túnel es una técnica que encapsula un protocolo dentro de otro, haciendo que una comunicación, que de por sí no es posible, se haga realidad. Por ejemplo podemos hacer que dos equipos que funcionan bajo IPv4 e IPv6, puedan comunicarse entre ellos con ambos protocolos, aún cuando están separados por un router que es capaz de enrutar únicamente IPv4. Existen tres tipos de túneles:
- IPIP: Únicamente puede encapsular tráfico unicast, y además solamente permite "tunelizar" IPv4 sobre IPv4.
- SIT: Este tipo de túnel encapsula tráfico IPv6 sobre IPv4 además permite transmitir tanto en unicast como multicast.
- GRE: Este es el tipo de túnel más "dinámico" y más completo, ya que permite encapsular tanto IPv4 como IPv6 sobre IPv4: permitiendo además también transmitirlo tanto en unicast como en multicast.
Teniendo en cuenta que el túnel GRE es el más completo, nos centraremos sobre éste, si bien hay que tener en cuenta que la creación de los otros dos túneles sería muy similar a la de uno del tipo GRE, con la diferencia de que en estos dos casos habría que tener en cuenta las limitaciones de dichos túneles.
Antes de crear el túnel en cuestión, veamos el siguiente diagrama con el fin de ponernos en situación;
Lo que tendríamos serían dos equipos, comunicados entre sí por un router que únicamente enruta IPv4, con lo que ambos equipos se comunican vía IPv4 pero no vía IPv6. Con el túnel lo que haríamos sería enviar el paquete con una cabecera IPv4 que sí que sería reconocida por el router haciendo que la comunicación IPv6 sea válida.
Para crear un túnel, sea del tipo que sea, tendremos que recurrir a la utilidad ip; utilidad estándar que está instalada por defecto en el sistema. En el equipo A escribiríamos lo siguiente:
- ip tunnel add tunel1 mode gre remote 192.168.2.10 local 192.168.1.10
- ip link set tunel1 up
- ip addr add fe80::d0:ffff:351e:1/64 dev tunel1
- ip route add ::/0 dev tunel1
Los comandos introducidos harían lo siguiente:
- Con el primer comando estaríamos creando un túnel de tipo GRE entre nuestra IP local 192.168.1.10 y la IP remota 192.168.2.10.
- Con el segundo comando, activamos dicho túnel, ya que por defecto estaría desactivado. Tras levantar dicho túnel, podríamos verlo como si fuese una interfaz de red más con el comando ifconfig.
- El tercer comando asigna una IP al túnel en cuestión; IP que sería nuestra IPv6.
- Por último, le pondríamos un gateway al túnel en cuestión.
En el equipo B, habría que hacer lo mismo, pero realizando el túnel a la inversa y asignando la IP correspondiente a la interfaz del túnel en cuestión.
- ip tunnel add tunel1 mode gre remote 192.168.1.10 local 192.168.2.10
- ip link set tunel1 up
- ip addr add fe80::d0:ffff:351e:2/64 dev tunel1
- ip route add ::/0 dev tunel1
Gracias a esta configuración, tendríamos un túnel GRE completamente operativo, pudiendo hacer ping (o cualquier otra acción) entre ambas IPv6 sin impedimento alguno, cosa que sin dicho túnel no habría sido posible.
En caso de querer eliminar nuestro túnel tendríamos que primero deshabilitar dicho túnel, para después borrarlo, lo cual se realizaría tal que así:
- ip routedel ::/0dev tunel1
- ip addrdel fe80::d0:ffff:351e:2/64dev tunel1
- ip link set tunel1 down
- ip tunnel del tunel1
Como podéis ver, los túneles son un recurso que pueden resultarnos de gran utilidad, ya que pueden hacer que conexiones "imposibles" puedan hacerse realidad; en caso de querer tener un túnel permanente, simplemente habría que realizar un script de arranque con las ordenes atrás mostradas; algo tan sencillo como (por ejemplo) crear el script tunelling.sh en /etc/init.d,/ con el siguiente contenido:
- #!/bin/bash
- # Inicia o para el tunel
- ### BEGIN INIT INFO
- # Provides: tunel
- # Required-Start: $network $remote_fs $syslog $time
- # Required-Stop: $network $remote_fs $syslog $time
- # Default-Start: 2 3 4 5
- # Default-Stop: 0 1 6
- # Short-Description: Iniciador/parador tuneles
- # Description: Script para arrancar o parar un tunel que se incluye en el arranque
- ### END INIT INFO
- case "$1" in
- start) echo "Iniciando tunel"
- ip tunnel add tunel1 mode gre remote 192.168.1.10 local 192.168.2.10
- ip link set tunel1 up
- ip addr add fe80::d0:ffff:351e:2/64 dev tunel1
- ip route add ::/0 dev tunel1
- ;;
- stop) echo "Eliminando tunel"
- ip route del ::/0 dev tunel1
- ip addr del fe80::d0:ffff:351e:2/64 dev tunel1
- ip link set tunel1 down
- ip tunnel del tunel1
- ;;
- *) echo "Uso: /etc/init.d/tunelling.sh {start|stop|}"
- exit 2
- ;;
- esac
- exit 0
Dicho script tendría que tener permisos de ejecución y estar incluido en el arranque, cosa que haríamos mediante el uso del comando chmod (para darle dichos permisos) e insserv (para el arranque):
- chmod +x /etc/init.d/tunelling.sh
- innserv tunelling.sh
Gracias a esto no tendríamos un script que automatizaría el hecho de crear o destruir el túnel, sino que haríamos que dicho script se arrancase por defecto en el arranque, ahorrándonos la tediosa tarea de tener que "levantar" dicho túnel en cada arranque. Obviamente, el otro extremo del túnel tendría que tomar una medida similar con el fin de que el túnel se realice con éxito.
Espero que os haya resultado útil.
Saludos.