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 dewg0
) - 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 │
└─────┘ └─────┘
S
es el servidor VPN y se puede acceder a él en Internet a través de una IP estática;X
es 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;A
es un "cliente remoto" que quiere conectarseX
;B
es un "cliente local" que quiere conectarseX
y está en la misma red local.
Quiero eso A
y B
puedo conectarme a X
travé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, A
podemos hacer ping a google.com directamente, pero lo haremos X
a 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 iptables
y 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
B
La configuración de es similar a la de A
, pero con IP 172.9.9.101
y 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 A
modo que
AllowedIPs = 172.9.9.0/24
luego, para A
, los paquetes se enrutan según lo previsto (por ejemplo, puedo curl ifconfig.me
obtener A
la IP pública), pero si hago lo mismo en X
, no funcionará y los paquetes que no vayan 172.9.9.0/24
no se entregarán.
EDITAR #1
Olvidé mencionar que también me encantaría que, al conectarme X
, los clientes locales, como por ejemplo, B
no enviaran paquetes fuera de la red local, así B -> Router -> X
que no B -> Router -> S -> Router -> X
.
Respuesta1
Establezca AllowedIPs
las 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 AllowedIPs
para 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 AllowedIPs
el 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.101
y 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 AllowedIPs
tanto en el concentrador como en los radios para incluir esas direcciones IP.
Por ejemplo, si la dirección de A eth0
es 198.51.100.65
, la de B es 192.168.0.66
y 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 AllowedIPs
en 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/32
si lo prefiere).
Con su configuración actual, donde tiene AllowedIPs = 0.0.0.0/0
X, cuando ejecuta curl 198.51.100.65
desde 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/24
me 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 X
y B
comunicarse directamente sin pasar por S
. La otra respuesta ayuda a entender eso.
EDITAR
Parece que también funciona eliminando el DNS
campo, por lo que debería usar el mismo servidor DNS para ambas interfaces.