Conexión OpenVPN con cliente Windows

En mi vida profesional uso VPNs como solución de conectividad para clientes, he intentado usar L2TP con StrongSwan pero me ha sido imposible por la ausencia de documentación adecuada, con OpenVPN hay que instalar software en el cliente pero el resultado es totalmente satisfactorio.

OpenVPN permite interconexión de redes con varios esquemas:
http://j0d3.blogspot.com/2007/06/instalar-y-configurar-openvpn.html

* Host a Host: Es el método más simple, nos permite encriptar la comunicación entre dos PC las cuales deberán solamente tener conexión; es decir: ambas PC deben poderse enviar paquetes directamente ya sea porque estén conectadas en la misma red local, o porque ambas estén conectadas a la internet y sean alcanzables entre sí.

* Road Warrior: Es una de las formas más utilizadas y solicitadas por los estudiantes. Es el permitir que una máquina de alguien que esté fuera de nuestra red (de forma temporal o permanente) pueda comunicarse con el servidor OpenVPN de nuestra red y una vez autenticado pueda entrar a ver y acceder los recursos de nuestra red local. En verdad es un caso especial de la conexión Red a Red que a continuación mencionamos:

* Red a Red: Uno de los métodos más usados. Mediante ésta forma dos redes separadas en el espacio pueden comunicarse como si estuvieran unidas por un cable virtual. La comunicación entre ambas redes viajará encriptada una vez salgan de los servidores de openvpn y hasta que lleguen a su otro extremo.

En este caso usaré la conexión road-warrior, que nos permitirá conectarnos a una red para realizar tareas como administración, acceso a cámaras IP, impresión remota, ...

Referencia: http://www.openvpn.net/index.php/open-source/documentation/howto.html

Instalar OpenVPN en el servidor

apt-get install openvpn openssl liblzo1

Una primera opción, mucho más sencilla es, configurar la VPN mediante static key, pero no se recomienda porque se basa en clave pública y además permite un único cliente, para más información visitar:
http://www.openvpn.net/index.php/open-source/documentation/miscellaneous...
http://nekan.net/configurar-openvpn-con-key

Crear CA (Certificate Authority) y generar certificados y claves

cp -Rp /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/
cd /etc/openvpn/easy-rsa/2.0

configurar las variables del certificado según nuestras necesidades editando /etc/openvpn/easy-rsa/2.0/vars, por ejemplo:
export KEY_COUNTRY="ES"
export KEY_PROVINCE="MA"
export KEY_CITY="Madrid"
export KEY_ORG="MiEmpresa"
export KEY_EMAIL="me@myhost.mydomain"

Inicializar el PKI

. ./vars
./clean-all
./build-ca

Cuando solicite el "Organizational Unit Name (eg, section) []:" puede dejarse en blanco o poner por ejemplo un nombre de departamento. Lo que es obligatorio completar es el "Common Name (eg, your name or your server's hostname) []", en mi caso he dejado el propuesto "MiEmpresa CA".

Generar el certificado y la clave privada del servidor

./build-key-server server

Generar certificados y claves para clientes
Puede usarse un único certificado para todos los clientes con el problema de que si se revoca un certificado no conectará nadie:

./build-key client

Si quisiéramos un certificado por cada cliente procederíamos:

./build-key client1
./build-key client2
./build-key client3
...

Generar parámetros Diffie Hellman

./build-dh

Copiar de /etc/openvpn/easy-rsa/2.0/keys a /etc/openvpn:
ca.crt
dh1024.pem
server.crt
server.key

cd /etc/openvpn/easy-rsa/2.0/keys
cp ca.crt dh1024.pem server.crt server.key /etc/openvpn

En el cliente Windows, instalar el GUI:
http://openvpn.se
Es recomendable instalar este software sin el cliente GUI en inglés y descargar la versión en español, está todo descrito en la página de descarga.

Crear un directorio C:\Archivos de Programa\OpenVPN\config y copiar de /etc/openvpn/easy-rsa/2.0/keys:
ca.crt
client.crt
client.key
client.ovpn de C:\Archivos de Programa\OpenVPN\sample-config

Crear las configuraciones en el servidor y en el cliente
Servidor

cd /etc/openvpn
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .
gzip -d server.conf.gz

editar server.conf y revisar estas líneas:
# la red IP de la VPN, diferente a la de la red interna
server 10.8.0.0 255.255.255.0
# red IP de nuestra red interna
push "route 192.168.0.0 255.255.255.0"
# recomentable en sistemas Unix por seguridad
user nobody
group nogroup

Cliente
editar client.conf y revisar esta línea:
remote ip_externa_del_servidor_OpenVPN_o_nombre_DNS 1194

Configuración de elementos de red
Es recomendable habilitar el IP forwarding en el servidor para que desde el nodo remoto se acceda a toda la red, de lo contrario sólo podríamos hacer "ping" al servidor:

echo 1 > /proc/sys/net/ipv4/ip_forward

Edito: este cambio desaparece al reiniciar, hay que editar /etc/sysctl.conf y descomentar la línea net.ipv4.ip_forward=1

Si entramos a través de un router hay que redirigir el puerto UDP 1194 a la IP interna del servidor.

Éste es el punto no documentado donde todo el mundo se estrella cuando quiere acceder a todos los nodos de la red. Lo normal es disponer de un router como puerta de enlace de los nodos de la red, en dicho router hay que añadir la ruta 10.8.0.0/24 hacia el servidor OpenVPN para que los paquetes de vuelta se envíen a través del servidor y no a través del router, ya que el router desconoce el origen de dichos paquetes de la VPN.

Realizar la conexión desde Windows
Ahora que ya se tiene todo listo, arrancamos el OpenVPN GUI y pulsamos con el botón derecho en el icono de la barra de notificación y seleccionamos "Conectar". Si tuviéramos más de un fichero de configuración .ovpn aparecería una lista de conexiones y habría que seleccionar "Conectar" en la conexión que nos interesase.

Ahora ya podemos hacer un ping a cualquier IP interna de la red y así comprobar que tenemos acceso.