Como funciona a reflexão NAT (loopback NAT)?

4

Eu uso as regras geradas automaticamente que vêm do OpenWRT como um exemplo de reflexão NAT (NAT loopback).

Então, vamos fingir que há uma rede 192.168.1.0/24 com dois hosts (+ roteador): 192.168.1.100 e 192.168.1.200. O roteador possui duas interfaces LAN (br-lan) e WAN (eth0). A interface LAN possui um IP 192.168.1.1 e a interface WAN possui um IP 82.120.11.22 (público). Há um servidor www em 192.168.1.200. Queremos nos conectar de 192.168.1.100 ao servidor web usando o endereço IP público.

Se você quisesse redirecionar WAN- > LAN para que as pessoas da Internet pudessem visitar o servidor web, você adicionaria as seguintes regras ao iptables:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200:80

Eu sei o que as regras significam. Mas há também outras duas regras, responsáveis pela reflexão da NAT. Um deles não é tão claro para mim como os acima. Então, a primeira regra é assim:

iptables -t nat -A PREROUTING -i br-lan -s 192.168.1.0/24 -d 82.120.11.22/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200

E isso significa que todo o tráfego da rede 192.168.1.0/24 que é destinado ao IP público para a porta 80 deve ser enviado para o servidor web local, o que significa que eu digito o IP público no firefox e eu deve receber a página retornada pelo servidor, certo? Todas as outras magias de encaminhamento na tabela filter já foram feitas, mas ainda não consigo me conectar ao servidor da Web usando o IP público. O pacote atingiu a regra, mas nada acontece.

Precisamos de outra regra nat para que todo o mecanismo funcione:

iptables -t nat -A POSTROUTING -o br-lan -s 192.168.1.0/24 -d 192.168.1.200/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.1.1

Eu não sei porque a regra é necessária. Alguém pode explicar o que exatamente a regra faz?

    
por Mikhail Morfikov 09.05.2016 / 18:53

2 respostas

10

Para que um NAT funcione corretamente, os pacotes de cliente para servidor e os pacotes de servidor para cliente devem passar pelo NAT.

Note que a tabela NAT no iptables é usada apenas para o primeiro pacote de uma conexão. Os pacotes posteriores relacionados à conexão são processados usando as tabelas de mapeamento internas estabelecidas quando o primeiro pacote foi traduzido.

iptables -t nat -A PREROUTING -i br-lan -s 192.168.1.0/24 -d 82.120.11.22/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200

Com apenas esta regra, acontece o seguinte.

  • O cliente cria o pacote inicial (tcp syn) e o endereça ao IP público. O cliente espera obter uma resposta para este pacote com o ip / port de origem e o ip / port de destino trocados.
  • Como o cliente não possui entradas específicas em sua tabela de roteamento, ele o envia ao seu gateway padrão. O gateway padrão é a caixa NAT.
  • A caixa NAT recebe o pacote inicial, modifica o IP de destino, estabelece uma entrada na tabela de mapeamento, pesquisa o novo destino em sua tabela de roteamento e envia os pacotes ao servidor. O endereço de origem permanece inalterado.
  • O servidor recebe o pacote inicial e cria uma resposta (syn-ack). Na resposta, o IP / porta de origem é trocado pelo IP / porta de destino. Como o IP de origem do pacote de entrada não foi alterado, o IP de destino da resposta é o IP do cliente.
  • O servidor pesquisa o IP em sua tabela de roteamento e envia o pacote de volta ao cliente.
  • O cliente rejeita o pacote porque o endereço de origem não corresponde ao esperado.
iptables -t nat -A POSTROUTING -o br-lan -s 192.168.1.0/24 -d 192.168.1.200/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.1.1

Depois de adicionarmos essa regra, a sequência de eventos muda.

  • O cliente cria o pacote inicial (tcp syn) e o endereça ao IP público. O cliente espera obter uma resposta para este pacote com o ip / port de origem e o ip / port de destino trocados.
  • Como o cliente não possui entradas específicas em suas tabelas de roteamento, ele o envia para seu gateway padrão. O gateway padrão é a caixa NAT.
  • A caixa NAT recebe o pacote inicial, seguindo as entradas na tabela NAT modifica o IP de destino, IP de origem e possivel porta de origem (a porta de origem só é modificada se necessário para desambiguar), estabelece uma entrada na tabela de mapeamento o novo destino em sua tabela de roteamento e envia os pacotes para o servidor.
  • O servidor recebe o pacote inicial e cria uma resposta (syn-ack). Na resposta, o IP / porta de origem é trocado pelo IP / porta de destino. Como o IP de origem do pacote de entrada foi modificado pela caixa NAT, o IP de destino do pacote é o IP da caixa NAT.
  • O servidor procura o IP em sua tabela de roteamento e envia o pacote de volta para a caixa NAT.
  • A caixa NAT procura os detalhes do pacote (IP de origem, porta de origem, IP de destino, porta de destino) em suas tabelas de mapeamento NAT e executa uma conversão reversa. Isso altera o IP de origem para o IP público, a porta de origem para 80, o IP de destino para o IP do cliente e a porta de destino de volta para a porta de origem usada pelo cliente.
  • A caixa NAT procura o novo IP de destino em sua tabela de roteamento e envia o pacote de volta ao cliente.
  • O cliente aceita o pacote.
  • A comunicação continua com os pacotes de tradução NAT para frente e para trás.
por 09.05.2016 / 19:49
0

Parece que o tráfego inverso também flui através do openwrt. Reescrevendo o endereço de origem que o servidor da web verá.

Se o servidor respondesse diretamente ao cliente, o endereço de origem para esses pacotes ainda seria o do servidor da web. Mas o cliente está tentando conversar com o IP openwrt. Portanto, os pacotes de resposta seriam descartados.

Você não precisa dessa imposição no primeiro caso, porque a rota do servidor da web para os clientes na Internet já passa pela caixa openwrt.

    
por 09.05.2016 / 19:14