Raspberry PI + Ubuntu Server como Router y Cliente Open VPN.

A. Contexto.

En mi actual trabajo —y cuando estoy en casa— necesito estar constantemente conectado mediante VPN. Gracias a que mi computador de escritorio posee 2 tarjetas de red —y doble Windows para arrancar: uno personal y otro corporativo—, he decidido usar una de las tarjetas de red para mantener el equipo constantemente conectado a las redes corporativas, lo cual incluye el controlador de dominio y servidores que necesito utilizar.

La conexión con las redes corporativas se realiza mediante Open VPN, por lo cual planeo utilizar una Raspberry PI 3 + Ubuntu Server 20.04 LTS, a la cual se le instala un cliente de Open VPN y se le configura el OS como router.

Actualmente y simplificadamente, este es el diagrama actual que va hasta mi computador:

Y busco llegar a esto:

Finalmente, necesito agregarle un puerto Ethernet adicional a la Raspberry PI. En este caso en particular utilizaré este dispositivo:

B. Configuración del Cliente Open VPN.

Posterior a la instalación de Ubuntu Server en la tarjeta SD y luego de iniciar la Rasbperry PI, iniciamos con la configuración:

1. Actualizar la lista de paquetes.

sudo apt update

2. Por gusto personal, instalar net-tools para ver las interfaces de red.

sudo apt install net-tools

3. Verificamos las interfaces de red disponibles:

ifconfig

Resultado: Podemos ver que está disponible y activa la conexión mediante el Ethernet integrado en la Rasbperry.

3. Instalar cliente de Open VPN.

sudo apt install openvpn

4. Cargar el perfil de conexión en el directorio /etc/openvpn/ y copiarlo cambiando su extensión a .conf .

sudo cp /home/ubuntu/client.ovpn /etc/openvpn/client.conf

5. Abrir el archivo client.conf:

sudo nano /etc/openvpn/client.conf

6. Buscar la línea:

auth-user-pass

Y reemplazarla con:

auth-user-pass pass

7. Crear un archivo para almacenar la contraseña de la conexión:

sudo touch /etc/openvpn/pass

Pegar el usuario en la primera línea y la contraseña de la conexión en la segunda línea y guardar.

8. Habilitar el servicio del cliente Open VPN. El nombre después de openvpn@ debe coincidir con el nombre del perfil que se copió a /etc/openvpn/ .

sudo systemctl enable openvpn@client.service

9. Recargamos la configuración de systemd manager.

sudo systemctl daemon-reload

10. Iniciamos el servicio.

sudo service openvpn@client start

8. Revisamos las interfaces de red:

ifconfig

Y revisamos que aparezca el túnel como una interfaz nueva:

Finalmente, basta con reiniciar la Raspberry y comprobar que la conexión se realiza automáticamente.

C. Configuración de interfaz Ethernet USB.

Como se ve en la imagen anterior, solo está configurado el Ethernet original de la Raspberry (eth0), que para efectos de esta configuración, correspondería a la WAN de nuestra Raspberry Router. Es por esto que necesitamos configurar el adaptador Ethernet USB.

1. Conectar el adaptador USB y conectar un cable RJ45 entre el adaptador y el pc. Luego listar las interfaces de red.

sudo lshw -C network

Podemos ver que aparece disponible la interfaz eth1, que corresponde al adaptador USB. No siempre las interfaces toman el identificador como eth0 y eth1.

2. Abrir el archivo de configuración de red. (El nombre del archivo puede variar).

 sudo nano /etc/netplan/50-cloud-init.yaml

Se puede ver la configuración de la eth0 (WAN), configurado como cliente DHCP.

Reemplazar el código con la siguiente configuración:

network:
    ethernets:
        eth0:
            dhcp4: true
            optional: true
        eth1:
            dhcp4: no
            addresses:
             - 192.168.254.1/24
    version: 2

La interfaz eth1 (LAN) queda configurada con una IP fija en la red 192.168.254.0/24. Puede ser cualquier red, que no colisione con la red casera o alguna red corporativa.

3. Probamos la configuración.

sudo netplan try

4. Guardamos la configuración.

sudo netplan apply

En mi caso, en el computador de la casa utilizo Windows para trabajar, por lo cual es necesario darle también una IP fija a la segunda tarjeta de red dentro de la red 192.168.254.0/24, que apunte como gateway la IP de la Raspberry.

Finalizando la configuración de la tarjeta por el lado del cliente, probamos que hay visibilidad entre la Raspberry y el computador.

D. Configurar Ubuntu como router.

1. Habilitar el forwarding de paquetes ipv4.

sudo sed -i '/net.ipv4.ip_forward/s/^#//' /etc/sysctl.conf

2. Aplicar cambios.

sudo sysctl -p

3. Configurar las reglas iptables para habilitar el ruteo entre la eth1 (LAN) y la tun0 («WAN» hacia la red corporativa).

Packet forwarding.

sudo iptables -A FORWARD -i eth1 -o tun0 -j ACCEPT
sudo iptables -A FORWARD -i  tun0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

Nating.

sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

4. Hacer las reglas persistentes. Durante la instalación se guardarán automáticamente las reglas ya configuradas.

sudo apt install iptables-persistent

5. Finalmente solo queda reiniciar la Raspberry y verificar que el túnel OpenVPN y el ruteo levanten automáticamente.

Adicionalmente, es necesario agregar las rutas estáticas por el lado del cliente (Windows en mi caso) y verificar que podamos llegar a las redes corporativas declaradas.

route -p ADD 192.168.4.0 MASK 255.255.255.0 192.168.254.1

Un ejemplo del trace hasta el host 192.168.4.254, un equipo ubicado en las redes corporativas.

Páginas de referencia.