Si hace unas semanas veíamos como crear un servidor VPN, hoy veremos como crear un túnel seguro dedicado entre dos servidores que esté permanentemente levantado y que se cree automáticamente al reiniciar alguna de las máquinas. ¿La utilidad? Tener una conexión directa con la máquina de backups, con un servidor de bases de datos, con la oficina, con otro centro de datos… seguro que se te ocurren más :P .

Como comentábamos entonces, PPTP no es el paradigma de la seguridad, pero la ventaja que tiene es la facilidad con que un cliente se conecta contra el servidor sin apenas conociemientos.  El ejemplo de hoy no nos servirá para crear túneles bajo demanda, pero veremos lo sencillo que puede ser crear un túnel dedicado. Siempre que se habla de VPN se termina en IPSec, pero ¿quién no se vuelto loco con la instalación de un túnel de este tipo? ¿Es realmente necesario utilizar IPSec para cualquier túnel? Yo creo que no, cada cosa para lo que está. Igual que con el primer artículo creábamos un sistema de VPN sencillo para el usuario, ahora que simplemente queremos conectar máquinas entre sí recurrimos a otro software que lo hace sin quebraderos de cabeza.

Necesitaremos, obviamente, máquinas Linux (aunque también se pueden emplear Windows) y el software que utilizaremos en este artículo: OpenVPN.

Tal y como reza en la home de OpenVPN:

Starting with the fundamental premise that complexity is the enemy of security, OpenVPN offers a cost-effective, lightweight alternative to other VPN technologies that is well-targeted for the SME and enterprise markets.

Y además lo cumple, ligero y sencillo.

Configuración

Lo primero será instalar el software. En mi CentOS no tendremos más que hacer

  1. yum install openvpn lzo

Lzo nos proporcionará la compresión a través del túnel.

Aunque no lo parezca, ya queda poco :) . Ahora debemos generar la clave SSL  que asegurará las comunicaciones a través del tunel. Muy sencillo, sólo necesitaremos un comando:

  1. openvpn –genkey –secret clave.key

Esta clave debemos copiarla a /etc/openvpn de los dos servidores que se quieren conectar. Para copiarla al segundo lo puedes hacer con scp:

  1. scp clave.key tuservidor.com:/etc/openvpn

Finalmente sólo nos queda el archivo de configuración. En el primer servidor creo un archivo con el nombre del segundo para identificar fácilmente qué conexión es puesto que podemos haber definido varios túneles.

  1. [osus@servidor1 openvpn]# cat servidor2.conf
  2. port 1194
  3. proto udp
  4. remote servidor2.com 1194
  5. dev tun
  6. ifconfig 192.168.2.2 192.168.2.1
  7. secret clave.key
  8. comp-lzo
  9. keepalive 10 60
  10. ping-timer-rem
  11. persist-tun
  12. persist-key
  13. log /var/log/vpn.log

Como se puede ver, la configuración es muy sencilla, no necesita apenas explicación. En servidor2.com pones la IP del servidor al que se va a conectar, defines el puerto, las IPs privadas del servidor y del cliente y voilà, ya tienes la primera máquina preparada.

Vamos ahora con el segundo servidor.

  1. [osus@servidor2 openvpn]# cat servidor1.conf
  2. port 1194
  3. proto udp
  4. remote servidor1.com
  5. dev tun
  6. ifconfig 192.168.2.1 192.168.2.2
  7. secret clave.key
  8. comp-lzo
  9. keepalive 10 60
  10. ping-timer-rem
  11. persist-tun
  12. persist-key
  13. log /var/log/vpn.log

Casi lo mismo que en el caso del servidor, sólo cambiamos la IP del servidor remoto y el orden de las IP’s privadas.

¡Ya está!

Sólo nos queda probarlo. Lanzamos el servicio en las dos máquinas y veremos si todo ha ido bien:

  1. [osus@servidor1 ~]# service openvpn start
  2. Starting openvpn:                                          [  OK  ]
  3.  
  4. [osus@servidor1 ~]# ifconfig tun0
  5. tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
  6.           inet addr:192.168.2.1  P-t-P:192.168.2.2  Mask:255.255.255.255
  7.           UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
  8.           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  9.           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  10.           collisions:0 txqueuelen:100
  11.           RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Parece que sí. Para verificar que, en efecto nos hemos conectado satisfactoriamente revisaremos el log.

  1. [osus@servidor1 ~]# tail -f /var/log/vpn.log
  2. Mon Feb  2 20:36:11 2009 NOTE: the current –script-security setting may allow this configuration to call user-defined scripts
  3. Mon Feb  2 20:36:11 2009 LZO compression initialized
  4. Mon Feb  2 20:36:11 2009 TUN/TAP device tun0 opened
  5. Mon Feb  2 20:36:11 2009 /sbin/ip link set dev tun0 up mtu 1500
  6. Mon Feb  2 20:36:11 2009 /sbin/ip addr add dev tun0 local 192.168.2.1 peer 192.168.2.2
  7. Mon Feb  2 20:36:11 2009 UDPv4 link local (bound): [undef]:1194
  8. Mon Feb  2 20:36:11 2009 UDPv4 link remote: servidor2.com:1194
  9. Mon Feb  2 20:36:16 2009 Peer Connection Initiated with servidor2.com:1194
  10. Mon Feb  2 20:36:16 2009 Initialization Sequence Completed

Parece que sí, que ha funcionado. ¿Veremos la segunda máquina desde la primera?

  1. [osus@servidor1 ~]# ping 192.168.2.2
  2. PING 192.168.2.2 (192.168.2.2) 56(84) bytes of data.
  3. 64 bytes from 192.168.2.2: icmp_seq=1 ttl=64 time=276 ms
  4. 64 bytes from 192.168.2.2: icmp_seq=2 ttl=64 time=197 ms

Eso es un sí ¿no? :P .

Consideraciones adicionales

Obviamente habrá que abrir el puerto que hemos configurado para el túnel en el router (si lo hubiese) y verificar que el firewall no está bloqueando el tráfico desde o hacia ese puerto, suele ser el principal problema a la hora de conectarse, si tu firewall está bien configurado bloqueará automáticamente todo el tráfico que no sea el permitido (http, smtp, dns…).

Si queremos que el túnel se inicie automáticamente al reiniciar las máquinas habrá que añadirlo a los servicios de arranque. En el caso de CentOS/RHEL sería:

  1. chkconfig –level 2345 openvpn on

Finalmente nos queda un comentario. Supongamos que la primera máquina es nuestro servidor remoto y el segundo está en nuestra oficina y que queremos poder llegar desde el primero a otros servidores de la oficina. Supongamos también que la red de la oficina es del rango 192.168.0.0/24 (el túnel, como hemos visto, está en la red 192.168.2.0). En el servidor enrutamos el tráfico a las IP’s de la oficina a través del túnel añadiendo esta línea al archivo de configuración de la VPN, OpenVPN añadirá la ruta cada vez que se levante el túnel.

  1. route-up "route add -net 192.168.0.0/24 tun0"

Ya sólo te queda añadir en el servidor cliente las reglas iptables adecuadas para que el tráfico se diriga hacia donde tú quieres que lo haga.

Éso es todo. Como os prometí, es un sistema muy sencillo a la vez que potente y ligero.

Si te ha resultado útil este artículo... ¡compártelo!