História
Eu tenho uma interface virtual VPN wireguard wg0
(pode ser qualquer outra coisa) e uma interface física eth0
. Desejo rotear pacotes da VPN para minha LAN ou de uma interface para outra interface.
Quase todos os blogs, artigos, tutoriais aconselham usando MASQUERADE
ou Source NAT
apenas:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Além disso, IP masquerade
é simplesmente um SNAT (Source NAT), não altera a porta de origem.
Pergunta
- Estou errado em pensar que deveria usar um NAPT/PAT em vez disso?
- Para completar, como posso adicionar uma regra NAPT/PAT com iptables e/ou nftables?
Pensamentos
Pode haver conflitos (porta de origem) entre os pacotes gerados pelo host e encaminhados de wg0
(ou qualquer outra interface virtual/física). IMHO NAPT deve ser usado para evitar esses conflitos.
Se o destino puder rotear seu tráfego para a origem, nenhum NAT ou PAT será necessário.
Como exemplo, nenhum NAT/PAT é necessário se os clientes VPN em 10.8.0.0/24 quiserem conversar com seus dispositivos LAN em 192.168.1.0/24, desde que os dispositivos envolvidos possam rotear para a outra rede (através de seu gateway ).
Quando a origem está em uma rede rfc1918 (IP privado) e o destino é um IP público, porque as redes rfc1918 não são roteáveis pela Internet, é necessário um NAT para substituir o IP privado pelo IP público. Esta é a tradução do endereço de origem. Este trabalho pode ser feito por um SNAT, não por um PAT.
Além disso, você está errado assumindo que SNAT/MASQUERADE não altera as portas de origem.
https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#SNATTARGET
Observe que, se seu dispositivo deseja acessar um servidor remoto em uma determinada porta de destino, há chances de que o sistema operacional já tenha atribuído uma porta de origem aleatória acima de 1024. Alcançar um servidor HTTPS remoto na porta 443 não envolve que a porta de origem seja 443.
Você tem de alguma forma a distinção errada entre
SNAT/MASQUERADE
eNAPT/PAT
. Não está lá.No Linux, existem dois tipos de regras NAT dinâmicas, as quais você chama de "NAPT":
SNAT
eMASQUERADE
. A diferença entre eles é que com o SNAT você é obrigado a especificar na regrapara qual endereço traduzir (e, provavelmente, qual intervalo de portas usar), enquanto com o MASQUERADE ele faz a própria escolha, com base em qual interface o pacote está destinado a sair. Ambos devem ser instalados naPOSTROUTING
cadeia, após a maioria dos outros processamentos terem sido realizados, incluindo o roteamento do pacote. Este tipo de regra é usado para permitir que muitos computadores fiquem ocultos atrás de um único endereço IP de saída, por exemplo, para acessar a Internet para a LAN e assim por diante. Isso inclui qualquer usuário de VPN também, se você pretende acessar a Internet via VPN.DNAT
,REDIRECT
,CLUSTERIP
e provavelmente algumas outras, não me lembro de todas; estes são instalados emPREROUTING
cadeia, porque a decisão de roteamento geralmente deve ser alterada sob a influência da regra. O pacote que originalmente se destinava à própria máquina (tem seu endereço como destino) e deveria ser percorridoINPUT
e alcançado algum processo local, está sendo traduzido e, após percorrerFORWARD
chain ele está sendo encaminhado para algum outro sistema. Ou vice-versa. Para onde ir, INPUT ou FORWARD, é a decisão de roteamento que devemos alterar com a regra. Este tipo de regra é utilizado para fazer o acesso a algum sistema interno a partir da Internet.Às vezes, a propósito, ambas as regras podem ser usadas para um único pacote (e conexão). Este é o caso especial, mas útil se você precisar que os pacotes de algum sistema externo (portanto, o DNAT deve ser usado no PREROUTING) apareçam como vindos de algum endereço interno (para o qual o SNAT é usado no POSTROUTING).
No Linux também existem as regras estáticas do tipo NAT,
NETMAP
que são bastante especiais e raramente usadas. Duvido que você esteja falando sobre isso e que tenha visto algum howto que mencione esse tipo de regra.O Linux não faz absolutamente nenhuma distinção entre endereços privados (RFC1918) e públicos. Você pode NAT em sua sub-rede pública se quiser (mas isso será um desperdício de endereços). Você pode deixar IPs privados sem tradução (mas geralmente isso não levará à conectividade com a Internet para eles).
A VPN nada mais é do que interface de rede adicional na máquina e deve ser tratada como tal. Consequentemente, você tem permissão para usar endereços públicos para VPN, se os tiver. Por exemplo, eu posso ter alguma sub-rede /29 roteada pelo roteador VPN e configurar o OpenVPN para que toda essa sub-rede pública seja minha rede VPN! Embora o exemplo do OpenVPN pareça artificial, é muito mais provável que o WireGuard seja configurado assim. Por exemplo, a nova solução de namespace permite que o wireguard seja a única interface no sistema. Se houver um requisito para que o sistema tenha diretamente um IP público (não discutirei os motivos pelos quais esse requisito pode vir), é inevitável que você acabe usando IPs públicos dentro da VPN! Muito provavelmente, sem nenhum NAT para eles.