IAX2 one love (межASteriskные транки)

Это короткое продолжение серии про Asterisk.
Предыдущие части Часть 1, Часть 2, Часть 3

Я расскажу как и почему я ограниченно применяю IAX2 в контексте предыдущих записей.

Что же такое IAX2 и почему я про него пишу

IAX2 это проприетарный протокол Sangoma Technologies RFC 5456, который может использоваться для соединения 2х и более систем на базе Asterisk. На самом деле, можно и оконечные устройства (даже soft phone) пустить по нему, но про это - чуть позже.

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

Так же, в отличие от SIP, его достаточно просто настроить для разных пропускных способностей сети, а тесты показывают достаточно ощутимый рост производительности (читай качества) звонков.

Так же IAX2 умеет в шифрование, работает через UDP, относительно просто настраивается в Asterisk.

Звучит вкусно? А в чем подвох?

Не все так сладко

Как я уже упоминал, IAX2 проприетарный - в частности у него серьезные проблемы с расширением (требуется, по сути, пересогласовывать\перевыпускать RFC), есть достаточно неприятные проблемы с безопасностью.

Если вопрос с безопасностью можно решить завернув IAX2 трафик в туннель, то вот с расширениями есть сложности. Несмотря на то, что в IAX2 заявляется поддержка IMAGE, HTML, TEXT, VIDEO, VOICE - это не замена SIP.

Самое главное чего нет в IAX - аналога SipMessage

Вы не сможете отправлять текстовые сообщения, принимать их и так далее. Есть еще целый ряд различий, делающих применение IAX очень нишевым.

И да - можно обмазать это все AGI, использовать IAX2 SEND TEXT и так далее (кстати, команда TEXT практически не документирована, я смог найти только это)... НО ЗАЧЕМ?!
У каждого из протоколов есть сильные стороны, которыми можно прикрыть слабые - другого.

Так где и зачем его использовать?

Помните, мы строили систему из центрального сервера и оконечных гейтвеев?
Ну так вот эти самые гейтвеи, в плане голоса, спокойно можно перевести на IAX2.

И да, мы не отказываемся от SIP транков, просто голос пойдет через IAX.

Начнем мы с настроек Asterisk'ов.

  1. Включим модуль (на всех участниках обмена)
    modules.conf >> load = chan_iax2.so

  2. Создадим конфигурацию
    Для центра:
    iax.conf:
    [general]
    bindaddr= ; IP интерфейса где будем слушать
    autokill=yes
    language=en ; Основной язык канала
    bandwidth=high ; если вы не совсем на 2G работаете
    jitterbuffer=yes
    context=default

    [gatewayA]
    secret= ; Пароль\код авторизации
    host= ; IP интерфейса gatewayA, который готов в IAX2
    type=friend
    language= ; Язык канала
    context= ; контекст вашего плана набора (то, что [default][from-local] и так далее) куда будут падать все вызовы
    qualify=yes
    qualifyfreqok=25000
    trunk=yes
    forceencryption=yes
    encryption=yes
    auth=md5
    description=GSM Gateway A ; Текстовая строка описание

    [gatewayB]
    secret=
    host=
    type=friend
    language=
    context=default
    qualify=yes
    qualifyfreqok=25000
    trunk=yes
    forceencryption=yes
    encryption=yes
    auth=md5
    description=GSM Gateway B
    ...

  3. Загрузим модуль IAX2
    *CLI> module load chan_iax2

  4. Открываем UDP порт 4569 на нужном интерфейсе

Что тут важно? В целом все, но самое главное тут context, иначе в diaplan придется его каждый раз прописывать.
За подробностями и опциями iax.conf - можно изучить пример, достаточно хорошо все описано и особых хитростей там нет.

Далее нам нужно "раскатать" конфигурацию по, собственно, гейтвеям. Я просто копировал тот же самый файл с центрального сервера, заменял название секции гейтвея на [central] и менял, соответственно host= на адрес центральной станции.
Т.е. примерно вот так:
[general]
bindaddr=
language=
bandwidth=high
jitterbuffer=yes

[central]
secret=
host=
type=friend
context=default
qualify=yes
qualifyfreqok=25000
trunk=yes
auth=md5
forceencryption=yes
encryption=yes
description=Central PBX

Если вы все сделали верно, на команду "покажи ка мне друзей", мы должны их увидеть здоровыми и готовыми к работе!
*CLI> iax2 show peers
Name/Username Host Mask Port Status Description
central xxx.xxx.xxx.xxx (S) 255.255.255.255 4569 (T) (E) OK (77 ms) Central PBX
1 iax2 peers [1 online, 0 offline, 0 unmonitored]


Настроим dialplan:

Теперь мы должны рассказать Asterisk, что звонки у нас теперь идут не через SIP, а через IAX2.
Тут все зависит от вашего плана, но, если совсем коротко, то:

  1. Ищем строки типа same = n,Dial(PJSIP/gatewayA/sip:${EXTEN}@IP:PORT)

  2. Заменяем на строки типа same = n,Dial(IAX2/central/${EXTEN})

