Configuramos una VPN simple con WireGuard y Raspberry Pi como servidor

Dado que WireGuard se convertirá en parte de el futuro núcleo de Linux 5.6, decidí investigar la mejor manera de integrar esta VPN con mi enrutador/punto de acceso LTE en Raspberry Pi.

Hardware

  • Raspberry Pi 3 con módulo LTE y dirección IP pública. Aquí se establecerá el servidor VPN (en adelante denominado edgewalker)
  • Teléfono Android que debe usar la VPN para todas las comunicaciones
  • Portátil Linux que debe utilizar la VPN solo dentro de la red

Cada dispositivo conectado a la VPN debe poder comunicarse con todos los demás dispositivos. Por ejemplo, el teléfono debe poder conectarse al servidor web en el portátil, siempre que ambos dispositivos sean parte de la red VPN. Si la configuración resulta ser lo suficientemente sencilla, se podría considerar conectar también el escritorio a la VPN (por Ethernet).

Dada la creciente inseguridad de las conexiones por cable e inalámbricas con el tiempo (ataques dirigidos, ataque KRACK que compromete WPA2 y ataque Dragonblood contra WPA3), estoy considerando seriamente usar WireGuard para todos mis dispositivos, independientemente del entorno en el que operen.

Instalación del software

WireGuard ofrece paquetes precompilados para la mayoría de las distribuciones de Linux, Windows y macOS. Las aplicaciones para Android e iOS se proporcionan a través de las tiendas de aplicaciones.

Tengo la última Fedora Linux 31, y antes de la instalación, no me tomé la molestia de leer la guía. Simplemente encontré los paquetes wireguard-tools, los instalé y luego no pude entender por qué nada funcionaba. Una investigación posterior reveló que no tenía instalado el paquete wireguard-dkms (con el controlador de red), y no estaba en el repositorio de mi distribución.

Si hubiera leído las instrucciones, habría tomado los pasos correctos:

$ sudo dnf copr enable jdoss/wireguard
$ sudo dnf install wireguard-dkms wireguard-tools

En Raspberry Pi tengo la distribución Raspbian Buster instalada, allí ya hay un paquete wireguard, lo instalamos:

$ sudo apt install wireguard

En el teléfono Android, instalé la aplicación WireGuard VPN desde la tienda oficial de Google App Store.

Instalación de claves

Para la autenticación de nodos, Wireguard utiliza un sencillo esquema de claves privadas/públicas para autenticar los nodos VPN. Puedes crear fácilmente claves VPN con el siguiente comando:

$ wg genkey | tee wg-laptop-private.key | wg pubkey > wg-laptop-public.key
$ wg genkey | tee wg-server-private.key | wg pubkey > wg-server-public.key
$ wg genkey | tee wg-mobile-private.key | wg pubkey > wg-mobile-public.key

Esto nos da tres pares de llaves (seis archivos). No haremos referencia a los archivos en las configuraciones, sino que copiaremos aquí el contenido: cada llave es una línea en base64.

Creación de un archivo de configuración para el servidor VPN (Raspberry Pi)

La configuración es bastante simple, he creado el siguiente archivo /etc/wireguard/wg0.conf:

[Interface]
Address = 10.200.200.1/24
ListenPort = 51820
PrivateKey = 
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o wwan0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o wwan0 -j MASQUERADE

[Peer]
# laptop
PublicKey = 
AllowedIPs = 10.200.200.2/32

[Peer]
# teléfono móvil
PublicKey = 
AllowedIPs = 10.200.200.3/32

Un par de observaciones:

  • En los lugares correspondientes se deben insertar las líneas de los archivos con las llaves
  • Mi red VPN utiliza un rango interno 10.200.200.0/24
  • Para los comandos PostUp/PostDown he especificado la interfaz de red externa wwan0, es posible que tengas otra (por ejemplo, eth0)

La red VPN se inicia fácilmente con el siguiente comando:

$ sudo wg-quick up wg0

Un pequeño detalle: usé dnsmasq asociado a la interfaz de red br0, también añadí dispositivos wg0 a la lista de dispositivos permitidos. En dnsmasq, esto se hace añadiendo una nueva línea con la interfaz de red al archivo de configuración /etc/dnsmasq.conf, por ejemplo:

interface=br0
interface=wg0

Además, añadí una regla de iptables para permitir el tráfico en el puerto UDP de escucha (51280):

$ sudo iptables -I INPUT -p udp --dport 51820 -j ACCEPT

Ahora que todo funciona, podemos configurar el inicio automático del túnel VPN:

$ sudo systemctl enable wg-quick@wg0.service

Configuración del cliente en la computadora portátil

En la computadora portátil creamos un archivo de configuración /etc/wireguard/wg0.conf con la misma configuración:

[Interface]
Address = 10.200.200.2/24
PrivateKey = 

[Peer]
PublicKey = 
AllowedIPs = 10.200.200.0/24
Endpoint = edgewalker:51820

Notas:

  • En lugar de edgewalker, debes especificar la IP pública o el host del servidor VPN
  • Al instalar AllowedIPs en 10.200.200.0/24, utilizamos VPN solo para acceder a la red interna. El tráfico hacia todas las demás IPs/servidores seguirá yendo por los canales "normales" abiertos. También se usará un servidor DNS preconfigurado en la computadora portátil.

Para pruebas y para el inicio automático usamos los mismos comandos wg-quick y systemd:

$ sudo wg-quick up wg0
$ sudo systemctl enable wg-quick@wg0.service

Configuración del cliente en el teléfono Android

Para el teléfono Android creamos un archivo de configuración muy similar (lo llamaremos mobile.conf):

[Interface]
Address = 10.200.200.3/24
PrivateKey = 
DNS = 10.200.200.1
        
[Peer]
PublicKey = 
AllowedIPs = 0.0.0.0/0
Endpoint = edgewalker:51820

A diferencia de la configuración en la laptop, el teléfono debe usar nuestro servidor VPN como servidor DNS (línea DNS), así como enrutar todo el tráfico a través del túnel VPN (AllowedIPs = 0.0.0.0/0).

En lugar de copiar el archivo en el dispositivo móvil, se puede convertir en un código QR:

$ sudo apt install qrencode
$ qrencode -t ansiutf8 < mobile.conf

El código QR aparecerá en la consola como ASCII. Se puede escanear desde la aplicación VPN de Android y configurar automáticamente el túnel VPN.

Salida

Configurar WireGuard es simplemente mágico en comparación con OpenVPN.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster