Table of Contents
Шейпинг трафика
Механизм шейпинга трафика основывается
на задержке пакетов, так чтобы лимит скорости передачи
не был исчерпан.
Конфигурирование ядра для шейпинга трафика
options IPFIREWALL options DUMMYNET options HZ=1000
Опция HZ не требуется для dummynet, но строго рекомендуется.
По умолчанию стоит значение 100, что соответствует 100Hz.
Механизм шейпинга заключается в задержке и в последующей отправке пакетов.
Отправка запускается таймером ядра.
Если оставить 100Hz это будет причиной запуска отправки каждые 10 милисекунд,
что в результате даст всплески.
HZ=1000 сделает отправку каждую милисекунду, и в результате
уменьшится задержка отправки пакетов.
Основы шейпинга трафика
Шейпинг трафика происходит в три стадии:
1. Конфигурируются пайпы.
2. Конфигурируются очереди.
3. Трафик направляется через очереди и/или пайпы
Здесь нет приоритетов трафика подобно в iproute,
где очереди настраиваются с помощью утилиты tc
(например для аудио и видео трафика,
где иногда нужно одновременно настроить и скорость трафика и
порядок обработки, т.е. скорость для видео-аудио менее важна чем
то что пакеты не будут теряться, так как они будут
обработаны раньше по приоритету), а для скорости
можно отдельно установить значение.
Пайпы это основные элементы шейпера трафика. Пайп используется для эмуляции сетевого линка с определенной полосой пропускания, задержкой и скоростью пакета.
Очереди используются для реализации "честной очередности" и не может использоваться без пайпа. Все очереди подключаются к пайпу разделяя полосу пропускания этого пайпа на пропорции.
Как рассчитать пропорции в очереди:
Например:
ipfw pipe 1 config bw 120kbit/s ipfw queue 1 config pipe 1 weight 1 ipfw queue 2 config pipe 1 weight 2 ipfw queue 3 config pipe 1 weight 3
Где,
очередь 1 будет иметь вес 1, со скоростью 20kbit/s
очередь 2 будет иметь вес 2, со скоростью 40kbit/s
очередь 3 будет иметь вес 3, со скоростью 60kbit/s
Расчет такой:
Скорость пайпа 120
Суммируем веса 1+2+3=6
Очередь с весом 1 = 120*(1/6)=20
Очередь с весом 2 = 120*(2/6)=40
Очередь с весом 3 = 120*(3/6)=60
Если Очередь с весом 2 будет отсутствовать, то:
Очередь с весом 1 будет 30
Очередь с весом 3 будет 90
Веса имеют значения от 1 до 100, чем больше значение веса тем больше
значение скорости
Вот несколько примеров которые применяются к ed0
к внешнему интерфейсу:
# ограничить только исходящий трафик ipfw pipe 1 config bw 100kbits/s ipfw add 1 pipe 1 ip from any to any out xmit ed0
Чтобы ограничить входящий и исходящий трафик в 100 и 50 kbits/s соответственно:
ipfw pipe 1 config bw 100kbits/s ipfw pipe 2 config bw 50kbits/s ipfw add 100 pipe 1 ip from any to any in recv ed0 ipfw add 100 pipe 2 ip from any to any out xmit ed0
Ограничить полностью входящий и исходящий трафик:
ipfw pipe 1 config bw 100kbits/s ipfw add 100 pipe 1 ip from any to any in recv ed0 ipfw add 100 pipe 1 ip from any to any out xmit ed0
Более сложный пример
# Переменные, которые мы будем использовать # Внешний интерфейс EXTIF=fxp0 # Мой IP адрес ME=192.168.1.1 # Конфигурируем пайп, 95% от общей входящей емкости ipfw pipe 1 config bw 950kbits/s # Конфигурируем очереди для департаментов. # Департаменты 1 и 2 это тяжелые сетевые пользователи ipfw queue 1 config pipe 1 weight 40 ipfw queue 2 config pipe 1 weight 40 # Бухгалтерия, они не должны использовать сильно сеть ipfw queue 3 config pipe 1 weight 5 # Среднее использование сети - для остальных ipfw queue 4 config pipe 1 weight 20 # Входящий почтовый (SMTP) трафик для этого сервера, ВЫСОКИЙ приоритет ipfw queue 10 config pipe 1 weight 100 # Не захватывается предыдущими категориями - ОЧЕНЬ НИЗКАЯ полоса пропускания ipfw queue 11 config pipe 1 weight 1 # Классифицировать трафик # только входящий трафик ограничивается, исходящий не трогается. ipfw add 10 allow ip from any to any out xmit via $EXTIF # Департамент 1 ipfw add 100 queue 1 ip from any to 192.168.0.16/28 in via $EXTIF # Департамент 2 ipfw add 200 queue 2 ip from any to 192.168.0.32/28 in via $EXTIF # Бухгалтерия ipfw add 300 queue 3 ip from any to 192.168.0.48/28 in via $EXTIF # Почта ipfw add 1000 queue 10 ip from any to $ME 25 in via $EXTIF # Остальные ipfw add 1100 queue 11 ip from any to any in via $EXTIF
Другой важный параметр, это опция mask,
синтаксис следующий:
add mask mask-specifier
Например:
Каждый хост получает 16kbits/s :
ipfw pipe 1 config bw 16kbits/s mask dst-ip 0xffffffff ipfw add 100 pipe 1 ip from any to any in recv ed0
Примеры используемых масок:
| /24 | 255.255.255.0 | 0xffffff00 | 11111111 11111111 11111111 00000000 |
| /25 | 255.255.255.128 | 0xffffff80 | 11111111 11111111 11111111 10000000 |
| /26 | 255.255.255.192 | 0xffffffc0 | 11111111 11111111 11111111 11000000 |
| /27 | 255.255.255.224 | 0xffffffe0 | 11111111 11111111 11111111 11100000 |
| /28 | 255.255.255.240 | 0xfffffff0 | 11111111 11111111 11111111 11110000 |
| /29 | 255.255.255.248 | 0xfffffff8 | 11111111 11111111 11111111 11111000 |
| /30 | 255.255.255.252 | 0xfffffffc | 11111111 11111111 11111111 11111100 |
| /31 | 255.255.255.254 | 0xfffffffe | 11111111 11111111 11111111 11111110 |
| /32 | 255.255.255.255 | 0xffffffff | 11111111 11111111 11111111 11111111 |