5.3. Túneles GRE

GRE es un protocolo de tunelizado que desarrolló Cisco originalmente, y que puede hacer unas cuántas cosas más que los túneles IP-sobre-IP. Por ejemplo, puede transportar tráfico multicast e IPv6 sobre un túnel GRE.

En Linux, necesitará el módulo ip_gre.o.

5.3.1. Túneles IPv4

Primero hagamos un túnel IPv4:

Digamos que tenemos 3 redes: las redes internas A y B, y una red intermedia C (por ejemplo, Internet).

De manera que tenemos la red A:

network 10.0.1.0
netmask 255.255.255.0
router  10.0.1.1
El router tiene la dirección 172.16.17.18 en la red C. Llamaremos a esta red neta (ok, no es muy original)

Y la red B:

network 10.0.2.0
netmask 255.255.255.0
router  10.0.2.1
El router tiene la dirección 172.19.20.21 en la red C. Llamemos a esta red netb (seguimos con nuestra originalidad)

Hasta donde concierne a la red C, asumiremos que dejará pasar los paquetes enviados de A a B y vicebersa. Cómo y por qué, no nos interesa.

En el router de la red A, haremos lo siguiente:

ip tunnel add netb mode gre remote 172.19.20.21 local 172.16.17.18 ttl 255
ip link set netb up
ip addr add 10.0.1.1 dev netb
ip route add 10.0.2.0/24 dev netb

Miremos esto con más atención. En la línea 1, hemos añadido un dispositivo de túnel, y le hemos llamado netb (bastante obvio porque es a donde queremos llegar). Más aún, le hemos dicho que use el protocolo GRE (mode gre), que la dirección remota es 172.19.20.21 (el router en el otro extremo), que nuestros paquetes de túnel deberían ser originados por 172.16.17.18 (lo que permite a nustro router tener varias direcciones IP en la red C y decidir cual usar para el tunelizado) y que el campo TTL del paquete debería establecerse en 255 (ttl 255).

La segunda línea habilita el dispositivo.

En la tercera línea le hemos dado a la recién nacida interfaz netb la dirección 10.0.1.1. Esto está bien para redes pequeñas, pero cuando empiece una expedición de zapadores (MUCHOS túneles), quizá debiera considerar usar otro rango de IP para las interfaces de túneles (en este ejemplo, podría usar 10.0.3.0).

En la cuarta línea hemos establecido la ruta hacia la red B. Fíjese la notación diferente para la máscara de red. Si no está familiarizado con esta notación, así es como funciona: escriba la máscara de red en forma binaria, y cuente todos los unos. Si no sabe cómo hacerlo, limítese a recordar que 255.0.0.0 es /8, 255.255.0.0 es /16 y 255.255.255.0 es /24. Ah, y 255.255.254.0 es /23, en caso de que tuviera curiosidad.

Pero ya hemos tenido bastante de esto; veamos el router de la red B.

ip tunnel add neta mode gre remote 172.16.17.18 local 172.19.20.21 ttl 255
ip link set neta up
ip addr add 10.0.2.1 dev neta
ip route add 10.0.1.0/24 dev neta
Y cuando vaya a eliminar el túnel del router A:
ip link set netb down
ip tunnel del netb
Por supuesto, puede cambiar netb por neta para el router B.

5.3.2. Túneles IPv6

Vea la sección 6 si quiere una pequeña introducción a las direcciones IPv6.

Vamos con los túneles.

Asumamos que tiene la siguiente red IPv6, y que quiere conectarse a la 6bone, o con un amigo.

Red 3ffe:406:5:1:5:a:2:1/96
Su dirección IPv4 es 172.16.17.18, y el router 6bone tiene la dirección IPv4 172.22.23.24.

ip tunnel add sixbone mode sit remote 172.22.23.24 local 172.16.17.18 ttl 255
ip link set sixbone up
ip addr add 3ffe:406:5:1:5:a:2:1/96 dev sixbone
ip route add 3ffe::/15 dev sixbone 

Vamos a comentar esto. En la primera línea, hemos creado un dispositivo de túnel llamado sixbone. Le hemos dado modo sit (que es un túnel IPv6 sobre IPv4) y le dijimos dónde debe ir (remote) y de dónde viene (local). TTL se pone al máximo, 255. Después activamos el dispositivo (up). Tras esto, añadimos nuestra propia dirección de red, y establecemos una ruta para 3ffe::/15 (que actualmente es la totalidad de la 6bone) a través del túnel.

Los túneles GRE son actualmente el tipo preferido de túneles. Es un estándar que está ampliamente adoptado fuera de la comunidad de Linux, y por tanto una Cosa Buena.