VPN Server con Raspberry pi

PUBLISHED ON FEB 29, 2020 / 5 MIN READ — VPN

Aprovechando la raspberry pi 3b+ podemos montarnos un servidor VPN local con OpenVPN.

Lo primero

Ya teniendo instalados en la raspberry pi [Raspbian Lite] (https://www.raspberrypi.org/downloads/raspbian/)

Partiremos de la base de tener instalado raspbian lite y operativa la Raspberry. En caso contrario, te recomiendo que mires algunos de estos links:

Teniendo todo funcionando… actualizamos:

Sudo apt update
Sudo apt full-upgrade

OpenVPNLogo

Paso 1 -Instalación de OpenVPN

Antes de empezar con la instalación deberíamos saber que es OpenVPN: OpenVPN es una herramienta de conectividad basada en software libre: SSL (Secure Sockets Layer), VPN Virtual Private Network (red virtual privada). OpenVPN ofrece conectividad punto-a-punto con validación jerárquica de usuarios y host conectados remotamente.

Para la instalación usamos de referencia varios manuales y páginas de internet que dejaré al final del post. El que nos ha resultado más útil ha sido el de Digital Ocean

sudo apt install openvpn

Paso 2 – Construir Certificado de Autoridad, de servidor y de usuarios

Lo ideal sería tener una CA (Autoridad de Certificación) separada, pero en este caso utilizaremos la misma Raspberry para generar los certificados de la CA, del servidor y de los clientes que se conectarán.

En la mayoría de manuales traen instrucciones de instalación de versiones anteriores, por lo que habría que tener en cuenta a la hora de hacerlo, en nuestro caso hemos instalado:

wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
cd ~
tar xvf EasyRSA-unix-v3.0.6.tgz
sudo cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa
cp vars.example vars

Una vez copiados editamos el fichero de ejemplo que ahora se llama vars.

Sudo vim vars

Los parámetros de configuración que hemos metido pueden variar dependiendo de las necesidades de cada uno, por lo que hemos cogido como base unos parámetros básicos y luego hemos ido agregando. Por ejemplo:

export KEY_COUNTRY="ES"
export KEY_PROVINCE=”Madrid"
export KEY_CITY="Madrid"
export KEY_ORG="ORGANIZATION "
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"

Creamos los certificados de la CA

./easyrsa init-pki
./easyrsa build-ca
./easyrsa gen-req servidor nopass

./easyrsa sign-req server servidor

Creacion de certificado de cliente…

./easyrsa gen-req guest nopass

Firmado

Sudo ./easyrsa sign-req client guest

Se han creado dos certificados guest y de los otros usuarios. Verificamos que esta todo correcto

openssl verify -CAfile pki/ca.crt pki/issued/guest.crt

Paso 3- Creamos los parámetros Diffie-Hellmann y la clave tls-auth

Generamos el Diffie-Hellmann

 sudo ./easyrsa gen-dh

El paso anterior puede tardar varios minutos, por lo que no te deberías asustar si ves que no avanza. Mientras te dejo un Enlace sobre Diffie-Hellman para que vayas leyendo algo.

Una vez terminado el comando anterior, generamos la clave tls

openvpn --genkey --secret ta.key

Esta clave ta.key deberemos colocarla en el servidor y en TODOS los clientes. Llegados a este punto ya deberíamos tener:

  • Lado Servidor: CA.crt , server.crt, server.key, dh.pem, ta.key
  • Lado Cliente: CA.crt, cliente.crt,cliente.key, ta.key

Ahora nos copiamos los archivos

sudo mkdir /etc/openvpn/keys
sudo cp pki/dh.pem /etc/openvpn/keys
sudo cp pki/ca.crt /etc/openvpn/keys
sudo cp pki/private/servidor.key /etc/openvpn/keys
sudo cp pki/issued/servidor.crt /etc/openvpn/keys
sudo cp ta.key /etc/openvpn/keys

Descargar los archivos: Este paso depende de cómo se haga. En nuestro caso, hemos copiado los archivos a tmp y los hemos descargado a nuestro equipo con “scp”

sudo cp /etc/openvpn/easy-rsa/pki/private/guest.key /tmp
sudo cp /etc/openvpn/easy-rsa/pki/issued/guest.crt /tmp
sudo cp /etc/openvpn/easy-rsa/pki/ca.crt /tmp
sudo cp /etc/openvpn/easy-rsa/ta.key /tmp
scp pi@x.154.xxx.1xx/tmp/guest.key ~/Documents/certificados
………

Paso 4- Configuracion del servicio de OpenVPN

Ya tenemos los certificados y “keys” tanto de cliente como de servidor, Asi que vamos a configurar el servicio que utilizarán esas credenciales.

En el que será el servidor modifcamos el archivo de configuración.

sudo vim /etc/openvpn/server.conf

En el archivo vamos a configurar los parámetros:

tls-auth ta.key 0 # This file is secret
auth SHA256
dh dh.pem

Opcionales:

  • Puerto y protocolo: cambiar el Puerto por defecto al puerto 443
port 443
proto udp #or proto tcp
  • Redirect all traffic: forzamos que todas las conexiones usen el túnel.
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
  • Certificados de credenciales: tenemos que cambiar los nombres dependiendo de los que hemos generado .
cert server.crt
key server.key

Cerramos y guardamos los cambios.

Paso 5- Configuración de trafico de red.

Debemos realizar algunas configuraciones para que el servidor nos de salida a internet una vez que establezcamos la conexión.

Tenemos que habilitar ip-gordwarding:

sudo vim /etc/sysctl.conf

Tenemos que habilitar el net.ipv4.ip_fordward

net.ipv4.ip_forward=1

Verificamos:

sudo sysctl -p

Continuamos con las indicaciones de modifcación de las [tablas] (https://www.instructables.com/id/Raspberry-Pi-VPN-Gateway/), Muy importante no olvidarse el comando:

iptables -t nat -A POSTROUTING -s 192.X.X.X/24 -o eth0 -j MASQUERADE

Tenemos la explicación de los parámetros muy bien explicados en algunos tutoriales como el deDigital Oceans, en la sección de “prerrequisitos”.

Paso 6- Inicializamos el servicio OpenVPN

Configuramos el servicio openvpn y lo lanzamos.

sudo systemctl start openvpn

Verificamos el estado:

sudo systemctl status openvpn

Si se ha inicializado correctamente el status debería ser “Active(running)”. Tambien deberíamos verificar la interfaz tun0

ip addr show tun0

Por ultimo habilitamos el servicio para que se inicie automáticamente

sudo systemctl enable openvpn

Paso 7- Configuración de el/los cliente/s

En el cliente instalamos openvpn y creamos un archivo de configuración. Para ello primero copiamos el archivo de ejemplo para modificarlo o directamente creamos uno y metemos los parámetros.

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client/guest.opvn

Editamos las líneas con los siguientes parámetros:

proto upd
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
auth SHA256

Ya tendriamos configurado el cliente tambien solamente quedaría probar la conexión:

sudo openvpn --config /etc/openvpn/client/guest.ovpn

Configuramos cliente y servidor y probamos desde el cliente…

sudo openvpn --config /etc/openvpn/client/guest.opvn

Paso 8 – Opcional – Certificados en el archivo opvn

Una vez que comprobamos que el funcionamiento es correcto, podemos incluir los certificados dentro del archivo de configuración del archivo ovpn. Openvpn permite la inclusión de archivos en la configuración principal de la –ca, –cert, –dh, –extra-certs, –key, –pkcs12, –secret y –tls-auth opciones, Otro Ejemplo

<cert> -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- </cert>
.........

Paso 8 – Próximos pasos

Los próximos pasos serian configurar dentro de un dominio propio la actualización de Dynamic ddns para que la configuración no tenga que ser manual.

Referencias: