Как генерировать задержки и патери пакетов при передачи в сети между двумя хостаими, сетями. Такая задача стоит при необходимости тестирования клиент-серверных систем/приложений с эмуляцией влияния глобальной сети на качество передачи данных между элементами тестируемой системы. Иными словами давайте сэмулируем свойства сети Интертнет на рабочем столе, в своем работем тестовом окружении. (эмуляция плохой сети, медленная сеть, патеря пакетов, задержки, повторная передача пакетов, плохой канал связи, все вместе)

Опускаю установку OS Linux. Замечу только, что желательно иметь последние обновления на OS Linux. Я выбрал для установки в свойе тестовой лаборатории дистрибутив Ubuntu 12.04.4 LTS. Все далее описанные команды идут сразу после начисто установленной OS Linux подключенной к сети интерфейсом eth0 и получившей IP адрес с внутреннего DHCP сервера или статический IP. Host имеет доступ к Интернет. Предполагается, что команды подаются в терминале с клавиатуры в начале процесса. После настройки сетевых интерфейсов вы можете подключиться к Gateway по SSH или Telnet и работать удаленно.
В нашем примере мы используем следующую адресацию:
Server host: IP 10.0.0.2, Mask 255.255.255.0, GW 10.0.0.1
Client host: IP 10.0.0.3, Mask 255.255.255.0, GW 10.0.0.1
Gateway host (bridge): eth0/eth1 IP 192.168.1.10, Mask 255.255.255.0
Устанавливаем openssh, обновляемся и перезагружаемся:
sudo apt-get install ssh openssh-server
sudo apt-get update
sudo apt-get upgrade
sudo reboot
Устанавливаем компонент поддержки сетевого моста:
sudo apt-get install bridge-utils
Вносим изменения в настройки сетевых интерфейсов:
sudo cp /etc/network/interfaces /etc/network/interfaces.bak
sudo nano /etc/network/interfaces
Скопируйте тект в файл заменив имеющийся там:
# The loopback network interface
auto lo
iface lo inet loopback
# Eth0 to Eth network switch
allow-hotplug eth0
iface eth0 inet manual
pre-up ifconfig $IFACE up
pre-down ifconfig $IFACE down
allow-hotplug eth1
iface eth1 inet manual
pre-up ifconfig $IFACE up
pre-down ifconfig $IFACE down
# Setup an IP address for our bridge
auto br0
iface br0 inet static
bridge_ports eth0 eth1
address 192.168.1.10
broadcast 192.168.1.255
netmask 255.255.255.0
Рестартуем сетевые интерфейсы для применения изменений
sudo /etc/init.d/networking restart
После этого шлюз доступен в сети по IP адресу 192.168.1.10.
Проверяем конфигурацию сети:
ifconfig
ip addr show
brctl show
Создаем скрипт с набором правил. В скрипт можно внести весь набор правил с которыми вы хотите тестировать свойства соединения. Папку со скриптом можно хранить в домашней директории пользователя:
mkdir scripts
cd scripеы
nano script.sh
Скопируйте тект в файл:
#!/bin/bash
echo
echo Please run script with root access: sudo ./script.sh
echo
echo Curent status:
tc qdisc show dev eth0
echo
echo "Please make a choice:"
OPTIONS="Clean_Value Latency-200ms Latency-500ms Latency-1000ms Packet_Lost-20% Packet_Lost-30%
Latency-200ms_and_Packet_Lost-20% Clean_and_Exit"
select opt in $OPTIONS; do
if [ "$opt" = "Clean_Value" ]; then
tc qdisc del dev eth0 root
echo Cleared
elif [ "$opt" = "Latency-200ms" ]; then
#Remove fusion
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root netem delay 200ms
echo Latency 200ms
tc qdisc show dev eth0
elif [ "$opt" = "Latency-500ms" ]; then
#Remove fusion
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root netem delay 500ms
echo Latency 500ms
tc qdisc show dev eth0
elif [ "$opt" = "Latency-1000ms" ]; then
#Remove fusion
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root netem delay 1000ms
echo Latency 1000ms
tc qdisc show dev eth0
elif [ "$opt" = "Packet_Lost-20%" ]; then
#Remove fusion
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root netem loss 20%
echo Packet Lost 20%
tc qdisc show dev eth0
elif [ "$opt" = "Packet_Lost-30%" ]; then
#Remove fusion
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root netem loss 30%
echo Packet Lost 30%
tc qdisc show dev eth0
elif [ "$opt" = "Latency-200ms_and_Packet_Lost-20%" ]; then
#Remove fusion
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root netem delay 200ms 50ms loss 20%
echo Latency 200ms and Packets Lost 10%
tc qdisc show dev eth0
elif [ "$opt" = "Clean_and_Exit" ]; then
tc qdisc del dev eth0 root
echo Curent status:
tc qdisc show dev eth0
exit
else
clear
echo bad option
fi
done
Делаем скрипт запускаемым:
chmod +x script.sh
Скрипт содержить некоторый набор правил. Вы можете добавить правила необходимые вам или изменить имеющиеся.
Изменяем скрипт:
nano script.sh
Запускаем скрипт:
sudo ./script.sh
Подключайте шлюз в вашу сеть, запускайте пинг с клиента на сервер и запускайте скрипт. Выбирая значения в скрипте вы можете создавть и тестировать тест кейсы. Все.