Os Iptables não funcionam como eu esperava: o pacote de resposta não foi DNAT como esperado com o DNAT no PREROUTING

0

Meu servidor (no qual as regras iptables são carregadas) tem o IP 192.168.3.110 . Existe outro computador na minha LAN com o IP 192.168.3.106 . Estou tentando redirecionar solicitações para o meu servidor na porta 80 para 192.168.3.106 .

Eu tenho o seguinte arquivo iptables que é carregado no meu servidor do CentOS 7:


*nat
:PREROUTING DROP
:INPUT DROP
:OUTPUT DROP
:POSTROUTING DROP

-A PREROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
-A PREROUTING -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A PREROUTING --dst 192.168.3.110 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.106
-A PREROUTING -i lo -j ACCEPT

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A OUTPUT --dst 192.168.3.110 -p tcp -m state --state NEW --dport 80 -j DNAT --to-destination 192.168.3.106
-A OUTPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

-A POSTROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
-A POSTROUTING -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A POSTROUTING --src 192.168.3.0/24 --dst 192.168.3.106 -p tcp --dport 80 -j SNAT --to-source 192.168.3.110
-A POSTROUTING -o lo -j ACCEPT

COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

-A OUTPUT -p tcp --sport 22 -j ACCEPT
-A OUTPUT -p tcp -j ACCEPT
-A OUTPUT -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

COMMIT

Basicamente estou fazendo o seguinte (pelo menos é assim que eu entendo):

  • ativar ssh-ing

  • ativar o TCP na porta 80

  • Pacotes DNAT e SNAT para que eu alcance o comportamento desejado.

Pergunta: não entendo por que, quando faço uma chamada do meu servidor para si mesmo, ou seja, 192.168.3.110 , obtenho uma resposta.

É assim que entendo que as coisas devem funcionar neste caso:

  1. curl http://192.168.3.110 - não esqueça que eu executo isso do meu servidor, com IP 192.168.3.110
  2. o pacote vai para a cadeia OUTPUT da tabela nat, onde é DNATed
  3. o pacote vai para a cadeia POSTROUTING da tabela nat, onde é SNATed
  4. meu Apache de 192.168.3.106 atende ao meu pedido.
  5. o pacote está atingindo a cadeia PREROUTING da tabela nat, onde deve ser DNATed
  6. o pacote é encaminhado e lançado em algum lugar.

Tudo parece funcionar como esperado, exceto 5 e 6. Com outras palavras, recebo a resposta do servidor. Alguém pode me explicar onde está minha lógica quebrada?

    
por artaxerxe 22.11.2017 / 11:02

1 resposta

2

As tabelas iptables nat só são percorridas para o primeiro pacote de uma conexão (psuedo-). Os pacotes posteriores são mapeados (ou deixados sozinhos) de acordo com os mapeamentos estabelecidos pelo primeiro pacote.

    
por 07.03.2018 / 14:36