freebsd_ipfw_shaper

https://hyperois.com/members/index.php/knowledgebase/1/-Using-Dummynet-for-Traffic-Shaping-on-FreeBSD.html

Шейпинг трафика

Механизм шейпинга трафика основывается
на задержке пакетов, так чтобы лимит скорости передачи
не был исчерпан.

Конфигурирование ядра для шейпинга трафика

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

Примеры используемых масок:

/24255.255.255.0 0xffffff0011111111 11111111 11111111 00000000
/25255.255.255.1280xffffff8011111111 11111111 11111111 10000000
/26255.255.255.1920xffffffc011111111 11111111 11111111 11000000
/27255.255.255.2240xffffffe011111111 11111111 11111111 11100000
/28255.255.255.2400xfffffff011111111 11111111 11111111 11110000
/29255.255.255.2480xfffffff811111111 11111111 11111111 11111000
/30255.255.255.2520xfffffffc11111111 11111111 11111111 11111100
/31255.255.255.2540xfffffffe11111111 11111111 11111111 11111110
/32255.255.255.2550xffffffff11111111 11111111 11111111 11111111
freebsd_ipfw_shaper.txt · Last modified: 2023/08/24 08:46 by admin