Tenho algumas dúvidas sobre SNAT com iptables. Suponha que haja um roteador que reproduza o servidor DHCP para atribuir IPs privados em minha LAN e NAT para que os hosts em minha LAN possam acessar a Internet pública.
O roteador possui duas interfaces, uma "eth0" com IP público dinâmico e outra "eth1" com IP privado 192.168.0.1 e a sub-rede é 192.168.0.0/24. Suponha que o encaminhamento de pacotes IPv4 esteja habilitado nesse roteador. Eu sei que preciso definir uma regra na tabela NAT para mascarar o IP de origem do pacote para a Internet pública dos hosts da minha LAN. Esta regra pode ser semelhante à abaixo.
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
Entendo por que preciso da regra, já que o pacote da minha LAN precisa de um IP público para roteamento da Internet.
Mas não entendo por que não preciso definir outra regra em PREROUTING
cadeia para os pacotes de resposta, a fim de modificar seus endereços IP de destino.
A modificação do endereço de destino desses pacotes de resposta é um comportamento padrão da regra MASQUERADE que acabei de definir?
E outra questão é como o iptable sabe quais pacotes devem ser modificados?
Obrigado.
Responder1
iptables NAT tem estado. Usar a tabela 'nat' carregará automaticamente oconexãosistema, que mantém uma lista de conexões ativas e reconhece qual pacote pertence a qual conexão. O sistema conntrack registra ganchos internos que funcionam separadamente das regras do iptables e transforma automaticamente os pacotes que reconhece.
(Você pode ver a tabela de estado conntrack usando conntrack -L
ou via /proc/self/net/nf_conntrack.)
Com este sistema, as regras na tabela 'nat' correspondem apenas àsinicialpacote pertencente a cada conexão, não a cada pacote. Uma vez que o pacote inicial tenha sido correspondido, a entrada conntrack correspondente é marcada como necessitando de NAT (ou não) e pacotes adicionais são transformados automaticamente sem sequer passar pela tabela 'nat'.