Как генерировать задержки и патери пакетов при передачи в сети между двумя хостаими, сетями. Такая задача стоит при необходимости тестирования клиент-серверных систем/приложений с эмуляцией влияния глобальной сети на качество передачи данных между элементами тестируемой системы. Иными словами давайте сэмулируем свойства сети Интертнет на рабочем столе, в своем работем тестовом окружении. (эмуляция плохой сети, медленная сеть, патеря пакетов, задержки, повторная передача пакетов, плохой канал связи, все вместе)
Наиболее простым является решени на Linux машине с двумя сетевыми картами. Шлюз Gateway выступает в роли моста между двумя сетевыми интерфесами eth0 и eth1. Шлюз прозрачен для сети и может быть установлен в разрыв сети в любом сетефом окружении. Главное, что бы IP адреса его интерфейсов не конфликтовали с IP адресами сети, то есть были из другой подсети.Опускаю установку 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
Подключайте шлюз в вашу сеть, запускайте пинг с клиента на сервер и запускайте скрипт. Выбирая значения в скрипте вы можете создавть и тестировать тест кейсы. Все.