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

6446988f4a82ed319d79abf6103fc7ee.jpg

Это короткое продолжение серии про 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.


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

© Habrahabr.ru