Openvpn, modo guerrero de la carretera (road warrior)

Road warrior esquema

En este artículo voy a describir mi caso de uso de openvpn para crifrar el tráfico cuando estoy fuera de casa o no estoy usando una red segura (tipicamente wifi en un hotel, universidad, aeropuerto...) evitando mirones. Otra de las ventajas que tiene es poder acceder a la red interna de mi casa donde tengo un servidor web que no es accesible al publico y los servicios de compartición de archivos, nuestro portatil fuera de casa será un ordenador más dentro de la LAN. También puede ser util para enmascarar nuestra IP, por ejemplo si conectamos a un servidor openvpn de estados unidos podemos navegar y usar servicios con IP estadounidense. 

Si tienes una IP dinamica en casa que es lo más habitual vas a tener que darte en algún servicio de dns dinamica y configurarlo para que se actualice cuando tu IP cambia. El proveedor de este servicio más popular es dyn.com. para mantener la ip actualizada se puede usar un script llamado ddclient. Se necesita también un ordenador conectado a internet y encendido las 24 horas del día (si quereis usar el servicio las 24 horas del día).

Yo tengo el servidor openvpn en el router, conectado a la IP pública de internet y no me tengo que preocupar de abrir puertos hacia el ordenador que está corriendo openvpn. 

Empezamos con la configuracion en el servidor 

1-instalar los paquetes necesarios

apt-get install openvpn openssl bridge-utils

2-generación de claves

copiamos el scrip de generación de claves a nuestro directorio de configuración de openvpn

cp -a /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/

editar /etc/openvpn/easy-rsa/2.0/vars para que contengan los datos acordes a nosotros

export KEY_COUNTRY=”US”
export KEY_PROVINCE=”US”
export KEY_CITY=”mycity”
export KEY_ORG=”vpn”
export KEY_EMAIL=”myname@myemail.org

Despues usamos los siguientes comandos para crear una entidad de certificación

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

Creamos las claves de servidor

./build-key-server server

Y las claves de usuario. Repetimos este paso tantas veces como usuarios queremos que senecten a la vpn (también se puede crear alguna de más)

./build-key user1

Generamos el Diffie-Hellman.

./build-dh

Generamos la clave estatica (esto añade seguridad)

openvpn --genkey --secret ta.key

En los pasos anteriores se han creado una serie de archivos con claves, vamos a colocar cada uno en su sitio.

Creamos un directorio para almacenar las claves en el servidor

mkdir /etc/openvpn/keys

copiamos las claves que nos interesan para el servidor.

cp ca.crt  server.crt server.key dh1024.pem  ta.key  /etc/openvpn/keys

3-Fichero de configuración

En /etc/openvpn creamos un fichero llamado server.conf. podemos crear un fichero por cada servidor que queramos arrancar, por ejemplo podemos crear un fichero server2.conf en que cambiemos el puerto y el procolo para que use el puerto 443 y el protocolo TCP debido a que ciertas redes pueden bloquear el puerto 1194 UDP que es el que tipicamente usa openvpn. Si una red bloquea el puerto 443 en TCP estaria impidiendo el trafico https asi que es improbable que nos lo encontremos bloqueado.

#/etc/openvpn/server.conf
#home.dyndns.org es la dirección que he configurado y que se traduce en mi ip, si teneis ip fija, hay que ponerla en vez del nombre del servidor
local home.dyndns.org 
port 1194
#port 443
proto udp
#proto tcp

#la otra opcion es usar un dispositivo de tipo tun (tunnel), que es un dispositivo de más alto nivel(en cuanto al modelo OSI de red) y necesita menos recursos pero el dispositivo tap es necesario para el modo bridge
dev tap0 

ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
tls-auth /etc/openvpn/keys/ta.key 0

up "/etc/openvpn/up.sh"
ifconfig-pool-persist ipp.txt

#usamos el 188 para el ultimo segmento de subred para que sea rara y no coincidad con la subred de alguno de los sitios en los que nos vamos a conectar, también asignamos un pool de ips (al estilo de dhcp) para los posibles clientes
server-bridge 192.168.188.1 255.255.255.0 192.168.188.70 192.168.188.79

keepalive 10 120
push "redirect-gateway"
max-clients 5
persist-key
persist-tun
status openvpn-status.log
#log-append openvpn.log
verb 6
 

En el archivo de configuración anterior usamos un script(up.sh) que se ejecutará cuando se inicie el servidor openvpn que lo que hace es primero añadir la interfaz tap al bridge (similar a enchufar nuestra tarjeta de red virtual a nuestro switch virtual) y luego activamos la interfaz para que empiece a funcionar. el bridge ya está previmente creado. no os olvideos de dar permiso de ejecución a este script.

#!/bin/sh
brctl addif br0 tap0
ifconfig tap0 up

Ahora el servidor openvpn debería arrancar sin problemas. Podemos chequear el estado con "service openvpn status" y si no ha arrancado al inicio probar a a arrancarlo con "service openvpn start" y mirar los logs (syslog y /etc/openvpn/openvpn-status.log por ejemplo)
 
4- Cliente

Para la parte de cliente yo uso el plugin de vpn para network-manager y poder conectar con la vpn a golpe de raton. estos son los parametros de configuracion

pasarela: home.dyndns.org

Autenticación: certificados (TLS)

certificado de usuario: user1.crt

certificado de CA: ca.crt

clave privada:user1.key

sin contraseña

Ahora pulsamos en la configuración avanzada y especificamos el puerto y marcamos la opcion de usar un dispositivo tap, el resto desmarcadas. En la pestaña de autenticación TLS también tenemos que proporcionar la clave estatica ta.key y especificar un 1 como dirección de clave ya que estamos usando autenticación TLS adicional.

Para probar nuestra VPN debemos estar fuera de nuestra LAN (desde dentro no funcionará porque las respuestas del servidor no se reciben desde la IP que se espera) y seleccionar la conexión vpn que acababamos de crear con el plugin openvpn de Network manager. Para comprobar que funciona podemos ir a alguna web que nos diga nuestra IP publica y veremos que estamos utilizando la del servidor openvpn en vez de la IP publica del lugar en el que nos estamos conectando.

Esta guia es una adaptación de http://bailey.st/blog/2011/01/06/openvpn-road-warrior-howto/ por Philip Bailey que esta encantado de que traduzca su artículo (aunque yo lo he reducido a mi caso de uso especifico).