Creando enlaces punto a punto entre servidores Linux con OpenVPN

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 😛 .

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

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:

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:

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.

[osus@servidor1 openvpn]# cat servidor2.conf
port 1194
proto udp
remote servidor2.com 1194
dev tun
ifconfig 192.168.2.2 192.168.2.1
secret clave.key
comp-lzo
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
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.

[osus@servidor2 openvpn]# cat servidor1.conf
port 1194
proto udp
remote servidor1.com
dev tun
ifconfig 192.168.2.1 192.168.2.2
secret clave.key
comp-lzo
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
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:

[osus@servidor1 ~]# service openvpn start
Starting openvpn:                                          [  OK  ]

[osus@servidor1 ~]# ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:192.168.2.1  P-t-P:192.168.2.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          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.

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

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

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

Eso es un sí ¿no? 😛 .

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:

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.

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.

18 comentarios en “Creando enlaces punto a punto entre servidores Linux con OpenVPN

  1. Hola, te quería preguntar si con este ejemplo se permite además que se conecten clientes a los servidores. Es decir, imaginemos que queremos conectar dos redes separadas físicamente a través de una VPN. Existirá un servidor de OpenVPN en cada red que se conectarán a través de Internet de forma que será una única red. Los clientes podrán conectarse a esta red unificada y privada. Mi duda es si los servidores trabajan para conectar las redes (punto-punto) además pueden aceptar solicitudes de los clientes (punto-multipunto). Creo que más o menos me he explicado, o eso creo.

    Saludos.

  2. Hola Pablo,

    La respuesta es no, este método sólo sirve para establecer un túnel dedicado. En la documentación de OpenVPN se detalla cómo hacer lo que tu necesitas, un servidor VPN que acepte conexiones entrantes, pero necesitarás que cada cliente tenga también el software adecuado para hacerlo.
    Para lo que quieres hacer te recomiendo este sistema para conectar las dos redes y este otro para que se conecten los clientes

  3. Hola Osus,
    creo que lo que me indicas en usar OpenVPN para conectar los servidiores y PPTP con Radius para conextas los clientes a los servidores. No es mala opción sobre todo si no queremos usar aplicaciones clientes. De todas formas crees que los servidores con OpenVPN pueden trabajar en ambos modos es decir, punto-punto para conectarse entre ellos y punto-multipunto para los clientes.

    un saludo

  4. Claro Pablo, en la web de OpenVPN explican muy bien como hacerlo, sólo hay que tener en cuenta que hay que generar los certificados para cada uno de los usuarios.

  5. Hola, pequeña pregunta:

    Tengo configurado el servidor OPENVPN en mi casa y en el portatil el cliente con la opcion proxy (para que me permita conectarme si tengo
    un proxy por delante del cliente)
    Bien, supongamos que tengo restringido el acceso a internet a traves del explorador en el cliente pero el TUNEL funciona.
    La idea es atraves del Tunel ver páginas web, vamos conectarme a internet normalmente a traves de la ip que me da el servidor OPENVPN,
    es posible?

  6. Buenas Debian,

    Tienes dos opciones, usar tu servidor como proxy (para eso configuras squid y le indicas al browser de tu portatil que lo utilice) o conviertes tu servidor en un router (sencillo, hay mucha documentación) y le indicas a la configuración de red de tu portatil que la puerta de enlace es tu servidor.

    Saludos

  7. hola como puedo hacer para que un servidor linux CentOS ofrezca la posibilidad de autenticar usuarios pero de forma remota, si por acceso telefonico
    gracias

  8. Hola elpidio,

    No aclaras mucho qué es lo que quieres “conectar”.
    En líneas generales “radius” debería ser el sistema más universal y estandar.

    Saludos

  9. Mi pregunta es acerca de la velocidad del tunel, algunas marcas tienen conexiones de 100 MB pero a ala hora de realizar el tunel te ofrecen solo de 10 MB, con OpenVPN es igual u obtienes mejor rendimiento de comunicacion.

  10. Hola, mi consulta es la siguiente, con OPENVPN podria conectar dos redes LAN pero que se encuentren en distintas ciudades? y para esto que es necesario? La idea es que por ejemplo desde una sucursal puedan ver la LAN de la otra sucursal, o existe alguna alternativa mejor? la idea para esto no es usar un enlace dedicado, solo la conexion a internet…

  11. Hola Anparax,

    Claro que puedes, precisamente para eso es para lo que sirven las VPN, para enlazar dos redes remotas a través de Internet de manera privada y segura y que cualquier equipo de una red vea a los de la otra según las políticas de seguridad que definas.

  12. Hola, Tengo una Red ya instalada con OpenVpn y 3 ciudades interconectas por los tuneles, todo me funciona perfectamente esto es con FreeBSD.
    El problema q tengo es que cuando le hagos certificados a un equipo que no se conecta por medio de los servidores, sino de manera remota se le asigna una ip si entro al servidor central, pero no ve los otros servidores, mi red del servidor central esta 10.10.8.??? etc. los otros 10.10.1.??? y otro 10.10.2.??? entre ellos si se ven, los equipos internos tambien, solo lo equipos externos que le hagos certificardos no ven los otros servidores… que hagooooooo 🙁

  13. Hola Dasc,

    Yo diría que tu problema es de enrutamiento. En los equipos que comentas debes indicar que las subredes que te interesan son accesibles a través de la interfaz de la vpn, lo normal es que por defecto lo haga por la interfaz principal, con lo que verás nada.

  14. Gracias Osus,

    Pero el detalle es q las maquinas que estan conectadas en cada uno de los servidores externos si se ven y no tengo problema, el detalle son con las que se les hace certificados y estan externas, lo q no se como hacer como enrutarlas, porque en el servidor principal en rc.local puse lo siguiente

    /sbin/route add -net 10.10.1.0 10.10.8.246

    donde 10.10.8.246 el el numero que le toco por el dhcp, y 10.10.1.0 es la red del otro servidor. esto esta bien y me fuciona perfectamente

    pero para las que no son servidores y les asigna una ip ejemplo 10.10.8.251 q es una lap y q ese numero se lo asigno el dhcp del servidor principal, pero esa maquina no puede ver la 10.10.1.1, ese es el problema que tengo. sera que tengo q agregar tanbien esa ip al rc.local?, si es asi como la agrego 🙁

  15. estas maquinas que te comento no estan en la red de 10.10.1.0 son de casa para conectarse al servidor 10.10.8.1 y si se conecta, pero no puede ver al 10.10.1.1, ese es basicamente el problema

  16. Hola Dasc,

    Según lo que comentas, el problema es que las máquinas “de casa” no saben cómo alcanzar la red 10.10.1.0, tendrás que añadir en esas máquinas esa ruta, no hay otra solución.
    Sácate todo las rutas que tienes en las máquinas de casa y comprueba si tienes alguna que indique cómo llegar a la red que te interesa, si no la hay estarás enrutando a través de la interfaz por defecto.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *