VoIP настройки · 4 min read · Jan 22, 2026
QoS и управление трафиком для пользователей VoIP с использованием iproute2 и Asterisk
QoS и управление трафиком для пользователей VoIP с использованием iproute2 и Asterisk
Качество моих VoIP-звонков страдало всякий раз, когда я что-то загружал или загружал. Это было раздражающе, особенно для тех, кто звонил мне (я слышал их лучше, чем они слышали меня). Поэтому я покопался в Iproute2 и других инструкциях, особенно касательно VoIP-трафика, но не смог найти ничего, что работало бы хорошо. После некоторых экспериментов я нашел настройки, которые подошли мне: стабильное качество VoIP, независимо от любых действий в сети.
Примечание относительно моей VoIP-системы: я использую Asterisk на запасном ноутбуке (IBM T20), а мой VoIP-провайдер — отличный Unlimitel в Канаде. Поскольку я хостю свой собственный Asterisk, я могу настроить его так, как мне нужно. Я также купил IAX-телефон, который находится в моей локальной сети.
Настройка
Я предполагаю, что у вас уже есть настроенный Linux-файрвол. VoIP-пакеты проходят через ваш файрвол, и ваш NAT уже настроен и работает. Мы даже не будем трогать ваш файрвол с этой настройкой. Все, что вам нужно сделать, это создать правильный qdisc, классы и фильтры, чтобы приоритизировать ваши VoIP-пакеты. Команда tc из Iproute2 предназначена для этого.
Предположим, ваша сеть выглядит следующим образом:
Internet <------> Cable modem <-------> Linux Firewall <-----> Intranet <-----> VoIP phoneПоскольку я использую Asterisk с IAX, интересующий нас порт — это порт 4569. Если вы используете SIP, адаптируйте порт в следующих строках.
Некоторая справочная информация
IP-пакеты имеют область, где вы можете задать QoS (качество обслуживания). Хотя ваш провайдер, вероятно, проигнорирует их, вы можете использовать их в своей локальной сети для некоторого управления трафиком. 4 бита QoS:
0x02: Минимизировать денежные затраты
0x04: Максимизировать надежность
0x08: Максимизировать пропускную способность
0x10: Минимизировать задержку
Официально вам разрешено включать не более одного из этих битов. Ваш файрвол может затем просматривать пакеты по мере их поступления и определять, какие из них пересылать первыми, обычно Минимизировать задержку.
Неофициально вы можете включить любые из этих битов одновременно. Таким образом, вы можете иметь пакет с установленными как Минимизировать задержку, так и Максимизировать пропускную способность. Учитывая это, давайте рассмотрим некоторые функции Iproute2.
Iproute2 и tc
По умолчанию пакеты отправляются по принципу “первый пришел — первый вышел”. С помощью tc вы можете кардинально изменить это. Давайте используем очень простую систему очередей: давайте создадим 3 “трубки” (или очереди) и назначим им приоритет. То есть, пока в очереди 1 есть что-то, мы не опустошаем (или не извлекаем) очередь 2, и пока в очереди 2 есть что-то, мы не извлекаем очередь 3.
Это делается с помощью следующей команды (заметьте: eth1 — это внешний интерфейс):
tc qdisc add dev eth1 root handle 1: prio priomap 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 016 значений для priomap важны. Это в основном говорит о том, что большинство пакетов попадает в 3-ю очередь (поскольку мы начинаем с нуля, она называется “2”), за исключением пакетов с установленным QoS Минимизировать задержку, которые помещаются во 2-ю очередь, за исключением пакетов со всеми установленными битами QoS, которые помещаются в 1-ю очередь. (дисциплина приоритета очередей по умолчанию устанавливает 3 очереди)
16 значений идут в порядке для следующего QoS:
1: 0x00: QoS не установлен -> в 3-ю очередь (2)
2: 0x02: Минимизировать денежные затраты (MMC) (2)
3: 0x04: Максимизировать надежность (MR) (2)
4: 0x06: MMC + MR (2)
5: 0x08: Максимизировать пропускную способность (MT) (2)
6: 0x0a: MT + MMC (2)
7: 0x0c: MT + MR (2)
8: 0x0e: MT + MR + MMC (2)
9: 0x10: Минимизировать задержку (MD) (1)
10: 0x12: MD + MMC (1)
11: 0x14: MD + MR (1)
12: 0x16: MD + MMC + MR (1)
13: 0x18: MD + MT (1)
14: 0x1a: MD + MT + MMC (1)
15: 0x1c: MD + MT + MR (1)
16: 0x1e: MD + MT + MR + MMC (0)
Это был наш первый шаг.
Далее мы настроим каждую очередь, чтобы они сами имели некоторую дисциплину очереди:
tc qdisc add dev eth1 parent 1:1 handle 10: sfq limit 3000tc qdisc add dev eth1 parent 1:2 handle 20: sfqtc qdisc add dev eth1 parent 1:3 handle 30: sfqЭто дает первой очереди предполагаемую емкость в 3000 пакетов. На самом деле размер будет 128 пакетов, так как он жестко закодирован в программе tc как максимальный возможный размер.
На этом этапе большинство пакетов будет проходить через 3-ю очередь, за исключением тех, у кого установлен бит QoS Минимизировать задержку.
Если вы настроите ваш iax.conf на вашем Asterisk, чтобы он выглядел следующим образом, некоторые пакеты могут оказаться в первой очереди:
tos=0x1e
Однако, поскольку это не гарантировано, мы заставим их попасть в очередь 1, используя другой трюк из арсенала tc — фильтры.
Помните, IAX использует порт 4569, поэтому мы заставим любой пакет, идущий к этому порту и от него, проходить через первую очередь:
tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip dport 4569 0xffff flowid 1:1tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip sport 4569 0xffff flowid 1:1tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip tos 0x10 0xff flowid 1:2Технически, последняя строка не обязательна, но не повредит оставить ее.
И теперь вы закончили! Все ваши VoIP-пакеты извлекаются в первую очередь. Даже во время интенсивной загрузки или выгрузки вы не потеряете интерактивность для ваших телефонных звонков.
Чтобы увидеть некоторые статистические данные, выполните следующую команду:
tc -s qdisc ls dev eth1Чтобы удалить ваши очереди и вернуться к нормальному состоянию, выполните:
tc qdisc del dev eth1 rootТеперь вам остается только автоматически выполнять соответствующие команды при загрузке.
Get new posts in your inbox
No spam. Unsubscribe anytime.