Redirecionando o tráfego de loopback através de um roteador

5

Para alguns testes, estou executando vários aplicativos baseados em soquete em uma máquina e quero simular condições de rede "real" entre eles. Achei que o mais simples seria redirecionar todo o tráfego entre os aplicativos através do roteador ao qual meu computador está conectado. Intuitivamente, isso deve funcionar mais ou menos como vários computadores conectados à mesma rede, e a própria rede deve ser limitada pelos recursos do roteador (100 Mbps) em vez das conexões de soquete entre máquinas locais.

Minha máquina (192.168.1.101) está conectada diretamente a um roteador (192.168.1.2) através da interface em1 . Eu tentei fazer isso adicionando uma rota ip. O resultado do meu comando ip route é:

default via 192.168.1.2 dev em1  proto static  metric 1024 
192.168.1.0/24 dev em1  proto kernel  scope link  src 192.168.1.101 
192.168.1.101 via 192.168.1.2 dev em1 

Isso, no entanto, parece não ter nenhum efeito, já que o ping localhost retorna mais ou menos os mesmos resultados que ping da minha máquina indiretamente (192.168.1.101), ou seja, cerca de 0,040 ms. Ao mesmo tempo, o ping de uma máquina diferente na minha rede resulta em pings em torno de 0,3-0,5 ms.

Eu tentei traceroute, aqui está o que eu recebo:

$traceroute 192.168.1.200                    # my other computer
traceroute to 192.168.1.200 (192.168.1.200), 30 hops max, 60 byte packets
 1  192.168.1.200 (192.168.1.200)  1.005 ms  0.972 ms  0.954 ms

$traceroute 192.168.1.101
traceroute to 192.168.1.101 (192.168.1.101), 30 hops max, 60 byte packets
 1  localhost.localdomain (192.168.1.101)  0.051 ms  0.014 ms  0.013 ms

$traceroute 127.0.0.1
traceroute to 127.0.0.1 (127.0.0.1), 30 hops max, 60 byte packets
 1  localhost.localdomain (127.0.0.1)  0.053 ms  0.015 ms  0.013 ms

Estou faltando alguma coisa, ou talvez esteja fazendo isso de uma maneira completamente errada?

    
por megahertz 20.08.2014 / 11:57

2 respostas

2

O problema é que você tem uma rota na tabela local que diz:

$ ip route show table local
[...]
local 192.168.1.101 dev eth0 scope host
[...]

Ao enviar um pacote com [src = 192.168.1.101 dst = 192.168.1.101], e esperar que o roteador envie o pacote de volta refletido (alguns se recusarão a esse tipo de coisa), você quer que o pacote de saída pule esse rota, mas não o pacote voltando.

Para isso, você pode alterar o ip rules :

Remova a regra pega-tudo para a tabela local .

# ip rule del from all table local

E substitua por um que não faça isso para os pacotes 192.168.1.101- > 192.168.1.101:

# ip rule add not from 192.168.1.101 to 192.168.1.101 table local pref 0

Em seguida, marque os pacotes recebidos com o netfilter:

# iptables -t mangle -I PREROUTING -s 192.168.1.101 -d 192.168.1.101 -j MARK --set-mark 1

E diga a regra de IP para usar a tabela local apenas para aqueles:

# ip rule add fwmark 1 table local pref 1

(claro, você também precisa do seu ip route add to 192.168.1.101 via 192.168.1.2 na sua tabela main )

    
por 20.08.2014 / 12:56
1

Aqui estão algumas soluções que podem introduzir latência, reordenamento de pacotes e descartes de pacotes no * BSD e no Linux.

  1. Usando netfilter para simular < href="http://code.nomad-labs.com/2010/03/11/simulating-dropped-packets-aka-crappy-internets-with-iptables/"> Perda de pacotes

  2. Usando o tc e netem para introduzir atrasos e perdas

  3. No FreeBSD, use dummynet . Veja uma introdução .

por 20.08.2014 / 13:25