Port forward- Por que o iptables com a regra POSTROUTING é necessário?

2

Supondo que eu tenha dois servidores:

- > O servidor A tem o IP XXX.XXX.XXX.XXX

- > o servidor B tem o IP YYY.YYY.YYY.YYY

O que eu quero é redirecionar o tráfego do servidor A (porta 80) para o servidor B (porta 80).

Uma maneira simples de fazer isso é colocar a seguinte regra com o iptables no servidor A:

iptables -t nat -A PREROUTING -p tcp --dport port -j DNAT --to-destination server B:80

No entanto, essa regra simples não funciona. Devemos adicionar a seguinte regra:

iptables -t nat -A POSTROUTING -j MASQUERADE

Por que isso? Por que precisamos adicionar uma regra de POSTROUTING? Após o PREROUTING, o pacote deve ir automaticamente para o servidor B, certo?

    
por Duke Nukem 13.11.2016 / 00:15

2 respostas

2

* Eu não sou especialista em iptables ou Linux Network Scheduling, mas vou tentar ajudar!

Observando a página de manual do iptables user@host:~$ man 8 iptables , podemos ver na tabela nat ( Conversão de endereços de rede ) descrição:

"This table is consulted when a packet that creates a new connection is encountered. It consists of three built-ins: PREROUTING (for altering packets as soon as they come in), OUTPUT (for altering locally-generated packets before routing), and POSTROUTING (for altering packets as they are about to go out)."

É a cadeia POSTROUTING :-)

A explicação de MASQUERADE abaixo eu obtive de The Linux Documentation Project e eu também coloquei sua informação para fazer sentido:

  • I tell machine B that my PPP or Ethernet connected Linux box A is its gateway.
  • When a packet comes into the Linux box A from B, it will assign the packet to a new TCP/IP source port number and insert its own IP address inside the packet header, saving the originals. The MASQ server will then send the modified packet over the PPP/ETH interface onto the Internet.
  • When a packet returns from the Internet into the Linux box A, Linux examines if the port number is one of those ports that was assigned above. If so, the MASQ server will then take the original port and IP address, put them back in the returned packet header, and send the packet to B.
  • The host that sent the packet will never know the difference.
    
por 13.11.2016 / 01:28
1

Sua pergunta é dividida em duas partes.

  1. Por que precisamos da regra MASQUERADE?
  2. Por que precisa estar na cadeia POSTROUING?
  3. 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.
por 06.03.2018 / 21:07