Isso é o que acontece:
- Seu servidor
192.168.33.35
vê o pacote Syn de192.168.33.Z
(não está ciente de192.168.31.0/24
network e vê o endereço "WAN" do gateway192.168.31.1
, não sei o que éZ
) e responde a este endereço. - A tabela de roteamento informa que esse endereço pertence à rede local, portanto, a resposta é destinada ao endereço MAC de
192.168.33.Z
. - Mesmo que a resposta viaje fisicamente pela máquina
192.168.33.1
, o gateway não o manipula porque é destinado ao endereço MAC de outra máquina. -
192.168.33.Z
vê a resposta de192.168.33.35
. Ele espera um de66.66.66.66
e não sabe o que fazer.
Note que não importa 192.168.33.Z
realiza NAT (sendo 192.168.31.1
no lado da LAN). O mecanismo de falha é muito semelhante àquele em que loopback NAT (hairpin NAT) está apenas parcialmente configurado .
Você precisa fazer com que seu 192.168.33.35
server envie respostas para o endereço MAC do seu 192.168.33.1
gateway.
-
Defina uma regra de roteamento para
192.168.33.Z
(lembre-se, não seiZ
, substitua o número real) ou mesmo para todo o192.168.33.0/24
network:# do this on the 192.168.33.35 machine route add -host 192.168.33.Z gw 192.168.33.1
Observe que isso afetará toda a comunicação de
192.168.33.35
a192.168.33.Z
. Nos casos em que192.168.33.35
deve atuar como192.168.33.35
, os pacotes serão roteados desnecessariamente; não deve quebrar as coisas embora. -
Ou deixe o gateway
192.168.33.1
executar não apenas o DNAT, mas também o SNAT. Esta solução é basicamente a mesma que para o loopback de NAT na resposta já vinculada:# do this on the 192.168.33.1 gateway # you already have this line iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35 # this line is new iptables -t nat -I POSTROUTING -d 192.168.33.35 -j SNAT --to-source 192.168.33.1
Este fragmento se aplica à sua situação:
Note that the NAT table in
iptables
is only used for the first packet of a connection. Later packets related to the connection are processed using the internal mapping tables established when the first packet was translated.
Isso significa que a segunda das suas linhas ( iptables … -j SNAT --to-source 66.66.66.66
) é irrelevante quando você inicia uma conexão de um cliente. Os pacotes posteriores serão SNAT-ed e DNAT-ed corretamente porque o primeiro pacote foi.
Eu acho que se sua primeira linha
iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
agiu no gateway 192.168.31.1
, ele faria o que você deseja para outros clientes de 192.168.31.0/24
sem truques adicionais.
Esta segunda linha sua
iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66
será aplicado se você iniciar uma conexão de 192.168.33.35
. Os servidores da Internet raramente fazem isso, portanto, talvez você não precise dessa regra. Caso você precise, lembre-se:
- a regra funcionará somente se os pacotes forem roteados pelo
192.168.33.1
gateway no qual essa regra atua, portanto, para alcançar seus computadores locais e apresentar a eles como66.66.66.66
, é necessário ajustar a tabela de roteamento no192.168.33.35
máquina similarmente como acima; - você não pode se comunicar como
66.66.66.66
com hosts externos (além da sua rede) porque, mesmo se você conseguisse alcançá-los agindo como66.66.66.66
, sua resposta chegaria ao% real66.66.66.66
, não de volta para você.