VPN Gateway en dominio de enrutamiento alternativo
Por el 16 de Agosto de 2023
Esta configuración establece un gateway VPN en un dominio de enrutado alternativo. Es similar a la configuración Road Warrior VPN salvo que el enrutado a través del VPN no está en el dominio de enrutado principal, por lo que sólo se conectarán a través de la VPN las aplicaciones que ejecutes en el nuevo dominio de enrutado.
Topología de red
- foo es mi máquina local detrás de un NAT
- bar es el vps remoto que hará de gateway
- 172.16.0.0/12 es la red privada para la VPN
Lectura recomendada
- Configuración de WireGuard en ifconfig(8)
- wg(4) sobre la interfaz Wireguard
- pf.conf(5) sección nat-to para redirección de tráfico
- rdomain(4) sobre dominios de enrutado
Configuración en foo
Creo la llave WireGuard:
foo# install -m 0700 -o root -g wheel -d /etc/wireguard
foo# openssl rand -base64 32 > /etc/wireguard/$(hostname).key
foo# chmod og-r /etc/wireguard/$(hostname).key
Creo esta configuración inicial (incompleta) en /etc/hostname.wg0 para obtener la clave pública:
wgkey `cat /etc/wireguard/$(hostname).key`
wgpeer wgendpoint 203.0.113.1 51820 wgaip 0.0.0.0/0 wgpka 25 rdomain 1
inet 172.16.1.1/12
up
Levanto la interfaz y obtengo la clave pública junto a wgpubkey:
foo# sh /etc/netstart wg0
foo# ifconfig wg0 | grep pub
wgpubkey exWwqcq3eBUGu+RLwaZvbjXR4alPY6Wiql+OMB/Rf7s=
Configuración en bar
Creo la llave WireGuard:
bar# install -m 0700 -o root -g wheel -d /etc/wireguard
bar# openssl rand -base64 32 > /etc/wireguard/$(hostname).key
bar# chmod og-r /etc/wireguard/$(hostname).key
Levanto la interfaz y obtengo la clave pública junto a wgpubkey:
bar# sh /etc/netstart wg0
bar# ifconfig wg0 | grep pub
wgpubkey woQ/rc/ubgZYLgJh0ufvhhb7IHDW4CwWTW+BZMlGSS0=
Esta es la configuración de la interfaz, especificando la clave pública de foo:
bar# cat /etc/hostname.wg0
wgkey `cat /etc/wireguard/$(hostname).key` wgport 51820
wgpeer <clave-publica-foo> wgaip 172.16.1.1/32
inet 172.16.1.2/12
up
Completando la configuración de foo
Ahora que tengo la clave pública de bar puedo completar la configuración en foo. Esta es la configuración final de la interfaz en /etc/hostname.wg0:
wgkey `cat /etc/wireguard/$(hostname).key`
wgpeer <clave-publica-bar> wgendpoint 203.0.113.1 51820 wgaip 0.0.0.0/0 wgpka 25 rdomain 1
inet 172.16.1.1/12
up
!route -T 1 add -net default 172.16.1.2
Reenvío de IPs y NAT
bar# echo 'net.inet.ip.forwarding=1' >> /etc/sysctl.conf
bar# sysctl net.inet.ip.forwarding=1
Esta es la línea correspondiente al archivo /etc/pf.conf que debe de ir arriba antes de block:
pass out quick on egress from wg0:network to any nat-to (egress)
Cargo la configuración de Packet Filter:
bar# pfctl -f /etc/pf.conf
Resolución DNS en el nuevo dominio de enrutado
La solución está en usar un par de instancias unwind, una en cada dominio de enrutado, tal y como explico en el artículo VPN road warrior con WireGuard en OpenBSD.
Ejecución de una aplicación desde el nuevo dominio de enrutado
Gracias a la función exec de route(8) puedes lanzar programas en el dominio de enrutado que quieras:
$ route -T 1 exec ungoogled-chromium