Configurar OpenVPN en Raspberry Pi

Una de las cosas que primero pensé al probar una Raspberry fue en montar una VPN, de manera que pudiera acceder a todos los dispositivos de mi red, desde cualquier dispositivo (Windows, Linux, Mac, iOS o Android) desde cualquier lugar del planeta. Así que me propuse configurar OpenVPN en Raspberry Pi para lograrlo. Hay dos tipos de VPN, enrutada o túnel (routed) o en puente (bridged), según la teoría (enlace en inglés) debería configurar una VPN bridged pero me encontré que los dispositivos móviles no eran compatibles con este tipo de red.

Configurar OpenVPN en Raspberry Pi

En este artículo comparto mi configuración por si necesitas hacer lo mismo que yo. Crear una VPN para acceder a todos los recursos de una red privada, desde cualquier dispositivo.

Precaución: con esta configuración NO REDIRECCIONO EL TRÁFICO POR LA VPN, NO SIRVE PARA ANONIMIZAR UNA CONEXIÓN. Se encripta el tráfico que va hacia y desde mi VPN, el resto del tráfico quedará como está.

Configurar OpenVPN en Raspberry en modo túnel

Como los dispositivos móviles no soportan VPN del tipo bridge, tuve que encontrar la manera de montar una VPN enrutada, y enrutar el tráfico para que ambas redes (la VPN y la red casera) se vean. Y todo este “trabajo” lo ha de hacer la Raspberry.

Así que aquí van los pasos que he dado, y los ficheros de configuración necesarios para lograrlo.

1) Instalar openvpn

Lo primero es instalar OpenVPN, que lo haremos con el comando

sudo apt-get install openvpn

2) Generar claves

OpenVPN se basa en claves para validar que el servidor y el/los clientes son válidos y tienen permisos, y son las claves de encriptación que se utilizarán en la comunicación.

Para generar las claves lo primero que haremos será aprovechar los ficheros de ejemplo que tenemos en la carpeta /usr/share/doc/openvpn/examples

Como son varios pasos que hay que ejecutar como administrador, empezaremos con un sudo su para no tener que empezar cada comando con sudo (a mí siempre se me olvida y eso genera problemas)

sudo su
cp cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa

Para configurar OpenVPN en Raspberry para un servidor en concreto hay que editar el fichero vars para rellenar los datos de nuestros certificados, tales como ciudad, correo electrónico, nombre de la empresa, etc.

joe vars

Por ejemplo estos datos podrían servir:

export KEY_COUNTRY="ES"
export KEY_PROVINCE="B"
export KEY_CITY="Barcelona"
export KEY_ORG="Mi Empresa"
export KEY_EMAIL="info@miempresa.com"
export KEY_CN=changeme
export KEY_NAME=changeme
export KEY_OU=changeme
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234

Y luego de esto ya podemos empezar a generar las claves.

Primero, exportamos las variables que acabamos de modificar (con vars), luego (con el comando clean-all) creamos la carpeta keys donde meterá los certificados y eliminamos todos los certificados que hubiera creados. Y si en algún momento nos equivocamos, podemos ejecutar este comando para eliminarlos y volver a empezar.

. ./vars
./clean-all

Generamos las claves de nuestra autoridad de certificación (esto es, la Raspberry puede certificar que estas claves son válidas)

./build-ca

Y nos preguntará los datos para generar las claves.

Y ahora empezamos a generar las claves para el servidor y los clientes. El certificado del servidor se genera con el comando

./build-key-server raspberry

Donde raspberry es el nombre del servidor. La contraseña que pide, dejarla en blanco. Firmar el certificado poner que sí, igual que escribir los cambios (commit).

Ahora creamos los parámetros Diffie-Hellman:

./build.dh

Y, por fin, podemos empezar a crear las claves para cada cliente que queremos que se conecte.

Implementación de los clientes que se conecten a la VPN

