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 0

16 значений для 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 3000
tc qdisc add dev eth1 parent 1:2 handle 20: sfq
tc 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:1
tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip sport 4569 0xffff flowid 1:1
tc 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

Теперь вам остается только автоматически выполнять соответствующие команды при загрузке.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.