# ALTQ Traffic Shaper в pfSense - визарды и настройка QoS

> Настройка ALTQ шейпера в pfSense - использование визардов для приоритизации трафика, типы планировщиков PRIQ и HFSC, ручная настройка очередей

Source: https://opennix.org/docs/pfsense/traffic-shaper/pfsense-shaper-wizards/


ALTQ (Alternate Queuing) - фреймворк управления очередями, встроенный в pf (packet filter) FreeBSD. В pfSense ALTQ обеспечивает приоритизацию трафика, гарантированную полосу пропускания для критичных приложений и иерархическое распределение пропускной способности канала. ALTQ работает через систему очередей: трафик классифицируется правилами файрвола и направляется в соответствующие очереди, каждая из которых имеет собственные параметры приоритета и полосы пропускания.

Принципиальное отличие ALTQ от Limiters заключается в возможности заимствования полосы пропускания. Если очередь VoIP не использует выделенные ей 2 Mbit/s, эта полоса автоматически перераспределяется между другими очередями. Limiters не поддерживают такого поведения - неиспользованная полоса пропускания в dummynet pipe пропадает.

> **Внимание**:
>
> ALTQ тесно связан с драйверами сетевых адаптеров. Не все драйверы поддерживают ALTQ - перед настройкой необходимо убедиться в совместимости используемых сетевых карт. Активация ALTQ снижает максимальную пропускную способность межсетевого экрана, поскольку обработка очередей создаёт дополнительную нагрузку на процессор.

## Типы планировщиков

pfSense поддерживает четыре типа планировщиков ALTQ. Планировщик определяет алгоритм распределения полосы пропускания между очередями.

### PRIQ (Priority Queuing)

Простейший тип планировщика. Все очереди располагаются на одном уровне непосредственно под корневой очередью - иерархическая вложенность не поддерживается. Каждой очереди назначается приоритет от 0 до 15, где 15 - наивысший приоритет. Очереди с более высоким приоритетом обслуживаются в первую очередь.

**Достоинства:** простота настройки и понимания, минимальные накладные расходы на обработку.

**Недостатки:** жёсткий приоритет без механизма справедливости. Очереди с высоким приоритетом могут полностью вытеснить трафик очередей с низким приоритетом (starvation). PRIQ не учитывает полосу пропускания - распределение основано исключительно на приоритетах.

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

### CBQ (Class-Based Queuing)

Поддерживает иерархическую структуру очередей с возможностью заимствования полосы пропускания от родительской очереди. Приоритеты назначаются в диапазоне от 0 до 7. Очереди с одинаковым приоритетом обслуживаются по принципу round-robin.

Сумма полосы пропускания дочерних очередей не должна превышать полосу пропускания родительской очереди. Дочерние очереди могут заимствовать неиспользованную полосу пропускания у родительской очереди, но не у соседних (sibling) очередей.

**Достоинства:** поддержка иерархии, заимствование полосы, предсказуемое поведение.

**Недостатки:** не гарантирует минимальную полосу пропускания в абсолютном выражении - только пропорциональное распределение с заимствованием.

**Применение:** сценарии, где требуется распределение полосы пропускания по классам трафика с возможностью динамического перераспределения неиспользуемых ресурсов.

### HFSC (Hierarchical Fair Service Curve)

Наиболее функциональный планировщик. Поддерживает иерархическую структуру очередей и предоставляет гарантии минимальной полосы пропускания через механизм service curves. HFSC оперирует тремя типами кривых обслуживания:

**Upper Limit** - жёсткий потолок полосы пропускания. Трафик очереди не может превысить это значение. Параметр m1 ограничивает burst, d задаёт длительность burst в миллисекундах, m2 определяет постоянный потолок.

**Real Time** - гарантированная минимальная полоса пропускания для дочерних очередей. Значение m2 в real-time curve не должно превышать 30% полосы пропускания родительской очереди. Этот механизм обеспечивает минимальную гарантированную полосу для критичного трафика.

**Link Share** - распределение полосы пропускания после выполнения real-time гарантий. Определяет, как неиспользованная полоса распределяется между очередями.

**Достоинства:** гарантированная полоса пропускания, гибкое управление burst, наиболее полный контроль над распределением ресурсов.

**Недостатки:** сложность настройки, необходимость точного расчёта параметров service curves.

**Применение:** VoIP, видеоконференции, среды с жёсткими требованиями к качеству обслуживания (QoS), где необходима абсолютная гарантия полосы пропускания.

### FAIRQ (Fair Queuing)

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

