Режем скорость в 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

Понравилась статья, расскажи о ней друзьям, нажми кнопку!