Digamos que eu tenha 3 peers wireguard: meu PC, um servidor VPS ao qual tenho acesso total e um servidor VPN, ao qual não tenho. O que estou tentando fazer é rotear todo o meu tráfego do PC pelo VPS e depois pelo servidor VPN. O servidor VPS em si não deve rotear o tráfego pela VPN, é claro.
Li este guia - https://www.procustodibus.com/blog/2022/06/multi-hop-wireguard/#internet-gateway-as-a-spoke . Fiz tudo conforme descrito em, exceto que não consigo configurar o peer C, servidor VPN no meu caso. Não funciona. Quando habilitado, não tenho acesso à internet nem à rede do wireguard (10.0.0.*).
Aqui está minha configuração no servidor VPS:
[Interface]
Address = 10.68.200.191/32,10.0.0.1/32
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
PrivateKey = <KEY>
Table = 123
PreUp = ip rule add iif wg1 table 123 priority 456
PostDown = ip rule del iif wg1 table 123 priority 456
[Peer]
PublicKey = <KEY>
AllowedIPs = 10.0.0.2/32
[Peer]
PublicKey = <KEY>
AllowedIPs = 0.0.0.0/0
Endpoint = <VPN_ADDR>:51820
Então, existe alguma maneira de conseguir o que quero sem acessar o último peer?
O servidor VPN espera que o cliente tenha um endereço IP específico (10.68.200.191). Sua própria configuração WireGuard não aceitará tráfego vindo de outros endereços (como 10.0.0.2), e mesmo se aceitasse, o servidor não teria uma rota de volta para esses endereços arbitrários.
Então, para que isso funcione, seu VPS deve fazer NAT (
SNAT
ouMASQUERADE
) em todo o tráfego que vai para esse peer, ou seja, reescrever todo o tráfego para que pareça vir do próprio endereço do VPS (10.68.200.191).Atualmente, você está adicionando uma regra MASQUERADE do iptables que corresponde apenas aos pacotes que saem por
-o eth0
– que é o que você usaria se o próprio VPS fosse um servidor VPN para acesso à Internet – mas não é para lá que os pacotes estão indo no seu caso; em vez disso, o tráfego está voltando pelo mesmowg1
, então é isso que a regra MASQUERADE precisa corresponder.Quando tanto o cliente quanto o servidor VPN estão conectados pela mesma interface, a regra provavelmente deve ser reduzida para também corresponder ao endereço IP de origem, ou seja
-s 10.0.0.2/32
, além do-o wg1
. Mas como os pares representam duas redes completamente distintas, eu realmente recomendaria usar duas interfaces separadas e roteamento entre elas...Além disso, quando a interface tem vários endereços IP, o MASQUERADE pode nem sempre escolher o correto automaticamente. Novamente, isso seria melhor resolvido usando duas interfaces WireGuard separadas para representar suas conexões com as duas redes – mas se você insistir em usar uma única interface, então substituir
MASQUERADE
porSNAT
deixaria você especificar o endereço desejado com--to-source
. Veja a documentação 'man iptables-extensions'.(Fora isso, ambas as ações fazem exatamente a mesma coisa; MASQUERADE é apenas SNAT automático.)