Sua pergunta é dividida em duas partes.
- Por que precisamos da regra MASQUERADE?
- Por que precisa estar na cadeia POSTROUING?
- Existe alguma alternativa?
Para responder a primeira pergunta, devemos primeiro entender como o NAT do iptables funciona. As tabelas NAT são usadas no primeiro pacote de uma conexão para determinar quais traduções devem ser aplicadas a essa conexão. Depois que o primeiro pacote é processado, é criada uma entrada de tabela de mapeamento interna que é usada para processar pacotes posteriores da conexão, mas uma caixa só pode processar os pacotes que ela vê.
Então vamos supor que XXX.XXX.XXX.XXX e YYY.YYY.YYY.YYY são os dois servidores na Internet sem roteamento especial configurado. Vamos supor que o cliente também esteja na internet aberta sem firewalls e tenha um IP de ZZZ.ZZZ.ZZZ.ZZZ. Vamos ver o que acontece sem a regra do MASQURADE.
- O cliente envia um pacote inicial ZZZ.ZZZ.ZZZ.ZZZ: 1234 - > XXX.XXX.XXX.XXX:80
- O pacote chega ao servidor A, que realiza o destino NAT, então o pacote agora é ZZZ.ZZZ.ZZZ.ZZZ: 1234 - > YYY.YYY.YYY.YYY: 80 cria a entrada de rastreamento de conexão e coloca o pacote de volta na rede.
- O ISP pode bloquear o pacote neste momento para "spoofing" ou eles podem entregá-lo ao sever B. Vamos supor que eles o entreguem ao servidor B.
- O pacote chega ao servidor B, que cria uma resposta YYY.YYY.YYY.YYY: 80 - > ZZZ.ZZZ.ZZZ.ZZZ: 1234
- A resposta é entregue ao cliente.
- O cliente procura a resposta na tabela de soquetes, mas não consegue encontrar uma correspondência e descarta o pacote (possivelmente enviando um erro de ICMP em resposta).
Como isso muda se adicionarmos a regra MASQUERADE?
- O cliente envia um pacote inicial ZZZ.ZZZ.ZZZ.ZZZ: 1234 - > XXX.XXX.XXX.XXX:80
- O pacote chega ao servidor A que realiza NAT de destino e MASQURADING, portanto o pacote agora é XXX.XXX.XXX.XXX:5678 - > YYY.YYY.YYY.YYY: 80 coloca de volta na rede.
- O ISP entrega o pacote ao servidor B
- O pacote chega ao servidor B, que cria uma resposta YYY.YYY.YYY.YYY: 80 - > XXX.XXX.XXX.XXX:5678
- A resposta é entregue ao servidor A
- O servidor A pesquisa o pacote nas tabelas de acompanhamento de conexão e altera sua origem e destino para XXX.XXX.XXX.XXX:80 - > ZZZ.ZZZ.ZZZ.ZZZ: 1234
- A rede entrega a resposta ao cliente.
- O cliente consulta a resposta na tabela de soquetes e encontra uma correspondência. A conexão é estabelecida com sucesso.
Para a pergunta 2 eu realmente não tenho uma resposta, iptables insiste que SNAT / MASQUERADE só pode ser feito em POSTROUTING, mas não vejo nenhuma boa justificativa técnica para por que isso deveria ser o caso.
Podemos razoavelmente querer evitar o uso de MASQUERADE. Tem problemas de servidor, em primeiro lugar, perdemos as informações sobre a fonte original do tráfego que gostaríamos de ter para o controle de abuso. Em segundo lugar, o servidor A tem um fornecimento limitado de portas.
Isso pode ser resolvido, mas somente se ambos os servidores estiverem sob nosso controle. A solução envolve três etapas.
- Estabelecemos um túnel de algum tipo entre os servidores A e B. Os endpoints do túnel recebem endereços IP privados.
- No servidor A, nós DNAT o tráfego para o IP do túnel do servidor B.
- No servidor B, usamos o roteamento de políticas para que o tráfego proveniente do IP privado do servidor B seja enviado pelo túnel para o servidor A em vez de ser enviado de volta para a Internet.