martes, 13 de diciembre de 2011

viernes, 9 de diciembre de 2011

Openvpn






En este artículo voy a describir mi caso de uso de openvpn para cifrar el tráfico cuando estoy fuera de casa o no estoy usando una red segura (típicamente 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 público y los servicios de compartición de archivos, nuestro portátil fuera de casa será un ordenador más dentro de la LAN. También puede ser útil 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 dinámica en casa que es lo más habitual vas a tener que darte en algún servicio de dns dinámica 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 queréis 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 configuración 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
Después 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 estática (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 protocolo 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 típicamente usa openvpn. Si una red bloquea el puerto 443 en TCP estaría impidiendo el trafico https así 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 opción 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 último segmento de subred para que sea rara y no coincida 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á previamente creado. No os olvidemos 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 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 ratón. estos son los parámetros de configuración
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 opción de usar un dispositivo tap, el resto desmarcadas. En la pestaña de autenticación TLS también tenemos que proporcionar la clave estática 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 acabábamos 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.