Limiters в pfSense - ограничение полосы пропускания

Limiters в pfSense основаны на подсистеме dummynet(4) FreeBSD и предоставляют механизм жёсткого ограничения полосы пропускания. В отличие от ALTQ, Limiters работают независимо от драйверов сетевых адаптеров и поддерживают ограничение скорости на уровне отдельных IP-адресов и подсетей. Подсистема dummynet изначально разрабатывалась для тестирования поведения TCP при перегрузке сети, но в pfSense используется как полноценный инструмент управления трафиком.

Limiters устанавливают потолок полосы пропускания - они задерживают или отбрасывают пакеты для достижения заданной скорости. Это принципиально отличается от ALTQ, где возможно заимствование неиспользуемой полосы пропускания между очередями. Limiter не гарантирует минимальную полосу - он только ограничивает максимальную.

Архитектура Limiters

Pipes и Queues

Limiters организованы в двухуровневую иерархию:

  • Pipes (корневые Limiters) - определяют верхний предел полосы пропускания и могут добавлять искусственную задержку. Каждый pipe представляет собой канал с заданной пропускной способностью.
  • Queues (дочерние Limiters) - создаются внутри pipe и распределяют трафик по приоритетам с помощью весов (weights). Веса определяют пропорциональное распределение полосы пропускания между очередями, но не могут превышать совокупную пропускную способность родительского pipe.

Для типичных сценариев ограничения скорости достаточно использовать только корневые Limiters без создания дочерних очередей. Дочерние очереди применяются в случаях, когда необходимо приоритизировать определённые типы трафика внутри ограниченного канала.

Отличия от ALTQ

ХарактеристикаLimiters (dummynet)ALTQ
Подсистемаdummynet(4)pf (ALTQ framework)
Гарантия полосыНет (только верхний предел)Да (HFSC real-time curve)
Per-IP ограничениеДа (через маски)Нет
Per-subnet ограничениеДа (через маски)Нет
Заимствование полосыНетДа (CBQ, HFSC link share)
CoDel/FQ-CoDelДаНет
Зависимость от драйверов NICНетДа
Настройка через визардНетДа

Создание Limiter

Настройка выполняется в Firewall > Traffic Shaper > Limiters. Для типичного сценария ограничения скорости необходимо создать два Limiter: один для входящего трафика (download), второй для исходящего (upload).

Параметры корневого Limiter

Bandwidth - числовое значение полосы пропускания. Указывается в выбранных единицах измерения.

Bandwidth type - единицы измерения: Mbit/s, Kbit/s или Bit/s. Для большинства сценариев используются Mbit/s.

Schedule - необязательный параметр, позволяющий привязать полосу пропускания к расписанию файрвола. Полезно для сценариев, когда в рабочее время требуется одно ограничение, а в нерабочее - другое.

Mask - определяет, как применяется ограничение:

  • None - один общий бакет для всего трафика. Весь трафик, попавший в Limiter, делит заданную полосу пропускания. Подходит для ограничения совокупной пропускной способности подсети.
  • Source address - создаёт отдельный бакет для каждого IP-адреса источника. Используется для Limiter, ограничивающего upload (исходящий трафик).
  • Destination address - создаёт отдельный бакет для каждого IP-адреса назначения. Используется для Limiter, ограничивающего download (входящий трафик).

Mask bits - определяет гранулярность маскирования. Значение 32 для IPv4 создаёт отдельный бакет для каждого IP-адреса. Значение 24 группирует все адреса в пределах /24 подсети в один бакет.

Дополнительные параметры

Delay - искусственная задержка в миллисекундах. Применяется для тестирования работы приложений при высокой латентности. В продуктивных конфигурациях устанавливается в 0.

Packet Loss Rate - коэффициент потери пакетов в десятичном формате (0.01 = 1%). Используется исключительно для тестирования. В продуктивных конфигурациях устанавливается в 0.

Queue Size - размер очереди в слотах (по умолчанию 50). Для медленных каналов (менее 10 Mbit/s) может потребоваться увеличение этого значения для предотвращения избыточного отбрасывания пакетов.

Bucket Size - размер хеш-таблицы для маскированных бакетов. Диапазон от 16 до 65536, значение по умолчанию - 64. Увеличение требуется при большом количестве одновременных бакетов (например, при per-IP ограничении в сети на 500+ хостов).

Пример: Limiter для download 50 Mbit/s per-IP

  1. Перейти в Firewall > Traffic Shaper > Limiters
  2. Нажать New Limiter
  3. Установить параметры:
    • Name: Download_50Mbps
    • Bandwidth: 50
    • Bandwidth type: Mbit/s
    • Mask: Destination address
    • Mask bits: 32
  4. Сохранить конфигурацию

Пример: Limiter для upload 25 Mbit/s per-IP

  1. Нажать New Limiter
  2. Установить параметры:
    • Name: Upload_25Mbps
    • Bandwidth: 25
    • Bandwidth type: Mbit/s
    • Mask: Source address
    • Mask bits: 32
  3. Сохранить конфигурацию

Применение Limiters через правила файрвола

