Чтобы протестировать сетевое приложение контролируемым образом, я хочу создать виртуальную сеть на одной машине, в которой я могу контролировать задержки. (Я использую Ubuntu 14.04 x64). Я немного исследовал и получил следующее:

Использование интерфейсов касания: vde_switch для создания виртуального коммутатора, например, так:

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

Альтернативный способ создания интерфейсов крана, который я пробовал:

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]

Все идет нормально. Теперь моя проблема заключается в введении искусственной задержки в этих интерфейсах. Мне удалось сделать это, используя следующее для реальных интерфейсов, таких как lo и eth0:

sudo tc qdisc add dev eth0 root netem delay 15ms

Однако приведенная выше команда не работает с интерфейсами крана. После того, как я выполнил его для одного из интерфейсов крана, кажется, ничего не изменилось. Комментарий не дает никакого вывода, поэтому, похоже, интерфейс найден в порядке и успешно завершен. Однако пинг, например, 10.0.0.100, не показывает изменения в задержке.

Есть ли что-то очевидное, чего мне не хватает? (Или я подхожу к этому совершенно неправильно?) Спасибо!

2 ответа2

0

Я нашел обходной путь в конце. Он отлично работает в моей ситуации, но требует использования виртуальной машины; вполне может быть более элегантное решение. Имейте в виду.

Этот метод использует VMware Workstation (обратите внимание, что Player недостаточно). Я использовал Ubuntu Desktop и Ubuntu Server в качестве хоста и гостевой ОС соответственно.

Рабочая станция имеет «виртуальный сетевой редактор» (отдельное приложение, поставляемое с рабочей станцией). При этом вы можете создавать дополнительные виртуальные сетевые интерфейсы, и получается, что вы можете назначать им виртуальные задержки независимо. Создайте дополнительные интерфейсы vmnetX, как вам нужно (у меня был тип только для хоста), и вы можете добавить новые сетевые адаптеры к вашей ВМ, указав соответствующие сетевые интерфейсы вручную. Если вы используете Linux, вам, вероятно, также нужно добавить новые адаптеры в /etc /network /interfaces в гостевой ОС.

Теперь у вас должно быть несколько различных доступных интерфейсов / сетей, которые совместно используются хостом и гостем. Введите задержку для этих интерфейсов, используя что-то вроде следующего (за более подробной информацией обратитесь к этой команде Google, это всего лишь один пример):

sudo tc qdisc add dev vmnet1 root netem delay 20ms

В итоге я ввел задержку в гостевой ОС (используя интерфейсы eth0, eth1, ...) вместо хоста, как показано в примере выше. Я не думаю, что это должно иметь огромное значение, хотя.

Имейте в виду, что это только краткое и грязное и не очень общее описание того, как я заставил его работать. Если вы хотите сделать что-то подобное, вам, возможно, придется изменить пару деталей.

0

Это не красиво, но работает:

#!/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%;

в то время как это может быть ужасно чертовски и, возможно, совершенно неправильно - это работает так, как мне нужно. обратите внимание, что это работает только между tap0 и tap1, не зацикливая tap0 на tap0 или около того. см тест-пинг:

$ 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .