Eu tenho uma VPN Wireguard configurada para encaminhar pacotes (com iptables
) recebidos em um VPS para um servidor, o que funciona muito bem. Porém, a configuração automática da eno2
interface (do servidor) pelo Debian cria rotas IP, uma delas é a x:x:x:x::/64 dev eno2
, que é a rede local em que o servidor está.
Isso cria um comportamento indesejado, pois quando eu (da rede local) envio pacotes para o servidor através do VPS (isso significa que o servidor receberá os pacotes na interface wg0
), o servidor responde na rede local (interface eno2
), pois o IPv6 de origem O endereço é o mesmo na Internet e na rede local e, portanto, corresponde à rota x:x:x:x::/64 dev eno2
, mesmo que o tráfego IPv6 não local seja enviado wg0
. E responde com um endereço IP que o computador de onde enviei os pacotes não conhece porque configurei o NAT com o Wireguard.
Conforme está escrito no título isso não ocorre com IPv4, pois ele usa NAT, então o endereço IP de origem não corresponde 192.168.1.0/24 dev eno2
.
Sempre posso me conectar diretamente ao servidor sem passar pelo VPS, ou me conectar com os endereços link-local fe80::/10
quando preciso e substituir a rota configurada automaticamente por uma que tenha métrica mais baixa e preferência mais alta (ex. x:x:x:x::/64 dev wg0 metric 200 pref high
) para manter a configuração automática feita pelo Debian, exceto esta rota. Mas isso não leva em consideração que o prefixo da rede pode mudar. Também consegui fazê-lo funcionar adicionando uma regra SNAT iptables
do VPS, mas isso interrompe os serviços que precisam do endereço IP de origem (por exemplo, SPF).
Existe uma solução melhor para o problema? Talvez adicionando uma rota que envie pacotes de volta wg0
para wg0
e fazendo com que essa rota tenha prioridade sobre a x:x:x:x::/64 dev eno2
rota, para que eu ainda possa acessar o servidor na minha rede local com seu endereço IPv6 público?
Atribua diferentes endereços à VPN fora das redes existentes do servidor. Especialmente diferente de qualquer link /64 passando, digamos, por Ethernet.
Um bom provedor de hospedagem encaminhará vários /64s nunca usados para o seu host mediante solicitação, digamos um /56. Você pode então definir um /64 inteiro para endereços VPN. Como endereços IP públicos, eles podem acessar a Internet, se permitidos por firewalls.
Um provedor de hospedagem menos bom fornecerá apenas prefixos de link adicionais. O gateway deles assumirá que pode fazer NDP sobre Ethernet quando realmente precisar ser roteado através do seu servidor via wg. Faça suas próprias respostas NDP como um hack para fazer isso funcionar, como acontece com o programa ndpresponder.
Se o acesso à Internet não for necessário, considere gerar endereços ULA para fins de endereços VPN. Visite aqui para obter um prefixo ULA só para você.
O espaço de endereço é tão grande que cada pessoa no planeta poderia receber milhares de /48, muito maiores, e talvez então a utilização fosse perceptível. Novas sub-redes para todos os fins são a maneira mais simples do IPv6 de fazer as coisas.
Posso não ter me expressado muito bem, então só para deixar claro: estou usando o VPS como proxy reverso para acessar meu servidor. O cliente do qual desejo acessar o servidor não está na VPN, mas está na mesma rede local do servidor, então esse era o problema:
Enquanto eu esperava:
2001::1
é o endereço IPv6 do cliente,fdea:0335:40b8::2
é o endereço IPv6 do servidor na VPN.Como estou usando ULAs na VPN, posso rotear pacotes com base no endereço de origem (verifique se é um endereço da VPN).
O servidor tem um endereço IPv6 na rede local, por exemplo
x:x:x:x::2
, e um endereço na VPN, por exemplofdea:0335:40b8::2
. Como o VPS encaminha pacotes para o servidor através da VPN alterando o destino IP parafdea:0335:40b8::2
, o servidor responderá com este endereço IPv6. Com essas informações posso fazer o seguinte:Isso resolve o problema porque
fdea:0335:40b8::2/128
é mais específico que a rota mencionada,x:x:x:x::/64
e, portanto, tem prioridade. Posso então adicionar os comandos acima nowg0
arquivo de configuração comPostUp=
ePreDown=
, para que eles fiquem ativos apenas quando necessário.Obrigado a todos que ajudaram, diga-me se alguma coisa precisa de mais esclarecimentos ou algo para tornar esta pergunta e resposta mais explorável.