Aprovechando la raspberry pi 3b+ podemos montarnos un servidor VPN local con OpenVPN.
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
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
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
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:
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
………
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:
port 443
proto udp #or proto tcp
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
cert server.crt
key server.key
Cerramos y guardamos los cambios.
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”.
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
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
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>
.........
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.