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'ов.
Включим модуль (на всех участниках обмена)
modules.conf >> load = chan_iax2.soСоздадим конфигурацию
Для центра:
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
...Загрузим модуль IAX2
*CLI> module load chan_iax2
Открываем 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.
Тут все зависит от вашего плана, но, если совсем коротко, то:
Ищем строки типа
same = n,Dial(PJSIP/gatewayA/sip:${EXTEN}@IP:PORT)
Заменяем на строки типа
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.
Надеюсь эта короткая заметка поможет если вы ищете способ повысить качество голоса в своей локальной телефонной сети.