Обратили внимание, что у нас нет контекста в случае IAX2 (Dial(IAX2/central/${EXTEN}@context) - это потому, что мы прописали его в настройках транков.

Теоретически, если вы все сделали верно, ваши звонки должны начать бегать через IAX2. Обратите внимание, мы не трогаем MessageSend и аналогичные SIP'ные штуки.

Что получилось?

Получилось, что у нас 2 танка: SIP + IAX2. Голос бегает через IAX, со всеми его плюшками, SMS ходят через SIP.

Что не получилось (и не получится)?

Я описывал конкретно свой случай. Если у вас пользователи (extenstions) висят на разных серверах, объединенных через IAX2, я не уверен что текстовые сообщения будут проходить.

Так же, если у вас очень хитрый план звонков, он может не пережить появление в нем IAX2. В моем конкретном случае, нужно было, всего лишь, завернуть голос - у меня нет ничего на конечных гейтвеях, кроме SendMessage, что не переживало бы IAX2.

Заключение

Ощутил ли я результат? Да, стало "получше", но нужно тюнить для каждого конкретного канала. Если у вас большие задержки, высокий Jitter, можно поиграть с jitterbuffer и qualifyfreqok. IAX достаточно чувствителен к задержкам, меньше чем SIP, но это не вездеход.
Можно поиграть кодеками, которые используются в транке - я не стал, работает хорошо и в автомате.
В целом, по сравнению с SIP настройка проще, протокол более устойчив к NAT.


Надеюсь эта короткая заметка поможет если вы ищете способ повысить качество голоса в своей локальной телефонной сети.

@HellKaim
16.02.2024 20:29 UTC
Первоисточник

Комментарии

@arheops
17.02.2024 05:30 UTC
0

ох. не помню уже, когда его применял. PJSIP и современная инфраструктура в 99.9% дружат достоточно хорошо.

Транки тоже ушли в прошлое с улучшением линков.

@HellKaim
17.02.2024 17:14 UTC
0

Ну, я же писал - все зависит от реализации.

Я ни коем разом не считаю себя спецом по VoIP & Asterisk. Это, скорее, заметки на полях и плод моего обобщения.

Мне проще кидать звонки/сообщения траншами, так как я сразу передаю/получаю информацию о CallerID. Возможно, в "разорванной" схеме можно придумать как это передавать, но получится сложнее кмк.

17.02.2024 17:25 UTC
0

Оно все так же иногда глючит при переходе SIP/iax/SIP.

Не совсем понял причем тут CallerID, он так же само ходит по SIP.

Просто я не вижу чего вы улучшили данной сменой.

Джитербуфер точно так же доступен и для SIP. Но теперь у вас смена протокола, она не передает некоторые параметры и часто меняет кодеки.

17.02.2024 18:32 UTC
0

Джиттер в SIP, как я понял, настраивается а диалплане и требует компиляции Астерикса с его поддержкой (может оно и по дефолта там, но не уверен).

Смена кодека... возможно, если клиенты начали с opus. Оно перекодирует его в uLaw.

В моем случае, я добился большей пропускной способности и меньшего количества соединений через не самый стабильный туннель при передаче голоса. Нет отдельного rtp + sip.

Интересно, какие ещё параметры не передаются в IAX2?

17.02.2024 18:47 UTC
0

Нет, сейчас во всех каналах одна и та же реализация джитера.

Более того, он же работает в канале Local

Выкидывает P-asserted-id к примеру. BLF перестает работать. Много чего.

17.02.2024 19:09 UTC
0

Вы хотите сказать, что в случае транка, все звонки считаются local?

17.02.2024 19:44 UTC
0

Как я понимаю мой случай, если я использую soft phone, делая вызов через sip в сторону гейтвея с gsm модемом, канал local существует до момента ответа гейтвея. Далее он "оптимизируется" из контекста, оставляя прямой канал между приложением и гейтвеем.

В случае без iax, происходит 2 sip вызова, образуется 2 local канала, оба из которых "оптимизируются".

В случае с iax, по сути, так же.

Джиттер применяется на iax "ногу" вызова. Если вы можете прокомментировать ситуацию - буду благодарен.

17.02.2024 19:57 UTC
0

Local/ это луп-канал.https://www.voip-info.org/asterisk-local-channels/

Если вы добавите джиттер буфер и /n в конце - он не будет "оптимизироваться".

Реализация джитер-канала сейчас в ядре.

IAX убирает практически все фишки протокола SIP, много чего пропадает.

17.02.2024 20:01 UTC
0

Да, про /n и /j я знаю.

И да, iax очень "ограничивает". Возможно, интеграция в мое решение iax - не такая уж и хорошая идея. Я, даже, спорить не буду.

@la_stik
17.02.2024 13:55 UTC
0

s/Пердыдущие/Предыдущие

@HellKaim
17.02.2024 17:15 UTC
0

Done

@enamchuk
20.02.2024 13:10 UTC
0

IAX2 не поддерживает wideband кодеки типа Opus, AMR-WB и т.д. Иногда это важно.

@HellKaim
20.02.2024 16:33 UTC
0

Да, все так. Я даже понимаю, что в большинстве случаев SIPa более чем достаточно.

@turbidit
24.02.2024 09:03 UTC
0

Единственная причина, зачем держим его на своей PBX - через iaxmodem работает HyalFax, которая собирает и отправляет все факсы компании. Секретари забыли железные факсы как страшный сон еще 8 лет назад.

Но надо признаться, что каждый год факсов все меньше, и это радует.

@HellKaim
24.03.2024 10:14 UTC
0

На самом деле, я почти отказался от SipMessage. Найти андроид клиент, который бы не зависимо о пущей или настроить эти самые пуш - сложнее, чем слать смс в виде письма.