Соединить 2 asterisk сервера между собой

Хочу на простом примере рассказать, как можно связать друг с другом 2 сервера asterisk по протоколу SIP. Это может быть полезным для оптимизации расходов на междугородную и международную связь, для звонков между филиалами по внутренним номерам. Может еще где-то понадобится, больше не придумал применения.

Онлайн-курс по устройству компьютерных сетей

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Введение

Я приведу простой пример, подразумевая, что вы выполнили настройку asterisk по моей статье или схожим образом. Классическая конфигурация для среднестатистического офиса. Представим, что у вас 2 таких офиса в разных городах. Пусть этими городами будут Москва (условное имя сервера moscow) и Санкт-Петербург (условное имя сервера piter) Вы хотите звонить на внутренние номера этих офисов напрямую, как-будто они обслуживаются вашим сервером. Допустим, на сервере moscow у вас номера начинаются на 100 и 200, а в piter на 300 и 400. Я считаю, что между серверами у вас настроен vpn канал и они видят друг друга без проблем.

Если у вас номера пересекаются, например, и там и там начинаются на 100, то задача немного усложняется, но не сильно. Просто придется добавить какую-нибудь еще цифру к набору, а в диалплане ее отсекать. Но я не буду рассматривать этот вариант. Если вы одна организация, то логично сделать такую нумерацию, чтобы она не пересекалась. Если это не так, то лучше ее переделать, чем городить костыли.

Для отладки и тестирования работы voip я рекомендую сервис Zadarma. Плюс его в том, что после регистрации вы получите настройки пира для внутренней сети оператора. И внутри этой сети вы можете бесплатно звонить. Например, я одного пира регистрирую на sip клиенте смартфона и с него звоню на второй аккаунт, пир от которого настроен в астериске. Таким образом эмулирую внешний звонок. Удобно отлаживать различные конфигурации звонков, не требуя платного подключения.

Наша задача будет разбита на 2 этапа:

  1. Готовим пиры и регистрации для связи двух серверов между собой.
  2. Настраиваем dialplan, чтобы распределять звонки по серверам.

Может возникнуть вопрос: "А зачем вообще соединять 2 сервера, если можно сделать один сервер asterisk и подключить к нему абонентов обоих офисов?". Причины могут быть разными. Мне видятся несколько, например:

  • В каком-то филиале нестабильный интернет. Офис не хочет терять возможность внутренних звонков при проблемах с интернетом. А если сервер с астериском будет находиться не у них, то даже между собой не смогут созвониться.
  • Разные люди администрируют сервера. В рамках одного сервера сложнее настроить разделение доступа. Более того, я даже не знаю, как это реализовать. А в случае с разными серверами никаких проблем. Главное не трогать часть диалплана, которая отвечает за звонки друг к другу, а дальше можно конфигурировать как душе угодно.
  • Нужна раздельная статистика и запись звонков. Конечно, можно все это реализовать в рамках одного сервера, но нужно будет либо покупать какое-то коммерческое решение, либо переделывать бесплатное. Я не знаю простого, бесплатного и удобного средства, которое позволит это реализовать в рамках одного сервера. А так ставишь любой cdr viewer и ограничиваешь доступ к web панели любым удобным способом.

Редактируем sip.conf для соединения двух серверов

Идем на сервер moscow и добавляем в sip.conf новый пир, который будет использовать сервер piter для подключения.

[piter]
type=friend
secret=password_p
context=piter-in
host=dynamic
qualify=300

Добавляем аналогичный пир на сервер piter.

[moscow]
type=friend
secret=password_m
context=moscow-in
host=dynamic
qualify=300

Добавляем на сервер moscow в sip.conf регистрацию на сервере piter в соответствии с настройками пира.

register => moscow:password_m@192.168.10.100/piter

В данном случае 192.168.10.100 - ip адрес сервера в Питере. То же самое делаем на сервере piter.

register => piter:password_p@192.168.20.100/moscow

192.168.20.100 - ip адрес астера в Москве. Делаем на обоих серверах sip reload и проверяем состояние пиров и регистраций.

> sip show peers
> sip show registry

Вы должны на каждом сервере увидеть новый подключившийся пир и выполненную регистрацию. Если этого нет, разбирайтесь, в чем может быть дело. Скорее всего проблемы с firewall. Настройте его и проверяйте снова. Серверы должны как минимум без проблем пинговать друг друга по ip. Если все порядке, то идем дальше.