Los clientes de una red VPN son aquellos dispositivos que se conectan a una red. Ya hemos generado las claves del servidor, llegado el momento de generar las claves de los clientes tenemos que tomar una decisión ¿cómo vamos a querer que se conecten?

He visto implementaciones donde se hace un único cliente, pero lo ideal es generar las claves para cada cliente y poder revocar, llegado el caso, alguna clave.

En mi caso, aunque sólo me conecto yo, he generado claves para mi portátil, para mi Android, para mi tablet, y así sucesivamente. Pero podrías generar uno para cada persona que necesite conectarse a la VPN. Y así, si te roban un dispositivo o ya no quieres que una persona se conecte a la VPN, revocas el certificado y ya está.

Configurar OpenVPN en Raspberry Pi: Generando las claves de cliente

Utilizaremos el comando ./build-key Cliente para cada cliente que querramos. Por ejemplo, aquí creo el certificado para un portátil y un sobremesa.

./build-key portatil
./build-key sobremesa

Y ¡CLAVES CREADAS!

¿Cuáles de estos ficheros tengo que copiar?

En cada cliente hay que copiar estas claves para que se puedan conectar al servidor, y que la conexión sea válida y encriptada usando estas claves. Hay que copiar los ficheros justos y necesarios, si copiamos de menos no funcionará, si copiamos de más ponemos en riesgo la seguridad de la VPN (si por ejemplo copiamos la llave privada del servidor cualquiera con estos ficheros puede duplicar el servidor, o incluso desencriptar el tráfico de la VPN)

En cada cliente se necesitan (siguiendo el ejemplo del portátil):

ca.crt (Autoridad de Certificación)
portatil.crt
portatil.key
portatil.conf (fichero de configuración del cliente)

3) Configurar OpenVPN en Raspberry Pi: generando los ficheros de configuración del servidor

Teniendo las claves generadas, vamos a tocar los ficheros de configuración para poder arrancar el servicio con la configuración que hemos decidido.

Los ficheros de OpenVPN son muy complejos, voy a copiar aquí los ficheros de cómo lo tengo generado yo (después de tocar varias cosas) siguiendo la idea: es una VPN para poder conectarme de manera segura a mi Raspberry, y a los demás recursos de mi red (como otro Linux vía SSH, carpetas compartidas de Windows, impresoras, cámaras de videovigilancia). Esta configuración NO REDIRECCIONA EL TRÁFICO, NO SIRVE PARA ANONIMIZAR LA CONEXIÓN (por ejemplo desde una WiFi pública)

Los parámetros básicos son:

Red VPN: 192.168.3.0/24
Red local: 192.168.2.0/24 (la red donde están mis impresoras, carpetas compartidas, etc)

Y el fichero /etc/openvpn/server.conf (eliminé los comentarios):

port 1194
proto udp
dev tun0
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/raspberrypi.crt
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
server 192.168.3.0 255.255.255.0 
ifconfig-pool-persist ipp.txt
push "route 192.168.2.0 255.255.255.0" #esta es mi red privada, donde tengo mis dispositivos que quiere acceder desde fuera
client-config-dir ccd
client-to-client
keepalive 10 600
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
mute 20

4) Cambiando la configuración de iptables

Aunque la configuración del servidor ya esté lista, para poder acceder a nuestra red desde fuera tenemos que hacer que la Raspberry redireccione todo el tráfico relevante a la red local 192.168.2.0. Por ejemplo, si intento acceder a mi impresora que está en 192.168.2.30 tiene que encargarse de enviar el tráfico a la red interna, y el resto del tráfico (internet) dejarlo “intacto”

Para ello debemos activar ip forwarding de manera constante, modificando el fichero /etc/sysctl.conf, dejándolo así:

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Y luego utilizar iptables para redireccionar el tráfico. Como mi Raspberry es un servicio 24/7 y me interesa que la VPN esté siempre disponible, he agregado un script para que, al arrancar la RPi, ya deje el firewall configurado correctamente.