Соединения могут кратковременно превышать полосу пропускания очереди, но среднее потребление поддерживается на уровне определённого для очереди значения.

**Достоинства:** справедливое распределение предотвращает голодание низкоприоритетного трафика.

**Недостатки:** не поддерживается визардом - требуется исключительно ручная настройка.

**Применение:** сценарии, где справедливость распределения важнее строгой приоритизации.

### Сравнение планировщиков

| Характеристика | PRIQ | CBQ | HFSC | FAIRQ |
|---|---|---|---|---|
| Иерархия очередей | Нет (плоская) | Да | Да | Ограниченная |
| Диапазон приоритетов | 0-15 | 0-7 | - | 0-7 |
| Заимствование полосы | Нет | Да | Да | Нет |
| Гарантия полосы | Нет | Нет | Да (real-time curve) | Нет |
| Контроль burst | Нет | Нет | Да (m1/d параметры) | Нет |
| Настройка через визард | Да | Да | Да | Нет |
| Сложность настройки | Низкая | Средняя | Высокая | Средняя |
| Риск starvation | Высокий | Низкий | Низкий | Низкий |

## Настройка через визард

Визард Traffic Shaper - рекомендуемый способ первоначальной настройки ALTQ. Визард создаёт набор очередей и правил floating для наиболее распространённых сценариев приоритизации.

### Доступ к визарду

Перейти в **Firewall > Traffic Shaper > Wizards**. pfSense предоставляет несколько вариантов визарда:

- **Traffic Shaper Wizard** - основной визард для настройки приоритизации трафика
- **Multiple LAN/WAN** - визард для конфигураций с несколькими WAN или LAN интерфейсами

### Шаги визарда

#### Шаг 1: Выбор интерфейсов

Указать WAN-интерфейс (или несколько, при multi-WAN конфигурации) и LAN-интерфейс. Для каждого WAN-интерфейса визард создаст отдельный набор очередей.

#### Шаг 2: Скорости канала

Указать скорость upload и download для WAN-соединения. Рекомендуется указывать 85-95% от реальной скорости канала. Указание полной скорости приводит к буферизации в оборудовании провайдера, что нивелирует эффект приоритизации.

Выбрать тип планировщика. Для большинства сценариев рекомендуется HFSC (обеспечивает гарантии полосы пропускания) или PRIQ (простая приоритизация без гарантий).

#### Шаг 3: VoIP

Настройка приоритизации VoIP-трафика. Визард предлагает выбрать провайдера VoIP из предопределённого списка или указать параметры вручную. При активации этого шага VoIP-трафик получает наивысший приоритет.

Параметры, доступные на этом шаге:

- **Enable** - включить приоритизацию VoIP
- **Provider** - выбор из списка известных VoIP-провайдеров (определяет порты и протоколы)
- **Connection Upload/Download** - полоса пропускания, выделяемая для VoIP

#### Шаг 4: Penalty Box

Penalty Box позволяет принудительно ограничить определённые IP-адреса или подсети, помещая их в очередь с наименьшим приоритетом. Трафик хостов, помещённых в Penalty Box, обслуживается только при наличии свободной полосы пропускания.

- **Enable** - включить Penalty Box
- **Address** - IP-адреса или подсети для помещения в Penalty Box
- **Bandwidth** - максимальная полоса пропускания для Penalty Box (в процентах от общей или в абсолютных значениях)

#### Шаг 5: P2P Networking

Настройка ограничения P2P-трафика (BitTorrent и подобных протоколов). P2P-трафик помещается в очередь с низким приоритетом.

- **Enable** - включить ограничение P2P
- **Bandwidth** - полоса пропускания для P2P-трафика

> **Внимание**:
>
> Обнаружение P2P-трафика основано на известных портах и протоколах. Зашифрованный P2P-трафик на нестандартных портах может не определяться корректно и обрабатываться как обычный трафик.

#### Шаг 6: Категории трафика

Визард предоставляет настройку приоритетов для стандартных категорий:

- **Games** - трафик онлайн-игр (высокий приоритет)
- **Other networking protocols** - ICMP, DNS, SNMP (средний-высокий приоритет)
- **Multimedia/Streaming** - аудио и видеостриминг
- **Work/Business** - HTTPS, IMAP, SMTP, SSH (средний-высокий приоритет)

Для каждой категории можно задать:

- Включение/отключение приоритизации
- Полосу пропускания (при использовании HFSC или CBQ)

#### Шаг 7: Применение

Визард генерирует очереди и floating rules и применяет конфигурацию. Все существующие очереди и правила шейпера удаляются и заменяются новыми.

