
Eu tenho duas redes sequenciais, ambas ocultas no próprio NAT 192.168.31.0/24
-> 192.168.33.0/24
-> Internet
Eu tenho um servidor TCP ligado 192.168.33.35
e um cliente ligado192.168.31.32
Um cliente faz uma solicitação TCP para um servidor localizado na Internet em 66.66.66.66
, por exemplo. Quero que o último gateway 192.168.33.1
envie a solicitação 192.168.33.35
e engane o cliente.
O mais viável do que tentei é:
iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66
O servidor recebeu o pacote Syn e respondeu. Mas o IP de origem da resposta do servidor parece permanecer 192.168.33.35
após passar pelo gateway. E o pacote é perdido e recebido pelo 192.168.31.1
gateway.
Parece que a parte SNAT não está funcionando.
O que posso fazer para emular/falsificar o servidor com ferramentas openWrt padrão?
Responder1
Isto é o que acontece:
- Seu
192.168.33.35
servidor vê o pacote Syn192.168.33.Z
(não tem conhecimento da192.168.31.0/24
rede e vê o endereço "WAN" do192.168.31.1
gateway, não sei o queZ
é) e responde para este endereço. - Sua tabela de roteamento indica que este 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
192.168.33.1
máquina, o gateway não a altera porque está destinada ao endereço MAC de outra máquina. 192.168.33.Z
vê a resposta de192.168.33.35
. Ele espera um66.66.66.66
e não sabe o que fazer.
Observe que não importa o 192.168.33.Z
desempenho do NAT (estando 192.168.31.1
no lado da LAN). O mecanismo de falha é muito semelhante àquele ondeO loopback NAT (hairpin NAT) está apenas parcialmente configurado.
Você precisa fazer com que seu 192.168.33.35
servidor 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 de que não seiZ
, você sabe; substitua o número real) ou até mesmo para toda192.168.33.0/24
a rede:# 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á todas as comunicações de
192.168.33.35
para192.168.33.Z
. Nos casos em que192.168.33.35
deveria atuar, pois192.168.33.35
os pacotes serão roteados desnecessariamente; não deveria quebrar as coisas.Ou deixe o
192.168.33.1
gateway executar não apenas DNAT, mas também SNAT. Esta solução é basicamente a mesma do loopback 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:
Observe que a tabela NAT
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.
Isso significa que a segunda de 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 editados com SNAT e DNAT 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
agisse no 192.168.31.1
gateway, ele faria o que você deseja para outros clientes 192.168.31.0/24
sem nenhum truque adicional.
Esta sua segunda linha
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ãode 192.168.33.35
. Os servidores da Internet raramente fazem isso, então talvez você nem precise dessa regra. Caso você precise, lembre-se que:
- a regra só funcionará se os pacotes forem roteados através do
192.168.33.1
gateway onde esta regra atua, portanto para chegar aos seus computadores locais e apresentar a eles como66.66.66.66
é necessário ajustar a tabela de roteamento na192.168.33.35
máquina de forma semelhante ao acima; - você não pode se comunicar como
66.66.66.66
com hosts externos (além da sua rede) porque mesmo que conseguisse alcançá-los agindo como66.66.66.66
, a resposta deles chegaria ao real66.66.66.66
, e não de volta para você.
Responder2
Fiz isso com roteamento. Infelizmente é menos flexível para acessar o servidor real, mas pelo menos funciona. Algo assim:
[email protected]# route add -host 66.66.66.66 gw 192.168.33.35 dev br-lan
e no servidor:
[email protected]# ip link add name s666 type dummy
[email protected]# ifconfig s666 66.66.66.66
[email protected]# ifconfig s666 up