Режем скорость в pf через altq
Если вы работает с 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
Сама проблема https://lists.freebsd.org/pipermail/freebsd-pf/2009-March/005058.html
Решение проблемы https://lists.freebsd.org/pipermail/freebsd-pf/2009-March/005061.html
Примечание 2.
В пакетном фильтре (начиная с OpenBSD 5.5) pf реализована новая система управления очередями сетевых пакетов, которая пришла на смену системе приоритизации трафика и управления пропускной способности ALTQ. Поддержка ALTQ пока сохранена, но будет удалена в следующем выпуске. Изменено действие правила блокировки по умолчанию, в 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