Настройка dialplan для работы с 2-мя серверами

Теперь нам нужно в диалплане на каждом из серверов указать, куда звонить по разным номерам. На сервере moscow укажем, что звонить по маскам 300 и 400 нужно в питер. Добавляем в extentions.conf правило перед основным правилом звонка на внутренние номера с маской _XXX.

exten => _[34]XX,1,Dial(SIP/piter/${EXTEN},15,Tt)

И добавим контекст для приема входящих звонков с сервера piter

[piter-in]
exten => _XXX,1,Dial(SIP/${EXTEN},15,Tt)

Делаем то же самое на сервере piter.

exten => _[12]XX,1,Dial(SIP/moscow/${EXTEN},15,Tt)

Не забываем поменять маску. И добавляем контекст приема звонков с moscow.

[moscow-in]
exten => _XXX,1,Dial(SIP/${EXTEN},15,Tt)

Вот и все. Мы связали между собой 2 астериск сервера. Можно звонить друг другу, используя внутренние номера. Не забудьте перезагрузить план набора.

> dialplan reload

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

[moscow-in]
include => office

Если у вас настроена запись звонков так же, как я рассказал в своей статье про настройку астериска, которую привел в начале, то не забудьте добавить запись по обоим направлениям. Примерно так для сервера moscow на исходящие.

exten => _[34]XX,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _[34]XX,n,Dial(SIP/piter/${EXTEN},15,Tt)

И вот так на входящие:

[piter-in]
exten => _XXX,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _XXX,n,Dial(SIP/${EXTEN},15,Tt)

На этом все. Пример написал по горячим следам. Сегодня настраивал такую тему, конфиги взял с реальных серверов.

Если есть необходимость, то можно расширить эту конфигурацию и настроить звонки в Питер из Москвы через сервер piter, если там более выгодный тариф для локальных звонков. Для этого нужно добавить маски питерских номеров в dialplan на сервере moscow, а на сервере piter в контекст входящих звонков с moscow настроить набор через свой питерский транк.

Другие материалы по asterisk:

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

