Abrir la LAN con WireGuard

~ 31 Jan 2023

Hasta ahora lo típico para acceder a la LAN de casa era abrir el puerto 22 por ejemplo, y de ahí ya acceder a los equipos de la red. Pero he ido cambiando eso por WireGuard.

Dejando a un lado las ventajas de WireGuard frente a otras VPN, las dos mayores ventajas que me han hecho cambiar a este setup son:

Mi configuración inicial consistía en todos los clientes/peers conectados al servidor VPN que monté en el router. Funcionaba, pero eso me hacía depender de un router con kernel moderno. Por diversas razones ya no puedo tener esa dependencia, además no quiero depende tampoco de tener que abrir puertos. Y para finalizar, me he dado cuenta ahora que el router me limitaba levemente la conexión de la VPN por la velocidad del procesador.

Por eso he pasado a tener la VPN en un VPS externo, y para acceder a la LAN de casa (u otra) lo hago colándome por el túnel, concretamente por el peer del NAS.

Para este setup he recurrido a diferentes artículos de referencia sobre WireGuard. Lo que más me ha ayudado, de lejos, es la página oficial y este comentario:

In other words, when sending packets, the list of allowed IPs behaves as a sort of routing table, and when receiving packets, the list of allowed IPs behaves as a sort of access control list.

Otra página que me ha servido de infinita ayuda es pirate/wireguard-docs. No solo explica cada caso de uso y parámetro, sino que detalla las tripas de WireGuard.

Entre algunos de los problemas que me salieron fue que uno de los peers tenía baja velocidad de transferencia. Resultó ser por el MTU cuando el endpoint iba por IPv6, explicado aquí.

Y para acabar, los tutoriales en el foro de Unraid sobre WireGuard, sobre todo el de LAN-to-LAN, donde vi la idea de crear una ruta estática en casa, algo que soportan todos los routers hoy en día.

El resto es cosa de los comandos ip e iptables de linux .

Configuración modelo

Servidor:

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
MTU = 1412
PrivateKey = ...
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o %i -j MASQUERADE
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PreDown = iptables -D FORWARD -i %i -j ACCEPT
PreDown = iptables -D FORWARD -o %i -j ACCEPT
PreDown = iptables -t nat -D POSTROUTING -o %i -j MASQUERADE
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# Name = nas
PublicKey = ...
AllowedIPs = 10.0.0.2/32, 192.168.1.0/24

Con esto hacemos que cualquier conexión que nos venga para la LAN de casa (192.168.1.0/24) se mande por el peer 10.0.0.2 (el nas).

Ahora la config del nas:

[Interface]
PrivateKey = ...
Address = 10.0.0.2/24
ListenPort = 51820
MTU = 1412
PostUp = iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o br0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o br0 -j MASQUERADE
PostUp = ip -4 route flush table 200
PostUp = ip -4 route add default via 10.0.0.2 table 200
PostUp = ip -4 route add 192.168.1.0/24 via 192.168.1.1 table 200
PostDown = ip -4 route flush table 200
PostDown = ip -4 route add unreachable default table 200
PostDown = ip -4 route add 192.168.1.0/24 via 192.168.1.1 table 200

[Peer]
# Name = vps
PublicKey = ...
Endpoint = 1.2.3.4:51820
AllowedIPs = 10.0.0.0/24, 172.20.0.0/24
PersistentKeepalive = 25

Con este AllowedIPs hacemos que se vaya por el túnel todo lo de la VPN y lo de la red de los Dockers que hay en el VPS. Para que cualquier equipo conectado al router de casa se le aplica la ruta estática configurada en el mismo, que precisamente manda estos dos rangos a la IP local del nas, dicho de otra forma, 172.20.0.0/24 redireccionado al “gateway” 192.168.1.2 . Y las rutas y reglas de iptables sirven precisamente para que cualquiera que venga por el túnel a otro equipo de la LAN, pueda acceder.

El resto de peers de la VPN no necesitan una config especial, por ejemplo al móvil o al portátil les vale con algo así para acceder tanto a la LAN como a los Dockers:

[Interface]
PrivateKey = ...
Address = 10.0.0.x/24
ListenPort = 51820

[Peer]
# Name = movil
PublicKey = ...
Endpoint = 1.2.3.4:51820
AllowedIPs = 192.168.1.0/24, 172.20.0.0/24

Resumiendo:

Total, que todos pueden conectar a todos solo por estar a rango de la VPN.

Y lo mejor de este setup es que me puedo llevar el NAS a otra conexión/casa, o cambiar de proveedor/equipos/router, y con un mínimo ajuste (rutas estáticas) todo funcionaría igual.