TincVPN: Alternativa Libre a Hamachi (Tutorial) [Live 4/06/2014]


Cuando pensamos en la manera fácil de montar una VPN siempre pensamos en Logmein Hamachi. Y aunque es una buena solución, ésta no es recomendable para redes de producción o bien, deployments de alto impacto (al menos no en su versión gratuita). La pregunta es: ¿Podemos librarnos de Hamachi? La respuesta es sí. Para los que no me estén siguiendo hasta ahorita, una VPN es una red privada virtual, o bien, (en términos simples) una LAN segura que puede mantener a miembros de diferentes locaciones geográficas y/o conexiones interconectados dentro de una misma red.

Las VPN son útiles para muchas cosas, pero vienen a ser especialmente prácticas cuando hacemos deployments de servidores con máquinas en diferentes locaciones que por alguna razón deben mantenerse interconectadas como si estuvieran en LAN. La herramienta de la que vamos a hablar hoy se llama TincVPN y viene a cumplir el mismo objetivo que Hamachi pero para uso más profesional. Yo lo uso para mi replica set de mongodb y me ha parecido genial, es algo así como un punto medio entre OpenVPN y LogmeIn Hamachi de cierto modo.

NOTA: En este tutorial usaré máquinas linux como referencia, pero TincVPN funciona bien en Windows/Mac y otras plataformas también.

Para montar tu propia VPN con TincVPN necesitarás:


  • Un nodo universal (con IP pública disponible) que haga de servidor (Un VPS por ejemplo)
  • Clientes para tu red VPN (cualquier máquina que quieras agregar a la VPN)


Pre-Configuraciones

Servidor con IP Pública

Si no tienes acceso a una computadora que haga de servidor (con IP pública) siempre puedes montarte un VPS. Personalmente uso y recomiendo DigitalOcean como proveedor así que ve acá y créate una nueva cuenta. Necesitarás saldo para poder lanzar tu VPS, entonces te recomiendo usar el código de regalo ALLSSD10 (válido por todo Junio 2014) cuando abras tu cuenta para obtener $10 USD de saldo gratuito (más que suficiente, pues sólo necesitaremos el droplet más pequeño para esto). Para más información sobre cómo lanzar tu primer VPS, checa nuestro tutorial sobre el tema en este enlace y vuelve a este post cuando estés listo para continuar con el setup de TincVPN.

Instalar TincVPN

TincVPN está disponible desde el gestor de paquetes oficial de cualquier distribución linux allá afuera en los repos usuales para las mismas. Para instalar Tinc en Fedora/CentOS/RHEL por ejemplo haríamos un:

sudo yum -y install tinc

tanto en los clientes como en el servidor a utilizar.

Comenzamos

NOTA: Cambia myvpn en los comandos/archivos de abajo por el nombre que quieras para tu vpn, éste debe contener sólo letras minúsculas y/o números sin guiones, símbolos y/o espacios. Cambia también server por el hostname de tu máquina servidor y client por el hostname de tu/tus máquinas cliente según corresponda.

1) El servidor

En la máquina que vamos a usar como servidor, corremos:

1. su -
2. mkdir -p /etc/tinc/myvpn/hosts
3. touch /etc/tinc/myvpn/tinc.conf
4. nano /etc/tinc/myvpn/tinc.conf

Y en el archivo que se abrirá a continuación, pegaremos lo siguiente:

Name = server
AddressFamily = ipv4
Interface = tun0

Este es el archivo de configuración principal para nuestra VPN. Luego corremos:

1. su -
2. touch /etc/tinc/myvpn/hosts/server
3. nano /etc/tinc/myvpn/hosts/server

Y en el archivo que saldrá ponemos:

Address = IP_Pública
Subnet = 10.0.0.1/32

Donde IP_Pública es igual a la IP de tu servidor Tinc accesible globalmente a través de internet. Recuerda que para que las conexiones VPN sean posibles, el servidor en cuestión deberá tener abierto el puerto 655/tcp en el firewall.

Ahora necesitamos generar las claves de encriptación, esto se hace con el siguiente comando:

su -c 'tincd -n myvpn -K4096'

Recuerda aceptar las opciones por defecto en los prompts que te presente este comando presionando ENTER.

Ahora generaremos los scripts de start/stop para el daemon de tinc, esto se hace con:

1. su -
2. touch /etc/tinc/myvpn/tinc-up
3. touch /etc/tinc/myvpn/tinc-down

y después:

nano /etc/tinc/myvpn/tinc-up

Que lleva el siguiente contenido:

#!/bin/sh
ifconfig $INTERFACE 10.0.0.1 netmask 255.255.255.0

Por otro lado:

nano /etc/tinc/myvpn/tinc-down

Lleva:

#!/bin/sh
ifconfig $INTERFACE down

Ambos scripts deben volverse ejecutables, cosa que lograremos con:

1. su -
2. chmod 755 /etc/tinc/myvpn/tinc-*

Y con eso hemos terminado la configuración dentro del servidor.

2) Los clientes

NOTA: Este proceso se debe repetir una vez en cada cliente que quieras agregar a la VPN, incrementando las IP's privadas según se vayan añadiendo clientes.

Para configurar los clientes la cosa es similar:

1. su -
2. mkdir -p /etc/tinc/myvpn/hosts
3. touch /etc/tinc/myvpn/tinc.conf
4. nano /etc/tinc/myvpn/tinc.conf

Pero el archivo de configuración se ve así:

Name = client
AddressFamily = ipv4
Interface = tun0
ConnectTo = server

Luego debemos configurar la IP privada de cada cliente en el archivo adecuado para ello:

1. su -
2. nano /etc/tinc/myvpn/hosts/client

Cuyo contenido sería:

Subnet = 10.0.0.2/32

...y 10.0.0.3/32, 10.0.0.4/32 etc según vayamos agregando clientes a la red...

Generamos las respectivas claves de encriptación y scripts de start/stop con:

1. su -
2. tincd -n myvpn -K4096
3. touch /etc/tinc/myvpn/tinc-up && nano /etc/tinc/myvpn/tinc-up
4. touch /etc/tinc/myvpn/tinc-down && nano /etc/tinc/myvpn/tinc-down

Agregando en los scripts (según corresponda la IP privada del cliente en cuestión):

tinc-up

ifconfig $INTERFACE 10.0.0.2 netmask 255.255.255.0

tinc-down

ifconfig $INTERFACE down

Los hacemos ejecutables:

sudo chmod 755 /etc/tinc/myvpn/tinc-*

Y hemos terminado.

Inicializando la VPN

Ahora tenemos que copiar las claves públicas de c/u de las máquinas en todas las demás; Para que se entienda mejor, todos los nodos dentro de la VPN deben tener una copia de todas las claves públicas de c/u de ellos dentro de la carpeta /etc/tinc/myvpn/hosts/ Esto quiere decir que en el caso de este ejemplo la carpeta en cuestión acabaría con las claves copiadas de esta manera según corresponda:

Nodo 1 & Nodo 2:

/etc/tinc/myvpn/hosts/
  server
  client

La clave de cada máquina es el archivo generado dentro de esa misma carpeta (en esa máquina) con el nombre de la máquina en cuestión (la de client aquí se llamaría client y la de server se llamaría server obviamente).

Una vez copiadas las claves como se debe (puedes hacerlo a mano, por SFTP o SCP) tendremos que ajustar el /etc/hosts de cada nodo, de manera que "se vean" los unos con los otros. acá un ejemplo:


Luego, tienes que inicializar la red (primero en el servidor) con el comando:

su -c 'tincd -n myvpn'

y luego en los clientes con esa misma orden. Para hacer que la red arranque al inicio del sistema puedes poner el comando

tincd -n myvpn

dentro de tu rc.local por ejemplo. Cabe destacar que se puede verificar la correcta inicialización de la VPN en cada uno de los nodos con el comando:

ifconfig

mismo que nos deberá devolver una lista de interfaces de red donde se deberá encontrar tun0,señal de que nuestra VPN está corriendo dentro de ese nodo.