Если вы работает с pf и во время загрузки правил получаете такое сообщение:
No ALTQ support in kernel
ALTQ related functions disabled
значит поддержка altq не включена. Включить можно только через пересборку ядра. Для этого добавляем такие опции в конфигурационный файл ядра:
options ALTQ
включает подсистему ALTQ
options ALTQ_CBQ
включает Class Based Queuing (CBQ). CBQ позволяет распределять пропускную способность соединений по классам или очередям для выставления приоритетов трафика на основе правил фильтрации.
options ALTQ_RED
включает Random Early Detection ( RED ). RED используется для предотвращения перегрузки сети. RED вычисляет длину очереди и сравнивает ее с минимальной и максимальной границей очереди. Если очередь превышает максимум, все новые пакеты отбрасываются. В соответствии со своим названием, RED отбрасывает пакеты из различные соединений в произвольном порядке.
options ALTQ_RIO
включает Random Early Detection In and Out.
options ALTQ_HFSC
включает Hierarchical Fair Service Curve Packet Scheduler. (Дополнительная информация http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html)
options ALTQ_PRIQ
включает Priority Queuing ( PRIQ ). PRIQ всегда пропускает трафик из более высокой очереди первым.
options ALTQ_NOPCC
включает поддержку SMP для ALTQ . Эта опция необходима для SMP систем.
options ALTQ_CDNR
options ALTQ_DEBUG
Тестовый стенд: FreeBSD 8.2 i386
Условия – ограничить download (1000 Кбит/с) upload (2000 Кбит/с) с возможность заимствовать свободный трафик из ширины 5000 Кбит/с
ВНИМАНИЕ !!!
Ограничить можно только исходящий (upload) трафик, так как входящий (download) – уже пришёл и ограничить его нельзя. Но есть хитрый способ (не всегда даёт желаемый результат, но лучше, чем ничего): входящий на внутренний интерфейс (download) будет исходящим для внешнего. Именно так и будут составляться правила.
Иными словами сначала составляете правила распределения трафика, а потом навешиваете на правила файервола, но только с ключевым словом out. Иначе шейпер работать не будет.
Правила шейпера:
altq on $ext_if cbq bandwidth 5000Kb queue { IN_ext, OUT_ext } queue IN_ext bandwidth 1000Kb cbq(default borrow) queue OUT_ext bandwidth 2000Kb altq on $int_if cbq bandwidth 5000Kb queue { IN_int, OUT_int } queue IN_int bandwidth 1000Kb cbq(default borrow) queue OUT_int bandwidth 2000Kb
Навешиваем шейпер:
pass out on ext_if from any to $int_if:network queue IN_ext no state
pass out on int_if from $int_if:network to any queue OUT_int no state
Напомню, что в pf’e важен порядок правил:
1) макросы
2) таблицы
3) опции
4) параметры нормализации
5) приоретизация и очереди ALTQ
6) правила трансляции
7) правила фильтра
Поэтому правила, начинающиеся с altq/queue будут идти выше правил трансляции, а правила pass – вместе с правилами фильтрации.
А теперь, что бы посмотреть состояние очередей, выполним :
# pfctl -sq
queue root_em0 on em0 bandwidth 5Mb priority 0 cbq( wrr root ) {IN_ext, OUT_ext}
queue IN_ext on em0 bandwidth 1Mb cbq( borrow default )
queue OUT_ext on em0 bandwidth 2Mb
queue root_em1 on em1 bandwidth 5Mb priority 0 cbq( wrr root ) {IN_int, OUT_int}
queue IN_int on em1 bandwidth 1Mb cbq( borrow default )
queue OUT_int on em1 bandwidth 2Mb
Примечание.
Будьте внимательны при использовании borrow+cbq, так как оно не всегда работает, так как вам этого хочется. Яркий пример – не заимствование пропускной способности от родителей. Если кратко – то использовать вместо cbq -> hfsc
Сама проблема http://lists.freebsd.org/pipermail/freebsd-pf/2009-March/005058.html
Решение проблемы http://lists.freebsd.org/pipermail/freebsd-pf/2009-March/005061.html
Примечание 2.
В пакетном фильтре (начиная с OpenBSD 5.5) pf реализована новая система управления очередями сетевых пакетов, которая пришла на смену системе приоритизации трафика и управления пропускной способности ALTQ. Поддержка ALTQ начиная с 5.6 удалена из кода. Изменено действие правила блокировки по умолчанию, в pf.conf теперь используется “block return“. Простейший пример нового синтаксиса расстановки приоритетов для разного вида трафика:
queue std on em0 bandwidth 100M
queue ssh parent std bandwidth 10M
queue mail parent std bandwidth 10M, min 5M, max 25M
queue http parent std bandwidth 80M default
...
pass in proto tcp to port 25 set queue mail
Примечание 3
Из-за того, что altq использует 32 битные счётчики им нельзя ограничивать скорость на 10 гигабитном (и выше) интерфейсе. Отслеживать эту ситуацию можно по тикету