Tanto o SNAT quanto o DNAT tratam da tradução tanto para pacotes de entrada quanto de saída, usando o recurso de rastreamento de conexão ( conntrack
) do kernel. Portanto, se o kernel detectar que um pacote na direção inversa pertence a uma conexão NAT, ele fará a tradução reversa automaticamente, sem uma regra especial para ele.
É por isso que, por exemplo uma única regra SNAT é suficiente (embora não atrapalhe se você tiver uma regra DNAT para outra direção).
E sim, MASQUERADE é basicamente SNAT com o endereço retirado da interface. Para citar man iptables-extensions
:
Masquerading is equivalent to specifying a mapping to the IP address of the interface the packet is going out, but also has the effect that connections are forgotten when the interface goes down.
BTW, acho mais simples lembrar que SNAT = Source NAT (altera o endereço de origem do pacote) e DNAT = Destination NAT (altera o endereço de destino do pacote).
Editar
(Normalmente, você deve fazer novas perguntas como uma questão separada).
netstat
mostra apenas conexões entre aplicativos em execução no computador local e outros hosts. Ele não mostra o rastreamento de conexão do kernel. Você pode encontrar informações sobre isso em /proc
(por exemplo, /proc/net/nf_conntrack
) com utilitários adicionais do pacote conntrack
.
A camada de rede não sabe nada sobre "usuários". Uma conexão consiste no endereço de origem, na porta de origem, no endereço de destino e na porta de destino. Isso é tudo que a camada de rede conhece. Ele faz NAT (Network Address Translation), substituindo o endereço de origem / destino, e também substituindo o número de porta de destino / fonte (isto é, local) por algum outro número, se essa porta já estiver em uso.
Portanto, dois usuários em diferentes hosts com portas idênticas (em sua máquina) que não são NAT, terão portas diferentes no host NAT. Dois usuários na mesma máquina sempre usarão portas locais diferentes, o que nunca é um problema. O mesmo se um usuário abrir duas conexões de uma só vez.