Limiters привязываются к правилам файрвола через параметры In и Out в разделе Advanced Options правила. Критически важно понимать, что направления In и Out определяются с точки зрения самого межсетевого экрана, а не пользователя.

Направления с точки зрения файрвола

Для правила на LAN-интерфейсе:

  • In (трафик, входящий в файрвол с LAN) = upload пользователя
  • Out (трафик, выходящий из файрвола на LAN) = download пользователя

Таким образом, в правиле LAN:

  • In pipe = Limiter для upload
  • Out pipe = Limiter для download

Внимание:

Наиболее распространённая ошибка при настройке Limiters - перепутанные направления In и Out. Если после настройки speed test показывает ограничение upload вместо download (или наоборот), необходимо поменять Limiters местами в настройках правила.

Настройка правила файрвола

  1. Перейти в Firewall > Rules > LAN
  2. Создать или отредактировать правило Pass для трафика, который необходимо ограничить
  3. В разделе Extra Options раскрыть Display Advanced
  4. В поле In / Out pipe выбрать:
    • In: Upload_25Mbps (upload Limiter)
    • Out: Download_50Mbps (download Limiter)
  5. Сохранить правило и применить изменения

Порядок правил

Limiter применяется к трафику, совпавшему с конкретным правилом файрвола. Если необходимо ограничить весь трафик подсети - Limiter привязывается к общему правилу разрешения. Если необходимо ограничить только определённый трафик (например, HTTP/HTTPS) - создаётся отдельное правило с привязкой Limiter только к нему.

Правила без привязанного Limiter пропускают трафик без ограничения скорости. Это позволяет исключить критичные сервисы из-под шейпинга, разместив разрешающие правила для них выше правила с Limiter.

Типичные сценарии

Ограничение гостевой Wi-Fi сети

Задача: ограничить каждого пользователя гостевой сети до 10 Mbit/s download и 5 Mbit/s upload.

Limiters:

  • Guest_Download_10M - Bandwidth: 10 Mbit/s, Mask: Destination address, Bits: 32
  • Guest_Upload_5M - Bandwidth: 5 Mbit/s, Mask: Source address, Bits: 32

Правило файрвола: на интерфейсе GUEST_WIFI, правило Pass для Source: GUEST_WIFI net, Destination: any. In pipe: Guest_Upload_5M, Out pipe: Guest_Download_10M.

Каждый пользователь получает индивидуальное ограничение 10/5 Mbit/s, но совокупный трафик всей гостевой сети не ограничен. Если необходимо ограничить и совокупную полосу - следует создать дополнительную пару Limiters с Mask: None.

Ограничение совокупной полосы пропускания подсети

Задача: ограничить весь трафик подсети 192.168.20.0/24 до 100 Mbit/s download и 50 Mbit/s upload (совокупно на всю подсеть, без per-IP ограничений).

Limiters:

  • Subnet_Download_100M - Bandwidth: 100 Mbit/s, Mask: None
  • Subnet_Upload_50M - Bandwidth: 50 Mbit/s, Mask: None

При Mask: None весь трафик подсети попадает в один общий бакет. 100 Mbit/s делится между всеми активными хостами подсети.

Комбинированное ограничение: per-IP внутри общего потолка

Для реализации схемы “каждый пользователь не более 20 Mbit/s, вся подсеть не более 100 Mbit/s” необходимо создать две пары Limiters и два правила файрвола:

  1. Первое правило (выше по порядку) с per-IP Limiters (Mask: Source/Destination address) и ограничением 20 Mbit/s
  2. Дополнительно - Limiters с Mask: None и ограничением 100 Mbit/s применяются как родительские

Внимание:

pfSense не поддерживает вложенное ограничение (per-IP Limiter внутри subnet Limiter) как единую конструкцию. Для сложных иерархических схем может потребоваться комбинация Limiters с дочерними очередями или применение ALTQ вместо Limiters.

Справедливое распределение полосы пропускания (Fair Queuing)

Задача: канал 100 Mbit/s должен справедливо распределяться между всеми пользователями сети. При 10 активных пользователях каждый получает примерно 10 Mbit/s, при 2 активных - 50 Mbit/s.

Для этого сценария используется per-IP Limiter с параметром Mask и установкой полосы пропускания равной максимальной скорости канала. Однако dummynet создаёт жёсткие бакеты - каждый IP получит полную полосу Limiter, а не долю от неё. Истинное справедливое распределение реализуется через FQ-CoDel (описано ниже).

CoDel и борьба с bufferbloat

Проблема bufferbloat

Bufferbloat - избыточная буферизация пакетов в сетевом оборудовании, приводящая к росту латентности под нагрузкой. При активной загрузке канала (торренты, крупные загрузки) буферы маршрутизатора переполняются, и интерактивный трафик (VoIP, игры, веб-сёрфинг) начинает испытывать задержки в сотни миллисекунд вместо обычных единиц.

CoDel (Controlled Delay)

CoDel - алгоритм активного управления очередью (Active Queue Management, AQM), решающий проблему bufferbloat. Вместо простого отбрасывания пакетов при переполнении очереди CoDel отслеживает время нахождения пакетов в очереди и начинает отбрасывать пакеты, когда задержка превышает допустимый порог.

FQ-CoDel (Fair Queuing CoDel)

FQ-CoDel комбинирует CoDel с механизмом справедливого распределения (Fair Queuing). Трафик автоматически распределяется по множеству внутренних очередей, обеспечивая равный доступ к полосе пропускания для всех потоков. FQ-CoDel является рекомендуемым алгоритмом для борьбы с bufferbloat в pfSense.

Настройка CoDel в Limiter

  1. Перейти в Firewall > Traffic Shaper > Limiters
  2. Создать новый Limiter или отредактировать существующий
  3. Установить Bandwidth равной примерно 85-95% от реальной скорости канала (измеренной без нагрузки). Установка значения ниже реальной скорости канала необходима, чтобы буферизация происходила в dummynet, а не в оборудовании провайдера.
  4. В разделе Queue Management Algorithm выбрать CoDel или FQ-CoDel
  5. Параметры по умолчанию (target: 5ms, interval: 100ms) подходят для большинства сценариев
  6. Сохранить и применить

Внимание:

Для корректной работы CoDel значение Bandwidth в Limiter должно быть установлено ниже фактической пропускной способности канала. Если Limiter настроен на скорость равную или выше реальной скорости канала, буферизация произойдёт в оборудовании провайдера, где CoDel не может контролировать очередь.

Проверка эффективности

После настройки CoDel рекомендуется выполнить тест bufferbloat с помощью сервиса Waveform Bufferbloat Test ( https://www.waveform.com/tools/bufferbloat ) или аналогичного инструмента. Тест измеряет латентность под нагрузкой и присваивает оценку от A до F.

Целевые показатели:

  • Оценка A или B (латентность под нагрузкой менее 30 мс)
  • Если оценка C или ниже - уменьшить значение Bandwidth в Limiter на 5-10% и повторить тест

Мониторинг Limiters

Активные Limiters и их текущее состояние доступны в Diagnostics > Limiter Info. Страница отображает:

  • Список активных pipes и queues
  • Текущую статистику трафика для каждого Limiter
  • Для per-IP Limiters (с маской) - отдельные бакеты для каждого IP-адреса с индивидуальной статистикой
  • Счётчики отброшенных пакетов

Эта информация полезна для диагностики проблем и проверки корректности применения Limiters.

Диагностика проблем

Limiter не ограничивает скорость

  1. Убедиться, что Limiter привязан к правилу файрвола и это правило действительно совпадает с целевым трафиком. Проверить в Diagnostics > States наличие состояний, соответствующих правилу.
  2. Проверить направления In/Out в правиле. Помнить, что In и Out определяются с точки зрения файрвола.
  3. Убедиться, что трафик не совпадает с другим правилом выше по списку, к которому Limiter не привязан.
  4. Проверить в Diagnostics > Limiter Info, что Limiter активен и отображает трафик.

Speed test показывает скорость выше ограничения

  1. Speed test может использовать множественные TCP-соединения, каждое из которых получает полный per-IP лимит. Это корректное поведение при использовании масок.
  2. Убедиться, что speed test выполняется с хоста, попадающего под правило с Limiter.
  3. Проверить, что единицы измерения совпадают: Limiter настроен в Mbit/s, а speed test может отображать результат в MB/s (1 MB/s = 8 Mbit/s).

Speed test показывает скорость значительно ниже ограничения

  1. Проверить Queue Size - при малом значении на медленных каналах может происходить избыточное отбрасывание пакетов.
  2. Если используется CoDel/FQ-CoDel - убедиться, что Bandwidth установлен не слишком низко.
  3. Проверить загрузку CPU межсетевого экрана - dummynet создаёт дополнительную нагрузку на процессор.

IPv6 трафик не ограничивается

Limiters для IPv4 и IPv6 работают независимо. Для ограничения IPv6-трафика необходимо создать отдельные правила файрвола с привязкой тех же Limiters. Mask bits для IPv6 per-IP ограничения устанавливаются в 128 (вместо 32 для IPv4).

Миграция с других платформ

С MikroTik Simple Queues

MikroTik Simple Queues объединяют ограничение upload и download в одном правиле с указанием target-address. В pfSense эквивалент требует:

  1. Создания двух отдельных Limiters (upload и download)
  2. Привязки обоих Limiters к правилу файрвола через In/Out pipes
  3. Настройки масок для per-IP ограничения (Source address для upload, Destination address для download)

MikroTik Queue Tree с PCQ (Per Connection Queue) аналогичен Limiters с масками. PCQ dst-address соответствует Mask: Destination address, PCQ src-address соответствует Mask: Source address.

С FortiGate Traffic Shaping

FortiGate использует Traffic Shaping Profiles и Policies. Shared shaper в FortiGate аналогичен Limiter с Mask: None. Per-IP shaper в FortiGate соответствует Limiter с Mask: Source/Destination address. Guaranteed bandwidth в FortiGate не имеет прямого аналога в Limiters - для гарантированной полосы необходимо использовать ALTQ HFSC.

Связанные разделы

Last updated on