Хочу на простом примере рассказать, как можно связать друг с другом 2 сервера asterisk по протоколу SIP. Это может быть полезным для оптимизации расходов на междугородную и международную связь, для звонков между филиалами по внутренним номерам. Может еще где-то понадобится, больше не придумал применения.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Содержание:
Введение
Я приведу простой пример, подразумевая, что вы выполнили настройку asterisk по моей статье или схожим образом. Классическая конфигурация для среднестатистического офиса. Представим, что у вас 2 таких офиса в разных городах. Пусть этими городами будут Москва (условное имя сервера moscow) и Санкт-Петербург (условное имя сервера piter) Вы хотите звонить на внутренние номера этих офисов напрямую, как-будто они обслуживаются вашим сервером. Допустим, на сервере moscow у вас номера начинаются на 100 и 200, а в piter на 300 и 400. Я считаю, что между серверами у вас настроен vpn канал и они видят друг друга без проблем.
Если у вас номера пересекаются, например, и там и там начинаются на 100, то задача немного усложняется, но не сильно. Просто придется добавить какую-нибудь еще цифру к набору, а в диалплане ее отсекать. Но я не буду рассматривать этот вариант. Если вы одна организация, то логично сделать такую нумерацию, чтобы она не пересекалась. Если это не так, то лучше ее переделать, чем городить костыли.
Для отладки и тестирования работы voip я рекомендую сервис Zadarma. Плюс его в том, что после регистрации вы получите настройки пира для внутренней сети оператора. И внутри этой сети вы можете бесплатно звонить. Например, я одного пира регистрирую на sip клиенте смартфона и с него звоню на второй аккаунт, пир от которого настроен в астериске. Таким образом эмулирую внешний звонок. Удобно отлаживать различные конфигурации звонков, не требуя платного подключения.
Наша задача будет разбита на 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)
На этом все. Пример написал по горячим следам. Сегодня настраивал такую тему, конфиги взял с реальных серверов.
Другие материалы по asterisk:
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
- Установка и настройка астериск с нуля
- Мониторинг asterisk в zabbix
- Соединение двух серверов астериск
- Анализ SIP трафика
- Замена +7 на 8 и наоборот
- Ограничение на звонки для группы номеров
Доброго времени суток!
Есть необходимость организовать перевод всех входящих звонков с сервер 1 на сервер 2
Подскажите как правильно прописать план звонков, а то мои попытки не увенчались успехом.
P.S: Сервера объединились и друг друга в регистрациях видят
Доброго времени суток. Имеется сервер телефонии grandstream UCM6202 на базе asterisk, можно ли рядом с ним в одной сети поднять сервер на freeswitch и соединить их?
Я думаю, да.
Прошу помощи. Пытался соединить FreePBX и Asterisk. Получилось односторонне - с FreePBX на Asterisk звонки проходят, все нормально, обратно нет. Не могу понять, даже куда смотреть.
Получается по логам, что FreePBX отказывает в подключении Asterisk-у, а с контекстом/авторизацией я запутался.
А Asterisk и FreePBX соединяются?, есть какие то нюансы? Более расширено проблема описана на форуме в теме "Соеденить 2а asterisk сервера между собой"
Сделал по инструкции, всё соединилось, но при попытке звонка с одного на другой в логах вижу
check_auth: username mismatch, have , digest has
Ребят мучился не долго НО пока в поле
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
Скажите, пожалуйста, а можно по SIP или IAX2 соединить два сервера Asterisk, имеющие разные версии - в моем случае 11-ю и 16-ю? Или обязательно более "старый" обновлять нужно?
Думаю, что можно, по sip так точно. Не вижу причин, чтоб это не работало. Я лично 1.8 и 11 соединял, проблем не было.
Я правильно понял, что при настройке связи между двумя астерами (там, где прописываем пиры), нет разделения на мастер-слейв и оба сервера равнозначны?
Если у меня на один филиал приходит транк от провайдера с 2 номерами, а я хочу дать возможность пользоваться номером из этого транка на другом филиале, где развернут еще один астер, это делается по аналогии?
Да, по аналогии. Это просто соединение двух равнозначных серверов для различных схем набора номеров. В том числе и для того, что нужно вам.
Добрый день,
Можете помочь с вопросом.
Есть основной сервер на IVR и есть также вторичный сервер на нем номера внутренние 8XX.
Как можно позвонить из вне и набрать внутренний номер к примеру 801, чтобы звонок доге
Сервера между собой соединены через IAX2
Здравствуйте, есть не большой косяк. Если звонки прокидывают через питер. Если проблемы у провайдера или не оплатили во время то звонки из мосвы не пройдут. Надо будет отменять правила.
Вопрос обрезается, так что не понятен смысл вопроса. Позвонить на ivr и набрать 801 нет никакой проблемы. Звонок уйдет на 801, если маршрутизация звонков настроена между серверами.
Извините, не заметил что вопрос образался.
По внутренним номерам между серверами звонки ходят нормально.
На первом сервере настроено IVR. Позвонив из вне мы попадаем на IVR. Как можно из IVR, если клиент набрал внутренний номер другого сервере, соединить его с сотрудником?
Здесь не должно быть никаких проблем. Просто в контексте с ivr должен быть указан диапазон номеров второго сервера и правила, по которым туда звонить. То есть добавить туда те же правила, что есть в локальных звонках.
Здравствуйте.
Согласен, использовать 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. Я не понимаю, что вы хотите реализовать.
Здравствуйте.
Сделал связь между двумя серверами 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
Нужно разбираться теперь с авторизацией
Только учусь
Имхо, по IAX2 это все будет куда парвильнее будет...преимущества перед SIP между несколькими АТС перечислены в вики....
Может быть, спорить не буду. Но меня такой простой способ никогда не подводил, частенько использую - работает.
А..., т.е. office - это название контекста, которым уже были описаны входящие?
Не входящие, а исходящие для набора внутренних номеров. Когда приходит звонок со второго сервера, он по сути является таким же внутренним звонком по смыслу, что и остальные внутренние внутри одного сервера. То есть суть этого звонка такая же, его можно обработать в том же контексте. Он такой же трехзначный, как и местные локальные.
Поясните пож-та момент: "Можно в контекст для входящих заинклюдить ваш существующий контекст для внутренних звонков..."
include => office
Я не знаю, что добавить. Если внутренние звонки уже описаны конкретным контекстом, можно использовать его, включив сюда через include, а не писать полностью правила заново.