> **Внимание**:
>
> Повторный запуск визарда полностью перезаписывает текущую конфигурацию шейпера. Все ручные изменения очередей и правил будут утеряны. Перед запуском визарда рекомендуется создать резервную копию конфигурации в **Diagnostics > Backup & Restore**.

## Ручная настройка очередей

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

### Создание корневой очереди

1. Перейти в **Firewall > Traffic Shaper > By Interface**
2. Выбрать интерфейс (WAN или LAN)
3. Настроить корневую очередь:
   - **Scheduler Type** - тип планировщика (PRIQ, CBQ, HFSC или FAIRQ)
   - **Bandwidth** - общая полоса пропускания интерфейса
   - **Queue Limit** - максимальное количество пакетов в очереди
4. Сохранить

### Создание дочерних очередей

1. Выбрать корневую очередь в дереве интерфейса
2. Нажать **Add new Queue**
3. Настроить параметры:
   - **Queue Name** - имя очереди (без пробелов)
   - **Priority** - приоритет (зависит от типа планировщика)
   - **Bandwidth** - полоса пропускания для CBQ/HFSC
   - **Bandwidth Type** - единицы (%, Kbit/s, Mbit/s)
   - **Queue Limit** - предел очереди в пакетах
   - **Default Queue** - отметить одну очередь как очередь по умолчанию (для неклассифицированного трафика)
4. Сохранить

### Параметры HFSC Service Curves

При использовании HFSC для каждой дочерней очереди доступны три кривые обслуживания:

**Upper Limit Service Curve:**
- **m1** - burst bandwidth (Kbit/s)
- **d** - burst duration (ms)
- **m2** - steady-state bandwidth cap (Kbit/s)

**Real Time Service Curve:**
- **m1** - initial burst guarantee
- **d** - burst duration
- **m2** - minimum guaranteed bandwidth (не более 30% от родительской очереди)

**Link Share Service Curve:**
- **m1** - burst sharing bandwidth
- **d** - burst duration
- **m2** - steady-state share

Для типичных сценариев достаточно задать только параметр m2 в каждой кривой, оставив m1 и d нулевыми.

### Назначение трафика в очереди

Трафик направляется в очереди через правила файрвола. Существует два метода:

**Floating rules с действием Match:**

1. Перейти в **Firewall > Rules > Floating**
2. Создать правило с действием **Match** (не Pass и не Block)
3. Указать параметры классификации трафика (порты, протоколы, адреса)
4. В параметрах правила выбрать **Ack Queue** и **Queue**
5. Правило Match не влияет на пропуск или блокировку трафика - оно только классифицирует пакеты и направляет их в соответствующие очереди

**Правила интерфейсов с действием Pass:**

1. В существующем правиле Pass на вкладке интерфейса
2. В разделе Advanced выбрать **Ack Queue** и **Queue**
3. Пакеты, совпавшие с этим правилом, будут направлены в указанную очередь

**Ack Queue** используется для выделения TCP ACK-пакетов в отдельную очередь. Это рекомендуемая практика, поскольку задержка ACK-пакетов существенно снижает производительность TCP.

## DiffServ и DSCP маркировка

ALTQ поддерживает маркировку пакетов значениями DSCP (Differentiated Services Code Point). Маркировка полезна при взаимодействии с провайдером или вышестоящим маршрутизатором, поддерживающим DiffServ.

### Стандартные значения DSCP

| DSCP значение | PHB класс | Назначение |
|---|---|---|
| EF (46) | Expedited Forwarding | VoIP, видео реального времени |
| AF41 (34) | Assured Forwarding 4 | Видеоконференции |
| AF31 (26) | Assured Forwarding 3 | Потоковое видео |
| AF21 (18) | Assured Forwarding 2 | Транзакционные данные |
| AF11 (10) | Assured Forwarding 1 | Объёмные данные |
| CS1 (8) | Class Selector 1 | Фоновый трафик (backup, P2P) |
| BE (0) | Best Effort | Трафик по умолчанию |

### Настройка DSCP маркировки

Маркировка настраивается в параметрах очереди. Пакеты, попавшие в очередь, маркируются указанным значением DSCP при выходе с интерфейса.

Маркировка входящего трафика от провайдера может использоваться для классификации - pfSense может считывать DSCP-метки входящих пакетов и направлять их в соответствующие очереди на основании правил файрвола с фильтрацией по DSCP.

## Аппаратные ограничения

### Совместимость драйверов NIC

