Isso é o que acontece:
- Seu servidor
192.168.33.35vê o pacote Syn de192.168.33.Z(não está ciente de192.168.31.0/24network 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.Zvê a resposta de192.168.33.35. Ele espera um de66.66.66.66e 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/24network:# do this on the 192.168.33.35 machine route add -host 192.168.33.Z gw 192.168.33.1Observe que isso afetará toda a comunicação de
192.168.33.35a192.168.33.Z. Nos casos em que192.168.33.35deve 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.1executar 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
iptablesis 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.1gateway 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.35máquina similarmente como acima; - você não pode se comunicar como
66.66.66.66com 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ê.