Testando o aplicativo de rede com rede virtual e latência artificial

0

Para testar um aplicativo de rede de maneira controlada, desejo criar algum tipo de rede virtual em uma única máquina na qual eu possa controlar as latências. (Estou executando o Ubuntu 14.04 x64). Eu pesquisei um pouco e levantei o seguinte:

Usando interfaces de toque: vde_switch para criar um switch virtual da seguinte forma:

sudo vde_switch -tap tap0 -tap tap1
sudo ip addr add 10.0.0.100 dev tap0
sudo ip addr add 10.0.0.101 dev tap1

Uma maneira alternativa de criar as interfaces de toque que tentei é:

sudo ip tuntap add dev tap0 mode tap  
sudo ip link set dev tap0 up  
sudo ip addr add 10.0.0.100 dev tap0  
[repeat for tap1 and any further interfaces]

Até aí tudo bem. Agora meu problema é introduzir latência artificial nessas interfaces de tap. Eu consegui fazer isso usando o seguinte para interfaces reais como lo e eth0:

sudo tc qdisc add dev eth0 root netem delay 15ms

No entanto, o comando acima parece não funcionar com as interfaces de toque. Depois que eu o executei para uma das interfaces de toque, nada parece ter mudado. O comando não fornece nenhuma saída, portanto, parece encontrar a interface bem e concluir com êxito. No entanto, ping, por ex. 10.0.0.100 não mostra mudanças na latência.

Existe alguma coisa óbvia que eu esteja sentindo falta? (Ou estou me aproximando disso completamente errado?) Obrigado!

    
por Jocbe 22.02.2015 / 14:57

2 respostas

0

Encontrei uma solução alternativa no final. Ele funciona bem na minha situação, mas requer o uso de uma VM; pode muito bem haver uma solução mais elegante. Esteja avisado.

Esse método usa o VMware Workstation (observe que o Player não é suficiente). Eu usei o Ubuntu Desktop e o Ubuntu Server como sistema operacional host e guest, respectivamente.

A estação de trabalho possui um 'editor de rede virtual' (aplicativo separado empacotado com a estação de trabalho). Com isso, você pode criar interfaces de rede virtual adicionais e pode atribuir latências virtuais àquelas independentemente. Crie interfaces vmnetX adicionais conforme necessário (o meu era do tipo somente host) e você pode adicionar novos adaptadores de rede à sua VM, especificando manualmente as interfaces de rede correspondentes. Se você estiver usando o linux, provavelmente também precisará adicionar os novos adaptadores a / etc / network / interfaces no sistema operacional convidado.

Agora você deve ter várias interfaces / redes diferentes disponíveis que são compartilhadas entre o host e o convidado. Introduzir a latência para essas interfaces usando algo como o seguinte (google este comando para mais detalhes, este é apenas um exemplo):

sudo tc qdisc add dev vmnet1 root netem delay 20ms

Acabei apresentando o atraso no sistema operacional convidado (usando as interfaces eth0, eth1, ...) em vez do host, como é mostrado no exemplo acima. Eu não acho que deveria fazer uma diferença enorme, no entanto.

Esteja ciente de que este é apenas um rápido & descrição suja e não muito genérica de como eu comecei a trabalhar. Se você quiser fazer algo semelhante, talvez precise alterar alguns detalhes.

    
por 29.04.2015 / 17:00
0

Não é bonito, mas funciona:

#!/bin/bash

TAP0="tap0"
TAP1="tap1"
# use different subnets
IP0="10.0.31.1"
IP1="10.0.32.1"
# some fake ips in yet different subnets
FAKE0="10.1.31.1"
FAKE1="10.1.32.1"

ip tuntap add dev $TAP0 mode tap;
ip tuntap add dev $TAP1 mode tap;
ip addr add $IP0 dev $TAP0;
ip addr add $IP1 dev $TAP1;

ifconfig $TAP0 inet $IP0 netmask 255.255.255.0 up;
ifconfig $TAP1 inet $IP1 netmask 255.255.255.0 up;
ifconfig -a;

vde_switch -d -tap $TAP0 -tap $TAP1;

iptables -t nat -A POSTROUTING -s $IP0 -d $FAKE1 -j SNAT --to-source $FAKE0;
iptables -t nat -A PREROUTING -d $FAKE0 -j DNAT --to-destination $IP0;
iptables -t nat -A POSTROUTING -s $IP1 -d $FAKE0 -j SNAT --to-source $FAKE1;
iptables -t nat -A PREROUTING -d $FAKE1 -j DNAT --to-destination $IP1;

ip route add $FAKE1 dev $TAP0;
arp -i $TAP0 -s $FAKE1 $(ifconfig -a|grep $TAP1|awk '{print $5}');
ip route add $FAKE0 dev $TAP1;
arp -i $TAP1 -s $FAKE0 $(ifconfig -a|grep $TAP0|awk '{print $5}');

tc qdisc add dev $TAP0 root handle 1:0 netem delay 80ms 20ms 25% loss 5% duplicate 5%;
tc qdisc add dev $TAP1 root handle 1:0 netem delay 80ms 20ms 25% loss 5% duplicate 5%;

enquanto isso pode ser feio como o inferno e provavelmente errado - funciona como eu preciso. note que isso só funciona entre tap0 e tap1, não dando um loop no tap0 para tap0 ou mais. veja o teste ping:

$ ping -qi 0.2 10.0.31.1 -I tap1                                                                                                                                                                          
PING 10.0.31.1 (10.0.31.1) from 10.0.32.1 tap1: 56(84) bytes of data.                                                                                                                                                            
^C                                                                                                                                                                                                                               
--- 10.0.31.1 ping statistics ---                                                                                                                                                                                                
313 packets transmitted, 301 received, +13 duplicates, 3% packet loss, time 62650ms                                                                                                                                              
rtt min/avg/max/mdev = 60.013/81.053/99.951/11.661 ms
    
por 29.04.2015 / 17:11