< meta name="referrer" content="origin">
Home » Asterisk » Соединить 2 asterisk сервера между собой

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

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

Введение

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

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

Наша задача будет разбита на 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 настроить набор через свой питерский транк.

Помогла статья? Есть возможность отблагодарить автора

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

  1. Александр

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

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

  2. Александр

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

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

  3. Владимир

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

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

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

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

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

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

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

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

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

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

Ваш e-mail не будет опубликован.