Enrutar solo la red privada en Wireguard VPN

Enrutar solo la red privada en Wireguard VPN

Tengo algunos hosts detrás de un enrutador NAT a los que quiero acceder a través de una VPN Wireguard. Pude configurar exitosamente la red privada, pero todavía hay algo que me desconcierta.

Quiero que cada compañero:

  • acceder entre sí ( 172.9.9.*) a través de la VPN (a través de wg0)
  • acceder a todos los demás hosts fuera de la VPN (a través de eth0).

Aquí hay un esquema de la red y la configuración actual:

┌─────┐    ┌──────────┐    ┌─────┐
│  S  ├────┤ Internet ├────┤  A  │
└─────┘    └───┬──────┘    └─────┘
          ┌────┴─────┐
          │ NAT DHCP │
       ┌──┤  Router  ├──┐
       │  └──────────┘  │
       │                │
    ┌──┴──┐          ┌──┴──┐
    │  X  │          │  B  │
    └─────┘          └─────┘
  • Ses el servidor VPN y se puede acceder a él en Internet a través de una IP estática;
  • Xes un "servidor informático", puede acceder a Internet, pero está detrás de una NAT y su IP es dinámica y no se conoce de antemano;
  • Aes un "cliente remoto" que quiere conectarse X;
  • Bes un "cliente local" que quiere conectarse Xy está en la misma red local.

Quiero eso Ay Bpuedo conectarme a Xtravés de S, pero todos estos hosts deben usar la VPN solo cuando se contactan entre sí y no cuando acceden a Internet.

Entonces, por ejemplo, Apodemos hacer ping a google.com directamente, pero lo haremos Xa través de S.

Después de buscar y leer la documentación, todavía no me queda claro si es posible hacer esto sin usar iptablesy si es posible hacerlo usando solo la configuración wireguard.

La configuración actual es la siguiente:

## S wg0.conf

[Interface]
PrivateKey = S-private-key
Address = 172.9.9.1/24
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820

[Peer]
# A
PublicKey = A-public-key
AllowedIPs = 172.9.9.100/32

[Peer]
# B
PublicKey = B-public-key
AllowedIPs = 172.9.9.101/32

[Peer]
# X
PublicKey = X-public-key
AllowedIPs = 172.9.9.10/32
# A wg0.conf

[Interface]
Address = 172.9.9.100/24
PrivateKey = A-private-key
DNS = 1.1.1.1

[Peer]
PublicKey = S-public-key
Endpoint = S-ip-address:51820
AllowedIPs = 0.0.0.0/0, ::/0

BLa configuración de es similar a la de A, pero con IP 172.9.9.101y clave privada diferente.

# X wg0.conf

[Interface]
Address = 172.9.9.10/24
PrivateKey = X-private-key
DNS = 1.1.1.1

[Peer]
PublicKey = S-public-key
Endpoint = S-ip-address:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25  # To keep the server reachable

Esta configuración funciona y todos los hosts pueden acceder entre sí a través de la VPN, pero quiero que SÓLO el tráfico dirigido a los hosts 172.9.9.*pase por esta VPN. El resto del tráfico será enrutado por la puerta de enlace predeterminada.

Lo que me desconcierta es que, si cambio la configuración de Amodo que

AllowedIPs = 172.9.9.0/24

luego, para A, los paquetes se enrutan según lo previsto (por ejemplo, puedo curl ifconfig.meobtener Ala IP pública), pero si hago lo mismo en X, no funcionará y los paquetes que no vayan 172.9.9.0/24no se entregarán.

EDITAR #1

Olvidé mencionar que también me encantaría que, al conectarme X, los clientes locales, como por ejemplo, Bno enviaran paquetes fuera de la red local, así B -> Router -> Xque no B -> Router -> S -> Router -> X.

Respuesta1

Establezca AllowedIPslas direcciones IP que deseeruta hacia/a través del par.

En una configuración normal de concentrador y radio, en su concentrador (S), configuraría AllowedIPspara cada par como lo ha hecho, enrutando paquetes a cada par solo si usan la dirección IP WireGuard del par como dirección de destino; y en sus radios (A, B y X), configuraría AllowedIPsel CIDR de su red WireGuard ( 172.9.9.0/24), enrutando paquetes al concentrador solo si usan las direcciones IP WireGuard de otro par como dirección de destino.

Entonces, con una configuración normal, accedería a A desde B o X con la dirección IP WireGuard de A 172.9.9.100, B desde A o X con 172.9.9.101y X desde A o B con 172.9.9.10.

Pero si también desea poder acceder a cada radio a través de la dirección IP vinculada a la NIC física del radio (por ejemplo eth0), deberá ajustar AllowedIPstanto en el concentrador como en los radios para incluir esas direcciones IP.

Por ejemplo, si la dirección de A eth0es 198.51.100.65, la de B es 192.168.0.66y la de X es 192.168.0.88, ajustaría los pares en la configuración WireGuard del concentrador a esto:

## S wg0.conf
...

[Peer]
# A
PublicKey = A-public-key
AllowedIPs = 172.9.9.100/32
AllowedIPs = 198.51.100.65/32

[Peer]
# B
PublicKey = B-public-key
AllowedIPs = 172.9.9.101/32
AllowedIPs = 192.168.0.66/32

[Peer]
# X
PublicKey = X-public-key
AllowedIPs = 172.9.9.10/32
AllowedIPs = 192.168.0.88/32

Y establezca AllowedIPsen cada una de las configuraciones de los radios esto:

AllowedIPs = 172.9.9.0/24
AllowedIPs = 198.51.100.65/32
AllowedIPs = 192.168.0.66/32
AllowedIPs = 192.168.0.88/32

(Tenga en cuenta que también puede especificar todos los bloques en una línea, AllowedIPs = 172.9.9.0/24, 198.51.100.65/32, 192.168.0.66/32, 192.168.0.88/32si lo prefiere).


Con su configuración actual, donde tiene AllowedIPs = 0.0.0.0/0X, cuando ejecuta curl 198.51.100.65desde X, lo que sucede es que X enruta los paquetes destinados a A (y todo lo demás) a través de su túnel WireGuard a S, y luego S enruta esos paquetes sin cifrar. Internet a A (enmascarado con la propia dirección IP pública de S); en respuesta, A envía paquetes no cifrados a través de Internet a S, que S enruta a través de su túnel WireGuard a X.

Si quieres asegurarte de que Snuncaenrute los paquetes canalizados a través de su red WireGuard hacia Internet, puede ajustar sus reglas de iptables para evitar esto; algo como lo siguiente probablemente funcionaría:

PostUp = iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -o eth0 -j DROP; iptables -A FORWARD -i eth0 -o wg0 -j DROP

Respuesta2

Tuve un problema con DNS: el uso AllowedIPs = 172.9.9.0/24me permitía hacer ping 8.8.8.8, pero no google.com.

Resolví incluir la interfaz DNS en las IP permitidas, por lo que obtengo resolución DNS a través de VPN, pero el tráfico no está en la VPN:

[Interface]
...
DNS = 1.1.1.1

[Peer]
...
AllowedIPs = 172.9.9.0/24, 1.1.1.1/32

Esto no responde a la segunda pregunta que tenía: si es posible hacer Xy Bcomunicarse directamente sin pasar por S. La otra respuesta ayuda a entender eso.

EDITAR

Parece que también funciona eliminando el DNScampo, por lo que debería usar el mismo servidor DNS para ambas interfaces.

información relacionada