30 комментариев

  1. Доброго времени суток!
    Есть необходимость организовать перевод всех входящих звонков с сервер 1 на сервер 2
    Подскажите как правильно прописать план звонков, а то мои попытки не увенчались успехом.
    P.S: Сервера объединились и друг друга в регистрациях видят

  2. Доброго времени суток. Имеется сервер телефонии grandstream UCM6202 на базе asterisk, можно ли рядом с ним в одной сети поднять сервер на freeswitch и соединить их?

  3. Прошу помощи. Пытался соединить FreePBX и Asterisk. Получилось односторонне - с FreePBX на Asterisk звонки проходят, все нормально, обратно нет. Не могу понять, даже куда смотреть.
    Получается по логам, что FreePBX отказывает в подключении Asterisk-у, а с контекстом/авторизацией я запутался.

  4. Александр

    А Asterisk и FreePBX соединяются?, есть какие то нюансы? Более расширено проблема описана на форуме в теме "Соеденить 2а asterisk сервера между собой"

  5. Владимир

    Сделал по инструкции, всё соединилось, но при попытке звонка с одного на другой в логах вижу
    check_auth: username mismatch, have , digest has

  6. Ребят мучился не долго НО пока в поле
    host= не прописал ip не заработало

    у вас должно быть так
    или подскажите почему не работает с host=dynamic ????

    [piter]
    type=friend
    secret=password_p
    context=piter-in
    host=192.168.20.100
    qualify=300

    [moscow]
    type=friend
    secret=password_m
    context=moscow-in
    host=192.168.10.100
    qualify=300

  7. Владимир

    Скажите, пожалуйста, а можно по SIP или IAX2 соединить два сервера Asterisk, имеющие разные версии - в моем случае 11-ю и 16-ю? Или обязательно более "старый" обновлять нужно?

    • Думаю, что можно, по sip так точно. Не вижу причин, чтоб это не работало. Я лично 1.8 и 11 соединял, проблем не было.

  8. Я правильно понял, что при настройке связи между двумя астерами (там, где прописываем пиры), нет разделения на мастер-слейв и оба сервера равнозначны?
    Если у меня на один филиал приходит транк от провайдера с 2 номерами, а я хочу дать возможность пользоваться номером из этого транка на другом филиале, где развернут еще один астер, это делается по аналогии?

    • Да, по аналогии. Это просто соединение двух равнозначных серверов для различных схем набора номеров. В том числе и для того, что нужно вам.

  9. Добрый день,
    Можете помочь с вопросом.
    Есть основной сервер на IVR и есть также вторичный сервер на нем номера внутренние 8XX.
    Как можно позвонить из вне и набрать внутренний номер к примеру 801, чтобы звонок доге

    • Сервера между собой соединены через IAX2

      • Здравствуйте, есть не большой косяк. Если звонки прокидывают через питер. Если проблемы у провайдера или не оплатили во время то звонки из мосвы не пройдут. Надо будет отменять правила.

    • Вопрос обрезается, так что не понятен смысл вопроса. Позвонить на ivr и набрать 801 нет никакой проблемы. Звонок уйдет на 801, если маршрутизация звонков настроена между серверами.

      • Извините, не заметил что вопрос образался.
        По внутренним номерам между серверами звонки ходят нормально.
        На первом сервере настроено IVR. Позвонив из вне мы попадаем на IVR. Как можно из IVR, если клиент набрал внутренний номер другого сервере, соединить его с сотрудником?

        • Здесь не должно быть никаких проблем. Просто в контексте с ivr должен быть указан диапазон номеров второго сервера и правила, по которым туда звонить. То есть добавить туда те же правила, что есть в локальных звонках.

  10. Здравствуйте.
    Согласен, использовать IAX лучше, особенно на слабых канала. Тем более, что настройки ни чем не отличаются.
    И второе, транки можно настроить еще проще. Т.к. сервера имеют статические IP, достаточно прописать их в параметре host.
    При этом параметр secret и строка регистрации не нужны. Так же подключаются и шлюзы Yeastar.

    • Eugenics, если можно пример конфига транка на стороне астера? без указания номера горячей линии не работают входящие

      • Конфиг IAX
        type=friend
        qualify=yes
        nat=no
        host=192.168.10.100 (на другом конце 192.168.20.100)
        context=from-internal
        Маршрутизация настраивается , как описано в статье.
        Но судя про упоминание "номера горячей линии " вы говорите про Yeastar. НО тут понятно что входящие нужно куда то направить. И это как раз "номер горячей линии ", что может быть номером группы. Или создавайте входящей маршрут по DID. Я не понимаю, что вы хотите реализовать.

  11. Здравствуйте.
    Сделал связь между двумя серверами asterisk по вашей статье, всё работало как надо, звонки проходили. На следующий день всё сломалось.
    На астериске, с которого идет звонок, в логах

    chan_sip.c:24003 handle_response_invite: Received response: "Forbidden" from блабла

    На астериске, на который идёт звонок, в логах

    chan_sip.c:26307 handle_request_invite: Failed to authenticate device блабла

    Подскажите, в чём может быть проблема?

    • Надо дебажить. Если работало, а потом перестало, значит что-то изменилось. Проверять внимательно еще раз все. В принципе, вторая ошибка намекает на источник проблем.

    • Такая же шняга, только у меня сразу не работало и выдавало такие же ошибки

      Исправилось, когда добавил в настройки пиров [piter]/[moscow] строку

      insecure=port,invite

      Вычитал тут
      https://sysadmins.ru/topic268089.html

  12. Владимир

    Имхо, по IAX2 это все будет куда парвильнее будет...преимущества перед SIP между несколькими АТС перечислены в вики....

    • Может быть, спорить не буду. Но меня такой простой способ никогда не подводил, частенько использую - работает.

  13. Александр

    А..., т.е. office - это название контекста, которым уже были описаны входящие?

    • Не входящие, а исходящие для набора внутренних номеров. Когда приходит звонок со второго сервера, он по сути является таким же внутренним звонком по смыслу, что и остальные внутренние внутри одного сервера. То есть суть этого звонка такая же, его можно обработать в том же контексте. Он такой же трехзначный, как и местные локальные.

  14. Александр

    Поясните пож-та момент: "Можно в контекст для входящих заинклюдить ваш существующий контекст для внутренних звонков..."
    include => office

    • Я не знаю, что добавить. Если внутренние звонки уже описаны конкретным контекстом, можно использовать его, включив сюда через include, а не писать полностью правила заново.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar