Configurar el servidor VPN en Raspberry Pi

Jinku Hu 14 abril 2022
Configurar el servidor VPN en Raspberry Pi

Este artículo demostrará cómo configurar un servidor VPN en dispositivos Raspberry Pi.

Configurar el paquete VPN de WireGuard en el sistema operativo Raspberry Pi

En general, existen muchos protocolos e implementaciones diferentes para el servidor VPN, pero este artículo eligió el software WireGuard como una opción contemporánea predominante.

El paquete de software suele estar disponible en los repositorios predeterminados y debería poder instalarlo con el siguiente comando:

sudo apt install wireguard

Una vez que haya instalado el paquete wireguard, varias herramientas de línea de comandos estarán disponibles en su sistema Raspberry Pi para manipular la configuración y las interfaces de WireGuard.

WireGuard generalmente agrega una nueva interfaz de red virtual al sistema. WireGuard implementa un concepto de enrutamiento CryptoKey, que se denota mediante la asociación de claves públicas/privadas a cada par.

Es decir, los pares son solo actores en el túnel VPN, cada uno identificado por claves públicas únicas. Entonces, necesitamos generar estas claves e incluirlas en los archivos de configuración correspondientes.

Dado que los archivos de configuración y las claves privadas deben considerarse información confidencial, invocamos el comando umask 0700 antes de generar las claves y almacenarlas en el directorio /etc/wireguard.

En consecuencia, solo los propietarios de estos archivos pueden leer/escribir el contenido más adelante.

umask 0700; wg genkey | sudo tee /etc/wireguard/private.key

Salida de muestra:

2RzKFbGMx5g7fG0BrWCI7JIpGvcwGkqUaCoENYueJw4=

El comando anterior almacenará la clave en el archivo private.key y la imprimirá para copiarla fácilmente.

A continuación, crearemos un archivo de configuración llamado wg0.conf en el mismo directorio /etc/wireguard e incluiremos los siguientes contenidos en él:

[Interface]
PrivateKey = 2RzKFbGMx5g7fG0BrWCI7JIpGvcwGkqUaCoENYueJw4=
Address = 10.10.10.1/24
ListenPort = 51820

Tenga en cuenta que este archivo de configuración es para Raspberry Pi peer, y puede cambiar el nombre de la parte wg0 como desee.

Debe copiar y reemplazar el valor PrivateKey con la clave generada con el comando anterior. Además, puede especificar un puerto que aceptará conexiones entrantes y la dirección del par.

Ahora podemos pasar al otro par (Peer A), que debería conectarse a la Raspberry Pi. En este punto, asumimos que la otra máquina está basada en Linux y que ha instalado el paquete WireGuard en ella en consecuencia.

La configuración Peer A seguirá los mismos pasos para reutilizar el comando para generar la clave pública y ejecutarla. Tenga en cuenta que las claves se pueden generar en una máquina, pero dado que las claves privadas están destinadas a ser secretas, las estamos desarrollando en las máquinas pares correspondientes.

Una vez que se genera la clave privada, cree un archivo de configuración (por ejemplo, wg0.conf) en el directorio /etc/wireguard e inserte las siguientes líneas:

[Interface]
PrivateKey = 9jalV3EEBnVXahro0pRMQ+cHlmjE33Slo9tddzCVtCw=
Address = 10.10.10.2/32

Tenga en cuenta que el valor de PrivateKey aquí es arbitrario y debe reemplazarlo con el válido. Al mismo tiempo, la dirección IP puede modificarse si tiene necesidades específicas de configuración de red.

Después de esto, tenemos que generar claves públicas y almacenarlas en sus archivos de configuración. Las claves públicas se derivan de las claves privadas y, en nuestro caso, deberán generarse en ambos dispositivos.

Use el siguiente comando para generar una clave pública en Raspberry Pi y la segunda en la otra máquina:

sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

Ahora, insertemos la sección de pares en el archivo de configuración. Las siguientes líneas deben agregarse al archivo Raspberry Pi /etc/wireguard/wg0.conf:

[Peer]
PublicKey = PRIVATE_KEY_OF_PEER_A
AllowedIPs = 10.10.10.2/32

Tenga en cuenta que el valor de IP permitidas es el mismo que la dirección IP especificada en el valor de Dirección del archivo de configuración Peer A.

Además, reemplace PRIVATE_KEY_OF_PEER_A con la clave privada generada en Peer A. Por otro lado, agregue las siguientes líneas al archivo wg0.conf en la máquina Peer A.

Asegúrese de reemplazar el valor de la clave privada con el correspondiente y la dirección Endpoint con la dirección del dispositivo Raspberry Pi. Tenga en cuenta que la siguiente configuración hará que la conexión VPN sea unilateral, ya que solo el Peer A accederá a la red Raspberry Pi.

[Peer]
PublicKey = PRIVATE_KEY_OF_RASPBERRY
AllowedIPs = 0.0.0.0/0
Endpoint = 172.16.0.134:51820

Finalmente, debe iniciar el servicio correspondiente en el lado de Raspberry Pi usando el comando:

sudo systemctl enable wg-quick@wg0.service

Mientras que Peer A usará el siguiente comando cada vez que quiera crear una interfaz de túnel y conectarse a ella:

sudo wg-quick up wg0

Puede eliminar la interfaz y terminar la conexión existente desde el Peer A con el comando:

sudo wg-quick down wg0

Cómo enrutar todo el tráfico Peer A a través de Raspberry Pi

En este punto, Peer A no podrá acceder a Internet, sino solo a la red Raspberry Pi. Necesitamos agregar parámetros adicionales a los archivos de configuración para que esto suceda.

Comencemos con el archivo Peer A wg0.conf y agreguemos la siguiente línea en la sección [Interface]:

DNS = DNS_ADDRESS_USED_BY_RASPBERRY

Este valor de dirección DNS depende de la configuración de la red, por lo que debe recuperar la que está actualmente activa y actualizarla si, por alguna razón, cambia en el futuro.

Por otro lado, debe agregar estas líneas adicionales al archivo wg0.conf de Raspberry Pi:

PostUp = ufw route allow in on wg0 out on eth0
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on eth0
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Tenga en cuenta que el nombre wg0 deberá cambiarse en estas líneas si crea un nombre de archivo diferente para los archivos de configuración.

Una vez que haya guardado los cambios de wg0.conf, abra el archivo /etc/sysctl.conf y descomente/modifique las líneas:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Normalmente, net.ipv6.conf.all.forwarding sólo es necesario si también incluye direcciones IPv6 en los archivos de configuración. Después de esto, debes ejecutar el siguiente comando para que los cambios surtan efecto:

sudo sysctl -p

Ahora, debe conectarse y reenviar todo su tráfico de Internet desde Peer A a través de Raspberry Pi. Sin embargo, si está ejecutando un firewall en Raspberry Pi, asegúrese de configurar las reglas correspondientes para Peer A, o no podrá acceder a la red en absoluto.

Puede ver nuestra introducción al cortafuegos ufw aquí.

Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - Raspberry Pi