Как связать два asterisk-сервера (часть вторая. IAX2)

    image
    Статья для начинающих астерисководов.
    Итак, имеем два астериска.
    Задача — организовать прямой дозвон через префикс туда и обратно по IAX2.
    Исходные данные:
    Астериск 1.4 на обеих концах
    1. samara.asterisk.ru — внешнее DNS имя первого астериска.
    2. kazan.asterisk.ru — внешнее DNS имя второго астериска. Пусть он имеет несколько провайдеров (например, kazan2.asterisk.ru, kazan3.asterisk.ru).

    Обратимся к автомобильным кодам регионов.
    Тогда дозвон из Самары будет 9-16-<номер>.
    Из Казани 9-63-<номер>.

    Для начала советую ознакомиться чем IAX2 лучше по сравнению с SIP для взаимодействия server-2-server.

    Не важно имеют ли астериски прямой выход в интернет. Главное — пробросить UDP порт 4569.
    В прошлой статье я описал как реализовать связь по SIP. Теперь дошла очередь IAX2. Тем более, что этот протокол для этого и создавался.

    Еще один аспект — использование правильного кодека. По личному опыту лучше всего подходит G729. Вы его можете найти в интернете и загрузить в астериск в интерфейсе CLI посредством команды module load codec_g729.so.

    iax.conf 1-го (самарского) астериска
    [general]
    disallow=all
    allow=g729
    allow=gsm
    allow=alaw
    allow=ulaw
    bindaddr=0.0.0.0
    calltokenoptional = 0.0.0.0/0.0.0.0
    delayreject=yes

    jitterbuffer=yes

    register => samara:password4samara@kazan.asterisk.ru
    register => samara:password4samara@kazan2.asterisk.ru
    register => samara:password4samara@kazan3.asterisk.ru

    ; see tips in www.voip-info.org/wiki/view/Asterisk+config+iax.conf
    [guest]
    type=user
    host=dynamic

    ; for incoming
    [kazan]
    type=friend
    qualify=yes
    auth=md5
    trunk=yes
    username=kazan
    secret=password4kazan
    host=dynamic
    context=office_rules


    extensions.conf 1-го (самарского) астериска
    ...
    [office]
    exten => _916.,1,Set(CALLERID(all)="Samara (num ${CALLERID(num)}) <63>")
    exten => _916.,n,NoOp(${CALLERID(all)})
    exten => _916.,n,Dial(IAX2/samara:password4samara@kazan/${EXTEN:3},60,tT)
    exten => _916.,n,HangUp
    ...

    include => office_rules

    [office_rules]
    exten => _[12]XX,1,Dial(SIP/${EXTEN},60,tT)
    exten => _[12]XX,n,HangUp


    iax.conf 2-го (казанского) астериска
    [general]
    disallow=all
    allow=g729
    allow=gsm
    allow=alaw
    allow=ulaw
    bindaddr=0.0.0.0
    calltokenoptional = 0.0.0.0/0.0.0.0
    delayreject=yes

    jitterbuffer=yes

    register => kazan:password4kazan@samara.asterisk.ru

    ; see tips in www.voip-info.org/wiki/view/Asterisk+config+iax.conf
    [guest]
    type=user
    host=dynamic

    ; for incoming
    [samara]
    type=friend
    qualify=yes
    auth=md5
    trunk=yes
    username=samara
    secret=password4samara
    host=dynamic
    context=office_rules


    extensions.conf 2-го (казанского) астериска
    ...
    [office]
    exten => _963.,1,Set(CALLERID(all)="Kazan (num ${CALLERID(num)}) <16>")
    exten => _963.,n,NoOp(${CALLERID(all)})
    exten => _963.,n,Dial(IAX2/kazan:password4kazan@samara/${EXTEN:3},60,tT)
    exten => _963.,n,HangUp
    ...

    include => office_rules

    [office_rules]
    exten => _[12]XX,1,Dial(SIP/${EXTEN},60,tT)
    exten => _[12]XX,n,HangUp


    Несколько комментариев.
    1. Очень важно внешним абонентам дать возможность звонить только на внутренние номера.
    Контекст office должен быть описан для ваших офисных пользователей, там же вы можете описать звонки в город и по межгороду.
    Контекст office_rules используется для внешних абонентов — разрешаем там только звонить на внутренние номера (3-х значные, которые начинаются с 1 или с 2).
    2. При звонках используется конструкция:
    Dial(IAX2/login:password@iax-account/...)

    Суть в том, что мы звоним с авторизацией на сервер, который смог у нас зарегистриваться для учетной записи iax-account. Как и в случае с SIP, можно указывать несколько директив register.
    3. В примере внутри офиса используются клиенты, подключенные по SIP.
    4. Просмотреть регистрации для IAX2 можно командой iax2 show registry.
    5. Для случая, если астериск находится за NAT. Допустим для определения провайдера при исходящем трафике у вас используются отдельные ай-пи адрес (например, 192.168.4.5 — один провайдер, 192.168.14.5 — другой провайдер), а на шлюзе идет проброс на ай-пи адрес исходя из провайдера.

    В этом случае, чтобы срабатывала регистрация, нужно в описание пиров на нашем астериске добавить:
    sourceaddress=192.168.4.5
    sourceaddress=192.168.14.5
    Такая конструкция на текущей версии позволяет добиться множественной регистрации одного пира на нескольких провайдерах. Т.е. грубо говоря, имеем возможность несколько раз сказать, что «у нас такой-то IP адрес».
    Пример
    iax2 show registry:
    Host dnsmgr Username Perceived Refresh State
    155.15.75.270:4569 N peer1 72.255.69.78:4569 60 Registered
    92.14.191.35:4569 N peer1 72.255.69.78:4569 60 Registered
    Share post

    Comments 10

      –2
      А чего в этой статье такого, чего нет в /usr/share/doc/asterisk/examples?
        0
        Прочитайте первые четыре слова в статье. И всё станет понятным.
          0
          Чтоли ммеются ввиду настолько начинающие, что ещё не успели прочитать даже конфиги и мануалы идущие в комплекте к астериску?
        +1
        1. Зачем регистрироватья на трех серверах, если при этом использовать только один исходящий пир?

        2. Сделайте пароли одинаковые с двух сторон, и не корячтесь в Dial. При этом в описании пиров должно быть:

        [kazan]
        username=samara

        [samara]
        username=kazan

        3. У Вас везде динамические адреса?
          0
          1.
          Насчет паролей — на вкус и цвет. Для меня как раз понятней, когда пароли разные, это не затуманивает ясность и логику работы.
          2.
          Нет, как раз везде статистика. Смысл тут в том, что если указано host=dynamic тогда можно использовать register. А это, кроме всего прочего, инструмент диагностики подключения.

            0
            Пропустил 1-й пункт.
            Мне кажется, что вы не поняли смысл.
            Сервер то один! Но он имеет 3 ай-пи адреса, которые соответствуют 3-м разным DNS-именам. Если вы думаете, что это много, то могу сказать, что во многих банках не зазорно и 4 канала использовать.
            Это всего лишь затем, чтобы если отвалился один из провайдеров на принимающей стороне у вас не пропала бы возможность звонить.
              +1
              Да, сначала я не понял смысл. Действительно, использовать регистрацию, чтобы «объявить» на каком ты сейчас канале — нормальный способ.
              Но я все равно против конструкции Dial(IAX2/login:password@iax-account/...)
              :)
            0
            Статья, имхо, не несет смысловой нагрузки. Академического изложения, раз вы позиционируете ее для новичков, тут нет: сумбурная копипаста конфигов без внятного описания.

            Больше похоже на то, что вы решили так забэкапить конфиг, лично для себя и давая комментарии, которые будут понятны только вам.
              0
              Вы, пожалуй, во многом правы. Нужно добавить уклон на комментарии и разъяснения. Для новичков сложновато.
              0
              g.729 — плохой выбор.

              1. Требует установки дополнительных модулей для asterisk
              2. Во многих странах требует также оплаты лицензионных отчислений владельцу патента
              3. Качество очень быстро падает в неидеальных сетевых условиях
              image
              4. Создан 17 лет назад

              Only users with full accounts can post comments. Log in, please.