Meu servidor (no qual iptables
as regras abaixo são carregadas) possui o IP 192.168.3.110
. Há outro computador na minha LAN com IP 192.168.3.106
. Estou tentando redirecionar solicitações para meu servidor na porta 80 para 192.168.3.106
.
Eu tenho o seguinte iptables
arquivo que está carregado em meu servidor 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 entendi):
habilitar ssh
habilitar TCP na porta 80
Pacotes DNAT e SNAT para que eu consiga o comportamento desejado.
Pergunta:Não entendo por que, quando faço uma chamada do meu servidor para ele mesmo, ou seja 192.168.3.110
, recebo uma resposta.
É assim que entendo que as coisas devem funcionar neste caso:
curl http://192.168.3.110
- não esqueça que eu executo isso do meu servidor, com IP192.168.3.110
- pacote vai para a cadeia OUTPUT da tabela nat, onde é DNATed
- pacote vai para a cadeia POSTROUTING da tabela nat, onde é SNATed
- meu Apache de
192.168.3.106
, está respondendo ao meu pedido. - pacote está alcançando a cadeia PREROUTING da tabela nat, onde deveria ser DNATed
- o pacote é encaminhado e jogado em algum lugar.
Tudo parece funcionar conforme o esperado, exceto 5 e 6. Em outras palavras, recebo a resposta do servidor.Alguém pode me explicar onde minha lógica está quebrada?
Responder1
As tabelas nat do iptables são percorridas apenas para o primeiro pacote de uma conexão (psuedo-). Os pacotes posteriores são mapeados (ou deixados de lado) de acordo com os mapeamentos estabelecidos pelo primeiro pacote.