Instalación y configuración de OpenVPN
Una red privada virtual (VPN de las siglas en inglés de Virtual Private Network) es una tecnología de red que permite una extensión segura de la red local sobre una red pública o no controlada. Ejemplos comunes son la posibilidad de conectar dos o más sucursales de una empresa utilizando como vínculo Internet, permitir a los miembros del equipo de soporte técnico la conexión desde su casa al centro de cómputo, etc. Todo ello utilizando la infraestructura de Internet.
Este artículo detalla los pasos de instalación y configuración de OpenVPN sobre un servidor Debian 6 ó Ubuntu 12.04 (para este artículo ha sido probado en ambos), para dar acceso remoto desde Internet hasta una red privada de un centro de cómputos. OpenVPN es una solución VPN basada en SSL, liberada bajo la licencia GPL y es el estándar de facto para crear una VPN en GNU/Linux.
Escenario
Al construir una VPN, lo que sea desea es tener la posibilidad de acceder a una red local (protegida detrás de un firewall/gateway) desde Internet (o desde cualquier otra red insegura). El objetivo es que un cliente ubicado físicamente fuera de la red local (y posiblemente a kilómetros de distancia) parezca conectado de forma local. El servidor de VPN es el que posibilita la "extensión" y es quien provee una conexión segura entre el cliente y la red local a través de SSL (al utilizar certificados se obtiene autenticación mutua y confidencialidad).
El siguiente diagrama muestra el escenario planteado. En el ejemplo que se presenta en este artículo, la VPN no se realiza a través de Internet, sino a través de una red insegura 192.168.122.0/24. Se desea acceder a la red privada 10.9.0.0/24 a través de la VPN 10.8.0.0/24.
Instalación de OpenVPN
En Debian/Ubuntu es posible instalar OpenVPN desde los repositorios oficiales:
apt-get install openvpn
Luego de la instalación se deben copiar los scripts de configuración de ejemplo al directorio /etc/openvpn:
cd /usr/share/doc/openvpn/examples/easy-rsa cp -a 2.0/ /etc/openvpn/easy-rsa cd /etc/openvpn/easy-rsa
Estos scripts permiten la creación automática de una autoridad certificante (CA) autofirmada, lo cual simplifica mucho la instalación. Ya que OpenVPN está basado en SSL, se utiliza openssl para la autenticación mutua de clientes y servidores. La CA se utiliza para expedir certificados para el servidor de VPN y los clientes.
Antes de comenzar a crear la CA y los certificados se deben configurar algunas variables de entorno. Editar el archivo vars
:
nano vars
Se deben configurar correctamente los parámetros KEY_COUNTRY
, KEY_PROVINCE
, KEY_CITY
, KEY_ORG
, y KEY_EMAIL
.
En "Ubuntu 12.04.1 LTS" es necesario modificar el script whichopensslcnf
para que funcione correctamente (no así en Debian 6, ya que detecta la versión de openssl correctamente):
nano whichopensslcnf
Eliminar todas las apariciones de la siguiente cadena (en la versión "OpenVPN 2.2.1 x86_64-linux-gnu" son 3 apariciones):
[[:alnum:]]
Luego de configurar el archivo vars
es posible generar el certificado y clave para la Autoridad Certificante (CA):
. ./vars ./clean-all ./build-ca
El script build-ca
crea el certificado de la CA utilizando los parámetros configurados en vars
. Verificar que los parámetros entre corchetes estén correctos, modificar en caso contrario. Luego es posible generar el certificado y clave para el servidor de VPN:
./build-key-server server
El CN (Common Name) debe ser "server", responder 'y' dos veces para firmar y commit del certificado.
Generar los certificados para los clientes (es importante que los certificados de los clientes y del servidor estén firmados por la misma CA):
./build-key client1 ./build-key client2 ./build-key client3
Nota: cada vez que se reinicia la sesión, se debe ejecutar ". ./var" para configurar las variables de entorno nuevamente.
Responder 'y' dos veces para firmar y commit del certificado.
Finalmente se deben generar los parámetros Diffie-Hellman:
./build-dh
Archivos de configuración para el servidor y clientes
Luego de construir nuestra PKI (Public Key Infrastructure), es decir nuestra infraestructura de autenticación y encriptación mediante clave pública, se deben copiar los archivos de configuración de ejemplo al directorio /etc/openvpn
:
cp -a /usr/share/doc/openvpn/examples/sample-config-files/ /etc/openvpn/
Configuración del servidor
Descomprimir el archivo de configuración del servidor:
cd /etc/openvpn/sample-config-files/ gunzip server.conf.gz
Editar el archivo de configuración del servidor:
nano server.conf
Modificar las siguientes líneas:
proto tcp ;proto udp ca easy-rsa/keys/ca.crt cert easy-rsa/keys/server.crt key easy-rsa/keys/server.key # This file should be kept secret dh easy-rsa/keys/dh1024.pem server 10.8.0.0 255.255.255.0
De esta forma el servidor dará acceso a la red 10.8.0.0/24 y tomará la dirección IP 10.8.0.1 (los clientes tendrán una IP en el rango 10.8.0.2 a 10.8.0.254).
Si es necesario enviar reglas de ruteo a los clientes se debe agregar (por ejemplo para poder llegar a la red 10.9.0.0/24 que se encuentra detrás de la VPN):
push "route 10.9.0.0 255.255.255.0"
Por último copiar el archivo de configuración al directorio /etc/openvpn:
cp server.conf ../ cd /etc/openvpn
Configuración de los clientes
Editar el archivo de configuración de los clientes:
cd /etc/openvpn/sample-config-files nano client.conf
Modificar las siguientes líneas:
proto tcp ;proto udp remote 192.168.122.169 1194
En este ejemplo la dirección IP 192.168.122.169 es la dirección en la cual el servidor escucha pedidos de conexión a la VPN 10.8.0.0/24 en el puerto 1194 (puerto por defecto de OpenVPN).
Empaquetar el archivo de configuración junto con los certificados y clave:
cd /etc/openvpn mkdir client1 cp sample-config-files/client.conf client1/ cp easy-rsa/keys/ca.crt client1/ cp easy-rsa/keys/client1.crt client1/client.crt cp easy-rsa/keys/client1.key client1/client.key zip -Z deflate -r client1.zip client1/*
Repetir el procedimiento para el resto de los clientes.
Iniciar el servidor para verificar la conectividad
Nota: antes de iniciar el servidor debe habilitarse IP forwarding para que funcione el ruteo de paquetes.
Habilitar IP forwarding:
echo 1 > /proc/sys/net/ipv4/ip_forward
Iniciar el servidor de VPN:
cd /etc/openvpn/ openvpn server.conf
Ejemplo:
root@ubuntu:/etc/openvpn# openvpn server.conf Wed Nov 14 18:07:28 2012 OpenVPN 2.2.1 x86_64-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] [MH] [PF_INET6] [IPv6 payload 20110424-2 (2.2RC2)] built on Mar 30 2012 Wed Nov 14 18:07:28 2012 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables Wed Nov 14 18:07:28 2012 Diffie-Hellman initialized with 1024 bit key Wed Nov 14 18:07:28 2012 TLS-Auth MTU parms [ L:1544 D:140 EF:40 EB:0 ET:0 EL:0 ] Wed Nov 14 18:07:28 2012 Socket Buffers: R=[87380->131072] S=[16384->131072] Wed Nov 14 18:07:28 2012 ROUTE default_gateway=192.168.122.1 Wed Nov 14 18:07:28 2012 TUN/TAP device tun0 opened Wed Nov 14 18:07:28 2012 TUN/TAP TX queue length set to 100 Wed Nov 14 18:07:28 2012 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0 Wed Nov 14 18:07:28 2012 /sbin/ifconfig tun0 10.8.0.1 pointopoint 10.8.0.2 mtu 1500 Wed Nov 14 18:07:28 2012 /sbin/route add -net 10.8.0.0 netmask 255.255.255.0 gw 10.8.0.2 Wed Nov 14 18:07:28 2012 Data Channel MTU parms [ L:1544 D:1450 EF:44 EB:135 ET:0 EL:0 AF:3/1 ] Wed Nov 14 18:07:28 2012 Listening for incoming TCP connection on [undef] Wed Nov 14 18:07:28 2012 TCPv4_SERVER link local (bound): [undef] Wed Nov 14 18:07:28 2012 TCPv4_SERVER link remote: [undef] Wed Nov 14 18:07:28 2012 MULTI: multi_init called, r=256 v=256 Wed Nov 14 18:07:28 2012 IFCONFIG POOL: base=10.8.0.4 size=62, ipv6=0 Wed Nov 14 18:07:28 2012 IFCONFIG POOL LIST Wed Nov 14 18:07:28 2012 MULTI: TCP INIT maxclients=1024 maxevents=1028 Wed Nov 14 18:07:28 2012 Initialization Sequence Completed
Luego de asegurarse que inicia correctamente es posible iniciar el servicio utilizando la herramienta service
o desde /etc/init.d
.
Clientes Windows
La instalación de OpenVPN para acceder a la VPN desde clientes Windows es extremadamente sencilla, se deben seguir los siguientes pasos:
- Descargar el cliente OpenVPN desde el siguiente enlace:http://swupdate.openvpn.org/community/releases/openvpn-2.2.2-install.exe
- Instalar el cliente con las opciones por defecto.
- Copiar el paquete zip que contiene los certificados, la clave y el archivo de configuración al cliente Windows.
- Descomprimir el contenido del zip dentro del directorio "C:\Program Files\OpenVPN\config":
- Renombrar el archivo "client.conf" a "client.ovpn".
- Iniciar el cliente desde el icono "OpenVPN GUI" que se encuentra en el escritorio de Windows.
- Una vez que inicia, clic derecho sobre el icono en la barra de tareas y ejecutar "Connect":En la barra de tareas notifica la conexión:Dirección IP asignada:Ruta agregada:
- Finalmente verificar la conexión con ping.
¿NAT o no NAT?
La pregunta si se desea realizar NAT (Network Address Translation) hacia la red privada, desde la red VPN, se debe a cuestiones de ruteo. En el ejemplo, si no se utiliza NAT, el gateway de la red privada (10.9.0.0/24) debe conocer la ruta hacia la red VPN (10.8.0.0/24) para que los clientes de la VPN puedan conectarse de forma exitosa a los hosts de la red privada. Si no es posible agregar la ruta a la red VPN en el gateway, o si directamente no hay gateway (por tratarse de una red aislada), todos los host de la red privada deben tener definida una ruta estática a la red VPN (10.8.0.0/24). Desde la red privada, el gateway para llegar a la red VPN es el servidor VPN.
Una alternativa más simple, que permite prescindir de un gateway y de rutas estáticas en los hosts, es utilizar NAT o IP masquerading. Con esta técnica, se enmascara todo el tráfico de la VPN como proveniente desde el servidor VPN. Como el servidor VPN tiene IP en la red privada, no es necesaria ninguna regla de ruteo.
NAT
En caso de utilizar NAT hacia redes detrás de la VPN (por ejemplo hacia la red 10.9.0.0/24), se debe habilitar IP forward y utilizar iptables en el servidor VPN:
# cat /etc/openvpn/iptables.sh #!/bin/sh # Habilitar reenvío de paquetes echo 1 > /proc/sys/net/ipv4/ip_forward # Habilitar NAT hacia la red 10.9.0.0/24 /sbin/iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 10.9.0.0/24 -j MASQUERADE
Editar el archivo /etc/rc.local para ejecutar el script al inicio del sistema. Agregar la linea:
/etc/openvpn/iptables.sh