ALTQ работает только с сетевыми адаптерами, драйверы которых поддерживают фреймворк ALTQ. Наиболее распространённые совместимые драйверы:

| Драйвер | Адаптеры | Совместимость с ALTQ |
|---|---|---|
| igb | Intel I350, I210, I211 | Да |
| em | Intel PRO/1000 | Да |
| ix | Intel 10G (X520, X540) | Да |
| re | Realtek 8111/8168 | Да |
| bge | Broadcom BCM57xx | Да |
| vtnet | Virtio (виртуализация) | Да |
| vmx | VMware VMXNET3 | Да |
| ixl | Intel X710, XL710 | Проверить версию |

При использовании несовместимого драйвера ALTQ не активируется и очереди не создаются. Ошибка отображается в системном журнале. В этом случае следует использовать Limiters, которые не зависят от драйверов.

Для проверки совместимости конкретного адаптера следует обратиться к странице **System > General Setup** и определить имя драйвера интерфейса, затем проверить его наличие в списке совместимых драйверов в документации Netgate.

### Влияние на производительность

Активация ALTQ снижает максимальную пропускную способность межсетевого экрана. На оборудовании с процессорами ARM или Atom снижение может достигать 30-50%. На серверном оборудовании с процессорами Xeon влияние менее значительно, но всё равно присутствует.

Рекомендации:

- На каналах свыше 1 Gbit/s оценить, достаточна ли производительность оборудования с активным ALTQ
- Для каналов свыше 10 Gbit/s ALTQ, как правило, непрактичен - следует использовать Limiters или внешнее оборудование QoS
- Провести нагрузочное тестирование после активации шейпера

## Мониторинг очередей

### Status > Queues

Страница **Status > Queues** отображает состояние всех активных очередей в реальном времени:

- Название очереди и её место в иерархии
- Текущая загрузка (в процентах от выделенной полосы пропускания)
- Количество пакетов в очереди
- Счётчик отброшенных пакетов (drops)
- Графики загрузки

Высокое значение drops указывает на недостаточную полосу пропускания для данной очереди. Если drops растут в критичных очередях (VoIP, интерактивный трафик) - необходимо пересмотреть распределение полосы пропускания.

### Интерпретация графиков

Для корректной работы шейпера график корневой очереди должен показывать загрузку, близкую к 100%, в моменты пиковой нагрузки. Если корневая очередь загружена менее чем на 50% в периоды нагрузки - значение общей полосы пропускания установлено слишком высоко, и шейпер не выполняет свою функцию.

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

### Визард не применяет конфигурацию

1. Убедиться, что драйвер NIC совместим с ALTQ. Проверить **System > General Setup** для определения драйвера.
2. Проверить журнал системы (**Status > System Logs**) на наличие ошибок, связанных с ALTQ.
3. Убедиться, что указанные скорости upload/download корректны и не превышают физические возможности канала.

### Очереди созданы, но трафик не приоритизируется

1. Проверить, что floating rules с действием Match созданы и активны (**Firewall > Rules > Floating**).
2. Убедиться, что трафик совпадает с правилами классификации - проверить в **Diagnostics > States**.
3. Проверить **Status > Queues** - если трафик не попадает в целевые очереди, правила классификации некорректны.
4. Убедиться, что одна из очередей назначена как Default - неклассифицированный трафик попадает в неё.

### Высокие drops в очередях

1. Drops - нормальное явление для очередей с низким приоритетом при высокой нагрузке.
2. Drops в очередях с высоким приоритетом указывают на недостаточную выделенную полосу пропускания.
3. Увеличить полосу пропускания для очереди или пересмотреть распределение.
4. Проверить, что общая скорость канала указана корректно (85-95% от реальной).

### Несовместимый драйвер NIC

Если сетевой адаптер не поддерживает ALTQ:

1. Использовать Limiters вместо ALTQ - они не зависят от драйверов
2. При необходимости приоритизации - рассмотреть замену сетевого адаптера на совместимый (Intel igb, em или ix)
3. В виртуальных средах - убедиться, что используется драйвер vtnet (KVM/QEMU) или vmx (VMware)

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

- [Traffic Shaper в pfSense](/docs/pfsense/traffic-shaper/) - обзор механизмов управления полосой пропускания, сравнение ALTQ и Limiters
- [Limiters](/docs/pfsense/traffic-shaper/pfsense-limiters/) - ограничение полосы пропускания per-IP и per-subnet через dummynet
- [Правила файрвола](/docs/pfsense/firewall/pfsense-firewall-rules/) - создание правил и floating rules для классификации трафика

