Механизм шейпинга трафика основывается
на задержке пакетов, так чтобы лимит скорости передачи
не был исчерпан.
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 |