PFSense 2.0 Traffic Shaper
-
Описание
Traffic Shaper (шейпер) это подсистема динамического распределения полосы пропускания трафика. С ее помощью можно одному типу трафика давать первоочередное преимущество перед другим видом трафика, а так-же выделять минимальную и максимальную полосы(скорости) для прохождения трафика.
Traffic Shaper состоит из двух элементов - очередей Queues и планировщиков. Очереди описывают свойства проходящего потока данных, его приоритеты и ширину полосы. Планировщик определяет алгоритм взаимодействия и иерархию очередей. Направление трафика в очереди производится в правилах файрвола.
Здесь описан алгоритм обработки пакетов в PF: http://homepage.mac.com/quension/pf/flow.png
Терминология, понятия
Выражения исходящий трафик и входящий трафик применительно к роутеру имеет значение применительно к направлению движения пакетов на интерфейсах. Весь выпускаемый роутером трафик (не важно в локальную сеть или в интернет) является выходящим (OUT). Весь принимаемый роутером трафик является входящим (IN).
На пример: пакет проходящий через роутер от Web сервера в Интернете к клиенту в локальной сети на WAN интерфейсе будет для роутера входящим, а на LAN интерфейсе - исходящим.Схема работы
Ниже очень упрощенно показано движение пакетов в роутере между двумя интерфейсами.
Как видно из схемы назначение очередей Queue Tagging для проходящих пакетов производится в двух местах - при входе в роутер и при выходе из него. НО постановка пакетов непосредственно в очередь и шейпинг в ALTQ производится только при выходе пакетов из роутера на выпускающем пакет интерфейсе.Пример:
Пусть из локальной сети пользователь запросил WEB страничку. Его запрос проходя через Lan интерфейс будет входящим для роутера на этом интерфейсе и может обрабатываться правилами с опциями <in, nostate="">.
После прохождения ядра системы он попадает на WAN интерфейс, где уже будет исходящим для роутера на WAN интерфейсе. Здесь он может быть обработан правилами c опциями <out, nostate="">.
Для данного пакета в IN правилах на LAN интерфейсе или в OUT правилах на WAN интерфейсе могут указываться очереди Queues, созданные на интерфейсе WAN, так как в шейпер этот пакет будет помещен при покидании WAN интерфейса.
Обратный пакет-ответ от WEB сервера будет идти зеркально по отношению к пути пакета-запроса.Обращает на себя особое внимание первоочередность применения правил NAT/PortMapping перед всеми другими операциями. Это необходимо учитывать при формировании правил файрвола, так как они обрабатывают пакеты с уже измененными атрибутами (Src для NAT, Dst для PortMapping).
Учебник FreeBSD, PF, ALTQ (описание, примеры, пояснения): http://91.192.71.196/BSDCert/BSDA-course/apcs02.html
</out,></in,> -
Настройка Traffic Shaper производится в меню Firewall > Traffic Shaper
Имеется 5 закладок:
By Interface
Отображается иерархия очередей ALTQ на интерфейсах. Это основная закладка для управления очередями (создание/изменение/удаление).By Queue
Отображаются очереди ALTQ сгруппированные по интерфейсам. Возможно клонировать/удалять очереди на интерфейсах.Limiter
Содержит настройки альтернативного шейпера на базе DummyNet.Layer7
Содержит группы фильтров подсистемы Layer7. Позволяет фильтровать трафик приложений по характерным сигнатурам пакетов.Wizards
Включает в себя список мастеров настройки шейпера ALTQ.
-
Вкладка Wizards содержит несколько мастеров настройки шейпера.
Самый лучший способ понять и разобраться с работой шейпера в pfSense - воспользоваться услугами мастера настройки.
Тип мастера зависит от конфигурации вашего роутера:
- Single Lan multi Wan - настройка для одной LAN и нескольких WAN, в т.ч. и для 1-Lan : 1-Wan
- Single Wan multi Lan - настройка для нескольких LAN и одной WAN
- Multiple Lan/Wan - настройка для нескольких LAN и нескольких WAN
- Dedicated Links - …
При настройке для каждого интерфейса можно выбрать свой планировщик. При этом мастер самостоятельно рассчитает и согласует необходимые параметры очередей, а так же создаст необходимые правила файрвола. Можно создать мастером минимальную базовую схему настройки и затем своими силами модифицировать ее под свои нужды.
Все мастера позволяют повторно пройти существующую перенастройку с уже введенными Вами данными.
К сожалению есть баги - если ранее вы выбрали какие-то пункты галками, то они не активируются при повторном заходе в мастер. Нужно повторно перевыбирать галку - тогда все зависимые элементы мастера активизируются и можно корректно перейти на следующий шаг настройки.Использование мастера настройки и интерфейс pfSense ориентированы на создание однотипных списков очередей, что несколько упрощает настройку правил файрвола.
Вы также можете строить структуру очередей по своему усмотрению, но для этого необходимо четко понимать как и где вы производите шейпинг трафика. Это в равной степени относится к формированию правил файрвола.
-
Очереди Queues, приоритеты и планировщики шейпера
При обработке данных роутером пакеты поступают в очередь и ожидают, когда они будут обработаны. При этом роутер выбирает какие из пакетов и в каком порядке должны быть обработаны. Имеются протоколы чувствительные к задержкам, и они должны быть обработаны в первую очередь.
Управление очередностью и приоритетом прохождения данных может серьезно сказаться на качестве работы в сети. В фильтре PF pfSense имеется встроенная система управления трафиком ALTQ. Все поступающие данные ставятся в очереди Queues и ожидают там дальнейшей обработки. За управление поведением очередей отвечает элемент Планировщик (Sheduler).
Очереди
Очереди Queues это элементы шейпера ALTQ, определяющие каким образом будет обработан пакет. Каждая очередь имеет характеристики приоритета, пропускной способности и др. Для разных типов планировщиков очередь может иметь разный набор параметров.
Родительская очередь
-
Sheduler type - тип планировщика.
-
Bandwidth - скорость канала в целом Bit(Kbit/Mbit/GBit)/с
-
Queue Limit - скорость движения пакетов в секунду pt/sec в очереди
-
Tbr Size - размер очереди в пакетах
Дочерние очереди
-
Priority - приоритет очереди 0 -> 7.
-
Queue Limit - скорость движения пакетов в секунду pt/sec
-
Scheduler options - Опции планировщика:
- Default queue - присваивается одной из очередей назначая ее очередью по умолчанию. В зависимости от политики шейпинга "прочего трафика" выбирают очередь с нормальным или минимальным приоритетом.
- RED - Random Early Detection - RED используется для предотвращения перегрузки сети. RED вычисляет длину очереди и сравнивает ее с минимальной и максимальной границей очереди. Если очередь превышает максимум, все новые пакеты отбрасываются. В соответствии со своим названием, RED отбрасывает пакеты из различные соединений в произвольном порядке. Использование RED делает невозможным разделение по классам качества обслуживания (QoS). Поэтому в случае, когда QoS важно, используются другие варианты алгоритма, такие как Weighted RED (WRED) или RED In/Out (RIO).
- RED In/Out - …
- ECN - Explicit Congestion Notification - Явное Уведомление о Перегруженности — расширение протокола IP, позволяет обоим сторонам в сети узнавать о возникновении затора на маршруте к заданному хосту или сети без отбрасывания пакетов. Это дополнительная функция, которая используется только в том случае, когда обе конечные точки обмена информацией сообщают, что они хотят её использовать.
Специальные параметры дочерних очередей
Для CBQ
- Borrow from other queues when available - Занимать полосу у других очередей, если доступно.
Для HFSC
- realtime <sc>- Минимальная полоса пропускания
- upperlimit <sc>- Максимальная полоса пропускания
- linkshare <sc>- Полоса, которую можно делить с другими очередямиПримечание:
Здесь <sc>это сокращение для service curve — кривая сервиса.
Кривая состоит из двух линейных участков и описывается тремя числами (m1, d, m2).- m1 — начальная полоса пропускания (т.е. наклон первой кривой),
- d - время в течении которого действует первичная полоса пропускания в миллисекундах и
- m2 — наклон второго линейного участка — т.е. реальная полоса пропускания.
Столь детальное описание кривой сервиса позволяет отдельно регулировать задержки при работе очереди и полосу пропускания, тогда как в CBQ есть только регулировка полосы пропускания и, следовательно, единственный способ снизить задержки состоит в увеличении полосы пропускания.
Планировщики ALTQ
Планировщик определяет алгоритм, используемый для решения какие пакеты будут задержаны, отброшены или сразу переданы. В настоящий момент существуют три планировщика, поддерживаемые FreeBSD в реализации ALTQ:
Class Bases Queuing (CBQ)
Очереди, присоединенные к интерфейсу, создают дерево, таким образом у каждой очереди могут быть дальнейшие дочерние очереди. У каждой очереди могут быть приоритет и присвоенная пропускная способность. Приоритет, главным образом, управляет временем за которое пакеты будут отосланы, в то время как другие будут ждать своей очереди. За счёт этого регулируется пропускная способность.
Ссылка http://www.opennet.ru/base/net/cbq_rus.txt.htmlHierarchical Packet Scheduler (HFSC)
В родительской очереди определяется суммарная пропускная способность для всех очередей интерфейса. Указывается общая пропускная способность, предоставляемая провайдером и не зависящая от скорости сетевого интерфейса. В дочерней очереди эта директива определяет максимальную скорость передачи информации в битах, которая будет обработана очередью в любой момент.
Дополнительную информация о HFSC можно посмотреть здесь:
http://dreamcatcher.ru/2009/11/30/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-hierarchical-fair-service-curve-hfsc-%D0%B2-openbsd/
http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html.
http://ccr.sigcomm.org/archive/1996/conf/bennett.pdfPriority Queuing (PRIQ)
PRIQ простой планировщик, первым пропускает трафик из очередей с высоким приоритетом. У этих очередей не может быть дочерних очередей. Каждой очереди присваивали уникальный приоритет, в пределах от от 0 до 15. Очереди с высшим номером имеют высший приоритет.Ссылки
http://ru.wikipedia.org/wiki/ALTQ
http://91.192.71.196/BSDCert/BSDA-course/apcs02.html - Учебник PF/ALTQ.</sc></sc></sc></sc> -
-
Правила фильтра для шейпера
При использовании мастера настройки в разделе Floating Rules правил файрвола будет создан список, определяющий очереди шейпера для каждого вида трафика (Queues). Раздел Floating Rules был специально создан в pfSense 2.0 взамен правил шейпера. В отличии от правил на интерфейсах здесь имеется ряд отличительных настроек, позволяющих создавать более гибкие списки правил.
Правила из Floating Rules всегда обрабатываются до правил из списков на интерфейсах.
Опция Interfaces
Определяет к каким интерфейсам будет относится данное правило. Может быть выбрано несколько интерфейсов. Если интерфейсы не выбраны - правило имеет глобальный характер.Опция Quick.
Означает немедленное применение правила и прекращение дальнейшего просмотра списков.Порядок просмотра списка правил.
Правила на интерфейсах
Правила из списков на интерфейсах формируются с включенной опцией Quick, которая недоступна пользователям для изменения. Просмотр списка идет до первого подходящего правила. Поэтому здесь более общие правила располагают ниже остальных.Правила FloatingRules
Списки FloatingRules так же просматриваются сверху вниз, пока не будет достигнут конец списка или просмотр не будет прерван на подходящем правиле с опцией Quick. При встрече подходящих правил без опции Quick будет применено каждое из них и просмотр будет продолжен дальше до конца списка. Здесь без использования опции Quick сначала следует располагать более общие правила, а затем уже более конкретные.
Рассмотрим пример Floating Rules, созданный с помощью мастера (см. скриншот)
В этих правилах опция Quick не установлена. Это означает, что будет просмотрен весь список правил до конца.
Первым стоит общее правило Penalty Box, которое помещает все пакеты в низко приоритетную очередь qOthersLow.
При дальнейшем просмотре до конца списка эта очередь может быть изменена на другую с другим приоритетом, если попадется другое соответствующее пакету правило. Иначе трафик остается в низко приоритетной очереди.
В этом примере реализована концепция урезания "прочего трафика" и выделение ресурсов канала для "нужного трафика". Она хорошо подходит для борьбы с трудно-фильтруемым трафиком (P2P к примеру).Возможны и другие подходы. Например:
- общее правило предоставляет всему трафику очередь с нормальным приоритетом,
- дальнейшие правила сортируют "нужный" трафик в более высоко приоритетные очереди, а "вредный" трафик в низко приоритетные очереди.
В этом случае весь "остальной" трафик будет ходить уступая место "нужному" и отбирая полосу у "вредного" трафика.
Напомню, что без опции Quick в списке более общие правила должны располагаться выше, а частные ниже.
Обращаем внимание на опцию Direction. Для правил шейпера в примере она установлена в Out, что означает применение правил к выходящим из роутера пакетам. Назначать очереди входящим пакетам (Direction=In) так же возможно, что обычно применяют для разделения по Source параметрам. Но необходимо понимать, что трафик подвергается шейпингу только на выходе из роутера, то есть на том интерфейсе через который он покидает роутер.
Использование опции States в правилах.
При использовании опции States в одном из состояний, отличном от NoState, при обработке трафика будет использована таблица состояний States фильтра.
Todo: разобрать keep_state. Мастером создается с этой опцией. как это будет работать с ассиметричным ADSL ?
-
Построение собственной схемы шейпинга.
Думаю самый лучший способ понять и разобраться с работой шейпера в pfSense - воспользоваться услугами мастера настройки.
Сейчас доступно несколько мастеров:-
Single Lan multi Wan - один LAN и несколько WAN. На самом деле этот мастер является базовым и позволяет так же сделать настройки 1-LAN > 1-WAN. Достаточно указать количество WAN на первом шаге равным 1.
-
Single Wan multi Lan - один WAN и несколько LAN. Если у Вас несколько локальных интерфейсов, то этот мастер позволит настроить шейпер и для данного случая.
-
Multiple Lan/Wan - несколько WAN и несколько LAN. Мастер для более сложной схемы сети.
-
Dedicated Links - пока вижу что сломан, поэтому …
Для каждого интерфейса можно выбрать свой планировщик. При этом мастер самостоятельно рассчитает и согласует необходимые параметры очередей, а так же создаст необходимые правила Floating Rules. Можно создать мастером минимальную базовую схему настройки и затем своими силами модифицировать ее под свои нужды.
Все мастера позволяют повторно пройти существующую перенастройку с уже введенными Вами данными.
К сожалению есть баги - если вы выбрали какие-то пункты галками, то они не активируются при повторном заходе в мастер. Нужно повторно перевыбирать галку - тогда все зависимые элементы мастера активизируются и можно корректно перейти на следующий шаг настройки.
Комментарии к работе мастеров настройки шейпера
При работе мастера настройки шейпера в зависимости от выбранных опций обычно создаются следующие типы очередей:
- qACK - очередь с очень высоким приоритетом и минимальными задержками для пропускания быстрых коротких служебных запросов,
- qOtherDefault - очередь "по умолчанию" с нормальным приоритетом, в которую будет попадать весь "остальной" трафик.
- qOthersHight - очередь с высоким приоритетом для пропуска "важного/нужного" трафика
- qOthersLow - очередь с низким приоритетом для пропуска трафика, который "может подождать"
- qPenalty - очередь с очень низким приоритетом и с зарезанной скоростью, свалка для паразитного трафика.
Общая логика такой схемы понятна, и она вполне подходит для многих небольших сетей. Для решения более сложных задач можно создать свою собственную иерархию очередей на базе данной. Мастером обычно создается одинаковый набор очередей для всех участвующих интерфейсов, но ничто не мешает Вам удалить/добавить нужные вам очереди. Правда при этом Вам самим придется уточнять правилами для каждого интерфейса какой трафик в какую очередь будет помещен. Мастер создает общий набор OUT правил без указания интерфейса.
Обычно в системе присутствуют некоторые виды трафика, для работы которых необходим высокий приоритет. Существуют так же такие виды трафика, которые "лучше пропустить первыми", так как это улучшит работу шейпера (короткие пакеты, забивающие очередь).
Рекомендуемое распределение типов пакетов по очередям
ICMP () - Ackqueue/Queue = none/qOthersDefault (хотя я бы ее в более приоритетную поместил)
GRE () - так же
AH () - так же
ESP () - так же
UDP (500 [ISAKAMP]) - так же
UDP (119 [NNTP часы]) - так же
UDP ( 53[DNS]) - Ackqueue/Queue = none/qOthersDefault
TCP ( 53[DNS]) - Ackqueue/Queue = qACK/qOthersDefault
UDP (* 161[SNMP]) - Ackqueue/Queue = none/qOthersDefault
TCP (* 161[SNMP]) - Ackqueue/Queue = qACK/qOthersDefaultЛучше TCP и UDP трафик описывать разными правилами (см выше). В TCP существуют служебные типы запросов, которые должны быть переданы с минимальными задержками. В зависимости от того нужен нам этот трафик или нет, мы назначаем дополнительную быструю Ackqueue(qACK) очередь. Ее отсутствие при заполненности канала затрудняет установление новых TCP соединений и управление его параметрами.
Пользовательский трафик распределяем следующим образом:
- все важное направляем в qOthersHight (для TCP Ackqueue = qACK)
- все обычное направляем в qOthersDefault (для TCP Ackqueue = qACK)
- все, что терпим по необходимости, направляем в qOthersLower (для TCP Ackqueue = qACK)
- весь мусор в qPenalty (Ackqueue = none, чтобы сильнее тормозило)
Напомню, что правила для шейпера создаются в Floating Rules без опции Quick и схема работы списка правил в этом разделе иная, чем в списках на интерфейсах.
- Просмотр правил идет сверху вниз до конца не прерываясь.
- Работает самое последнее подходящее правило. Поэтому наиболее общие правила располагаются вверху, а уточняющие ниже.
- Правила FloatingRules (без опции Quick)обрабатываются ДО правил интерфейсов.
- На интерфейсах настраиваем правила обычным образом, но без заполнения раздела Queues (это уже выполнено правилами Floating Rules).
Замечание
Если на интерфейсе присутствуют правила NAT/ProtForward, то в filter/шейпер попадут уже обработанные ими правила. Строить правила нужно с учетом этих изменений. К примеру на WAN приходит трафик на порт 1000, который форвардится на 2000 порт станции 10.0.0.10. В этом случае необходимо делать правило с указанием измененных dstIP 10.0.0.10 и dstPort 2000 (src/srcPort = any). -
-
Limiter
Альтернатива шейперу ALTQ на базе Dummy Net pipes. Дает возможность управления сетевым трафиком, проходящим через различные сетевые интерфейсы, путем применения имитации различной ширины полосы пропускания, ограничения размера очереди, имитации задержек и потерь пакетов. В отличии от ALTQ позволяет распределить ширину канала "всем поровну" между клиентами, но не обладает его гибкостью.
В зависимости от поставленных задач у Вас есть возможность выбора какой тип шейпера использовать.
Справка
http://ipfw.ism.kiev.ua/dummynet.html
http://doc.pfsense.org/index.php/Traffic_Shaping_Guide#Limiter
Layer7
Layer7 - это механизм классификации трафика на основе анализа сигнатур проходящих пакетов. Позволяет выделять те или иные протоколы по их характерным сигнатурам (к примеру http/ICQ/IRC … ).
Читать
http://l7-filter.sourceforge.net/
http://l7-filter.sourceforge.net/README