Eu sei o que significa SNAT e DNAT. E eu sei que quando quero configurar um serviço aberto de servidor de rede local para internet, devo usar:
- SNAT para ajudar a mudar os pacotes vindos do servidor de rede local para o endereço do roteador.
- DNAT para ajudar a mudar os pacotes vindos da internet para o ip de rede local do servidor
Mas quando compartilhamos rede usando MASQUERADE, não precisamos configurar o DNAT para esses pacotes vindos da internet. Alguns artigos dizem que o MASQUERADE é o mesmo que o SNAT, exceto pelo ip externo do roteador. Mas por que o MASQUERADE não precisa da configuração do DNAT? E suponha que o MASUQERADE possa fazer isso por nós, por que o iptables não define automaticamente o SNAT para nós quando configuramos o DNAT?
Editar
Eu só tenho uma nova pergunta. Suponha que dois usuários na rede local naveguem na mesma página da Web e as portas dos clientes que eles abriram sejam as mesmas. Quando a resposta do servidor de páginas da web empacota para o roteador, como o roteador sabe que os pacotes pertencem a qual usuário?
Tanto o SNAT quanto o DNAT fazem tradução de endereços para pacotes de entrada e saída, usando o recurso de rastreamento de conexão (
conntrack
) do kernel. Portanto, se o kernel detectar que um pacote na direção reversa pertence a uma conexão NATed, ele fará a tradução reversa automaticamente, sem uma regra especial para isso.É por isso que, por exemplo, uma única regra SNAT é suficiente (embora não faça mal se você tiver uma regra DNAT para a outra direção).
E sim, MASQUERADE é basicamente SNAT com o endereço retirado da interface. Para citar
man iptables-extensions
:Aliás, 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 pergunta 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
) ou com utilitários adicionais doconntrack
pacote.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 o 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 da porta de destino/origem (ou seja, local) por algum outro número se essa porta já estiver em uso.
Portanto, dois usuários em hosts diferentes com portas idênticas (em suas máquinas) que não são NATed obterão portas diferentes no host NATing. Dois usuários na mesma máquina sempre usarão portas locais diferentes em primeiro lugar, então isso nunca é um problema. O mesmo se um usuário abrir duas conexões ao mesmo tempo.