Creé el script /etc/init.d/iptablesVPN.sh

#!/bin/sh
### BEGIN INIT INFO
# Provides:          iptables-VPN
# Required-Start:    hostname $all
# Required-Stop:
# Should-Start:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Arranca configuración iptables para OpenVPN
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/init/vars.sh

do_start () {
	# Allow traffic initiated from VPN to access LAN
	iptables -I FORWARD -i tun0 -o eth0 -s 192.168.3.0/24 -d 192.168.2.0/24 -m conntrack --ctstate NEW -j ACCEPT

	# Allow established traffic to pass back and forth
	iptables -I FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

	# Masquerade traffic from VPN to "the world" -- done in the nat table
	iptables -t nat -I POSTROUTING -o eth0 -s 192.168.3.0/24 -j MASQUERADE
}
	                               
	                               
case "$1" in
	start)
        	do_start
        	;;
	               	             	
	*)
		exit 3
               	;;
esac
:

Con el siguiente comando activo este script para el arranque:

cd /etc/init.d
update-rc.d iptablesVPN.sh defaults

Y ahora sí, ya estamos listos para arrancar el servidor.

service openvpn restart

¡¡Y SERVIDOR LISTO!!

Hemos creado las llaves de SSH, configurado el servidor y modificado el cortafuegos. Sólo nos falta copiar los ficheros en los clientes, y ¡disfrutar!

5) Configurar OpenVPN en Raspberry Pi: ficheros de configuración del cliente

Toca ahora generar el fichero de configuración que, junto con las claves, tendremos que copiar en el cliente para que se pueda conectar al servidor.

La sintaxis es muy simple, pongo un ejemplo. Ojo al nombre de los certificados (que debe cambiar de cliente en cliente) y el nombre del servidor, que debería ser accesible desde internet.

Fichero portatil.conf:

#Certificados

ca ca.crt
cert portatil.crt
key portatil.key

client
dev tun
proto udp
remote servidor.dominio.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun

ns-cert-type server
comp-lzo
verb 3

6) Clientes VPN para trabajar con OpenVPN

Hay varios clientes para OpenVPN, algunos oficiales y otros no. Según el sistema operativo:

Configurar OpenVPN en Raspberry

Windows-Linux (Oficial)

Android (Aplicación oficial)

iOS (Oficial)

OS X (TunnelBlick)

Espero que este artículo te haya servido. Si tienes cualquier duda o consulta ¡déjame un comentario!

3 comentarios:

  1. 1º) gracias por tu artículo.Soy un novato en esto y mis dudas son elementales:

    2º) con webmin he configurado un servidor virtual y he generado los ficheros que mencionas y que deberías ser copiados en un rasp que quisiera hacer de cliente del servidor:ca.crt (Autoridad de Certificación), raspberry.crt, portatil.key.

    3º) Mi pregunta es:¿En que directorio del servidor virtual se suponen que deben estar estos ficherosy en que directorio de la rasp que quiere hacer de cliente se deben copiar? También el fichero de configuración raspberry.conf, en que directorio se debe copiar?

  2. hola buenas tengo una duda sobre que versiones estas realizando la configuracion porque la ruta en la 2.3.4 //usr/share/doc/openvpn/examples/easy-rsa/2.0 ya no existe ahora dentro de exameples hay 3 directorios simples-cont y otros dos

    • Hola Fran, buenas noches.

      Tengo una Raspberry Model A+, con Jessie y la versión que tengo ahora (y en la que me basé al hacer la documentación) es:

      Version: 2.2.1-8+deb7u3
      Architecture: armhf

      ¿Necesitas algún fichero en concreto? Te puedo pasar los ficheros que uso, sacando mis personalizaciones.

      Saludos y gracias por la pregunta!

      Alfonso

Deja un comentario

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