Montar una VPN full-mesh con tinc

Una Red Privada Virtual (VPN en inglés) permite conectar varias redes entre sí, utilizando un medio público (potencialmente inseguro) como puede ser Internet. Las ventajas son multiples. Todos los equipos de cada red se pueden “ver” entre sí, utilizando direcciones de red privadas, que de otra forma no serían enrutables a través de Internet. Nos olvidamos del NAT, de la redirección de puertos, etc.

Hasta hace poco, solo había trabajado con OpenVPN. Es facil de configurar, y en la versión 2 habían incorporado el modo cliente-servidor, de forma que podíamos tener 1 servidor que interconectase a n clientes, con sus correspondientes redes.

Hasta aquí bien, aunque más de uno se dará cuenta del problema, y es que como te falle el servidor, la VPN se cae. Además, y esto también es importante en términos de latencia y ancho de banda, las comunicaciones entre clientes las enruta el servidor. No hay canreinvite en OpenVPN ;)

La solución que se viene a la cabeza, es que todos los nodos sean servidores. Correcto. Pero el problema entonces viene por la escasa escalabilidad de la solución. Por cada nodo adicional que añadas a la VPN, tienes que configurar n+1 nodos (los n que ya había más el nuevo). Con 3 o 4 nodos se lleva bien, pero a partir de ahi olvídate.

Full-Mesh VPN

Y un día, buscando cómo hacía otra gente las VPN full-mesh (todos los nodos conectados directamente entre sí), descubrí tinc. Entre sus características:

  1. Encryption, authentication and compression. Nada nuevo, encriptación para que nuestra información viaje segura por el medio inseguro (Internet). Autenticación, para que nodos desconocidos no puedan inyectar tráfico en nuestra red. Compresión, que nos permite sacar un poco más de partido a nuestra ADSL, comprimiendo los paquetes, antes de enviarlos.
  2. Automatic full mesh routing. Aquí empieza lo bueno. Cada nodo en tinc se intercambia información de enrutamiento con el resto de nodos, de forma que cada uno se hace responsable de su subred (nodoa 192.168.0.0/24, nodob 192.168.1.0/24, etc). Cuando queremos acceder a una red en concreto, tinc contacta si puede con el nodo responsable de esa subred. Si no, utiliza un nodo intermedio para ello.
  3. Easily expand your VPN. Para añadir un nuevo nodo, solo tenemos que configurar 2 nodos. El nuevo y uno de los que ya esté funcionando. Como la información de rutado se propagará por el resto de nodos automáticamente, esta es la configuración mínima que tendremos que hacer. Por supuesto, si configuramos dos o tres nodos, la VPN ganara en fiabilidad y robustez.

Escenario

Tenemos 3 sedes, cada una con su red privada y un acceso a internet:

  • Sede A: 192.168.1.0/24. IP pública en Internet: 1.2.3.4
  • Sede B: 192.168.2.0/24. IP pública en Internet: 2.3.4.5
  • Sede C: 192.168.3.0/24. IP pública en Internet: 3.4.5.6

La máquina linux que corre tinc está siempre en la IP acabada en .1: 192.168.1.1, 192.168.2.1, 192.168.3.1.

En este ejemplo, por ser la configuración más común, la IP pública está asignada a un router ADSL. En este router, tendremos que configurar una nueva ruta, de forma que todo lo que llegue con destino a las otras sedes, se enrute por nuestro tinc. Algo como “route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1″. También abriremos el puerto 655 (TCP y UDP) redirigiéndolo a nuestra máquina con tinc.

Configuración

Creamos los directorios de configuración:

# mkdir /etc/tinc
# mkdir /etc/tinc/hosts

Creamos el fichero /etc/tinc/tinc.conf

Name = SedeA
Device = /dev/net/tun
ConnectTo = SedeB
ConnectTo = SedeC

Creamos el fichero /etc/tinc/hosts/SedeA

Subnet = 192.168.1.0/24
Address = 1.2.3.4
Compression = 10

Generamos el par de claves para este nodo:

# tincd -K
Generating 1024 bits keys:
..............++++++ p
..............++++++ q
Done.
Please enter a file to save private RSA key to [/etc/tinc/rsa_key.priv]:
Please enter a file to save public RSA key to [/etc/tinc/hosts/SedeA]:
Appending key to existing contents.
Make sure only one key is stored in the file.

Ahora configuramos el interfaz tun0. Tinc llamará al script “/etc/tinc/tinc-up” al arrancar:

#!/bin/sh
ifconfig $INTERFACE 192.168.1.1 netmask 255.255.0.0

Marcamos el fichero como ejecutable:

# chmod +x /etc/tinc/tinc-up

Repetimos el proceso con las otras dos sedes, y como paso final, intercambiamos los ficheros SedeA, SedeB y SedeC entre todos los nodos, para que todos ellos se conozcan entre sí.

Finalmente, ejecutamos el demonio:

tincd

O si queremos depurar algun problema, lo ejecutamos con depuración y sin desconectarse de la consola:

tincd -d5 -D

Si todo va bien, desde cualquier equipo de la red podremos hacer ping a cualquier otro, aunque sea de otra sede:

Suerte.

Julián J. Menéndez

Actualización 08-09-2007: La versión de tinc en el respositorio ipkg de openwrt es la 1.0.4. La versión a día de hoy es la 1.0.8. Podéis encontrar el paquete para esta versión aquí: http://augsburg.freifunk.net/ipkg/

Escrito por julianjm el 6/09/2007. | Comments (48)
Tags: , ,