Substituição de servidor. Emulando servidor de internet

Substituição de servidor. Emulando servidor de internet

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.35e 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.1envie a solicitação 192.168.33.35e 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.35após passar pelo gateway. E o pacote é perdido e recebido pelo 192.168.31.1gateway.

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:

  1. Seu 192.168.33.35servidor vê o pacote Syn 192.168.33.Z(não tem conhecimento da 192.168.31.0/24rede e vê o endereço "WAN" do 192.168.31.1gateway, não sei o que Zé) e responde para este endereço.
  2. 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.
  3. Mesmo que a resposta viaje fisicamente pela 192.168.33.1máquina, o gateway não a altera porque está destinada ao endereço MAC de outra máquina.
  4. 192.168.33.Zvê a resposta de 192.168.33.35. Ele espera um 66.66.66.66e não sabe o que fazer.

Observe que não importa o 192.168.33.Zdesempenho do NAT (estando 192.168.31.1no 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.35servidor envie respostas para o endereço MAC do seu 192.168.33.1gateway.

  • Defina uma regra de roteamento para 192.168.33.Z(lembre-se de que não sei Z, você sabe; substitua o número real) ou até mesmo para toda 192.168.33.0/24a 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.35para 192.168.33.Z. Nos casos em que 192.168.33.35deveria atuar, pois 192.168.33.35os pacotes serão roteados desnecessariamente; não deveria quebrar as coisas.

  • Ou deixe o 192.168.33.1gateway 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.1gateway, ele faria o que você deseja para outros clientes 192.168.31.0/24sem 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.1gateway onde esta regra atua, portanto para chegar aos seus computadores locais e apresentar a eles como 66.66.66.66é necessário ajustar a tabela de roteamento na 192.168.33.35máquina de forma semelhante ao acima;
  • você não pode se comunicar como 66.66.66.66com hosts externos (além da sua rede) porque mesmo que conseguisse alcançá-los agindo como 66.66.66.66, a resposta deles chegaria ao real 66.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

informação relacionada