Связать 2 asterisk

Обновлено: 09.05.2024

Пусть 1-й астериск у нас находится в Казани, другой в Волгограде. Обратимся к автомобильным кодам регионов.
Тогда дозвон из Волгограда будет 9-16-.
Из Казани 9-34-.

sip.conf 1-го астериска:
[general]
context=default
allowguest=no
bindport=5060
bindaddr=0.0.0.0

[volgograd]
; логин и пароль для подключения
username=volgograd
secret=volgograd_password
; разрешать входящие и исходящие вызовы
type=friend

; настройка кодеков
disallow=all
allow=alaw
allow=ulaw

; в какой контект будут попадать входящие звонки
context=office_rules

extension.conf 1-го астериска:
; контекст для пользователей
[office]
exten => _934.,1,Set(CALLERID(all) )
exten => _934.,n,Dial(SIP/$@volgograd,60,r)
exten => _934.,n,HangUp
..

; контекст для входящих вызовов
; внутренние номера имеют вид 1XX или 2XX
[office_rules]
exten => _[12]XX,1,Dial(SIP/$,60,tTr)
exten => _[12]XX,n,HangUp()

sip.conf 2-го астериска:
[general]
context=default
allowguest=no
bindport=5060
bindaddr=0.0.0.0

; credentials for registration
username=kazan
secret=kazan_password

; разрешенные кодеки (только G711)
disallow=all
allow=ulaw
allow=alaw

; в какой контекст принимать звонки
context=office_rules

extension.conf 2-го астериска:
; контекст для пользователей
[office]
exten => _916.,1,Set(CALLERID(all) )
exten => _916.,n,Dial(SIP/$@kazan,60,r)
exten => _916.,n,HangUp
..

; контекст для входящих вызовов
; внутренние номера имеют вид 1XX или 2XX
[office_rules]
exten => _[12]XX,1,Dial(SIP/$,60,tTr)
exten => _[12]XX,n,HangUp()

PS. Буду признателен советам по расширению функциональности и безопасности.

upd: В любом случае, в плане аспекта безопасности, нужно глянуть это.

Несколько комментариев.
Если у вас есть определенный опыт при работе с астериском, то у вас должен был возникнуть вопрос.
Как определяется контекст при исходящих звонках?
Запись
context=office_rules

работает только на входящие звонки. Так вот, в данном случае на принимающей стороне астериск видит, что в системе есть peer, который имеет тот же IP-адрес, что и клиент, который совершает звонок. И берет его context.

И еще. Никто не мешает вам указать несколько register, если у вас используется несколько провайдеров. Суть register заключается в том, чтобы сказать, где именно вы находитесь. Если вы 2 или более раз скажите, что «вы здесь», никаких проблем не возникнет и более того, вы будете застрахованы от перебоев одного из провайдеров.

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

Онлайн-курс по Kubernetes – для разработчиков, администраторов, технических лидеров, которые хотят изучить современную платформу для микросервисов Kubernetes. Самый полный русскоязычный курс по очень востребованным и хорошо оплачиваемым навыкам. Курс не для новичков – нужно пройти вступительный тест.

Введение

Я приведу простой пример, подразумевая, что вы выполнили настройку 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.

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

Онлайн курс по Kubernetes

Онлайн-курс по Kubernetes – для разработчиков, администраторов, технических лидеров, которые хотят изучить современную платформу для микросервисов Kubernetes. Самый полный русскоязычный курс по очень востребованным и хорошо оплачиваемым навыкам. Курс не для новичков – нужно пройти вступительный тест.

Конечно, Вы также можете использовать SIP или H.323 (но не MGCP) протоколы для связи двух серверов Asterisk между собой, однако, использование IAX протокола - это самый простой дуть решение этой задачи. Для создания общего плана набора можно использовать следующее:

  • Разумно проектируйте план набора для каждого сервера, чтобы было сразу понятно, какому из серверов принадлежит тот или иной экстеншен, при наборе номера на любом из серверов. Например, используйте номера 3xxx для сервера A, 4xxx - для сервера B и 5xxx - для номеров экстеншенов, подключенных к серверу C.
  • Используйте директиву "switch", для того, чтобы сервер A искал на сервере B те екстеншены, которые не известны на сервера A (оба сервера должны всегда быть в рабочем состоянии и доступны, иначе у Вас будут присутствовать большие задержки между моментом набором номера и какой-либо реакции на это действие!)
  • Можно использовать DUNDILOOKUP: Distributed Universal Number Directory (DUNDi)
  • Можно использовать ENUMLOOKUP (e.164)

Метод с использованием SIP протокола.

Когда мы рассматриваем файл sip.conf, то возможно стоит начать с указания типа клиента, как type=friend, на обоих серверах, и, если при этом все начнет нормально работать, Вам, возможно, захочется разделить эту запись по типам: peer - для исходящих вызовов и user - для входящих вызовов. Также, стоит обратить внимание в файле sip.conf на параметры "insecure=very" ("insecure=port,invite" в версии 1.4) и, возможно, на параметр: "autocreatepeer=yes".

Настройка IAX канала.

При использовании соединения по протоколу IAX между двумя серверами Asterisk, настройка состоит из следующих шагов:

  • Настройте Asterisk сервера с обеих сторон в файле конфигурации in iax.conf, один, как peer, а другой - как user.
  • Настройте план набора в файле extensions.conf для сервера с пользователем типом user так, чтобы можно было принимать вызовы с другова сервера от пользователя с типом peer.
  • Не обязательно, зарегистрируйте пользователя с типом peer, на сервере с пользователем типом user (для случаев, когда, например, сервер с пользователем типа peer имеет динамический ip адрес, который неизвестен второй стороне.)
  • Повторите вышеуказанные шаги, поменяв местами сервер A и B (добавив пользователей, поменяв местами тип peer и user), если вы хотите совершать вызовы в обоих направлениях.

Определение пользователя IAX2 типа user.

Пользователь, типа user - принимает вызовы. Следующие параметры необходимо указать в файле iax.conf на машине с пользователем типа user для проверки (авторизации) перед тем, как позволить ему нас вызвать.

Параметр "context" - очень важен, он устанавливает имя локального контекста, куда будут попадать входящие вызовы от пользователей (Смотри описание файла: extensions.conf ).

Эта настройка позволяет удаленному пользователю зарегистрироваться на Вашем сервере с любого адреса. Если Вы хотите ограничить доступ по IP адресам или хостам, добавьте параметры: permit или deny, в описание Ваших пользователей в файле iax.conf.

Определение пользователя IAX2 типа peer.

Пользователь, типа peer совершает вызовы. Следующие параметры необходимо указать в файле iax.conf на машине с пользователем типа peer для своей идентификации (авторизации) на машине с пользователем типа user, перед тем, как совершить вызов.

[peername]
type=peer
host=hostname.domain.tld (или "dynamic, при этом требуется указать команду "register" для пользователя типа user.)
auth=md5
secret=secretword ; избыточно, если включено в состав команды Dial.
username=username-at-the-peer ; избыточно, если включено в состав команды Dial.

  • тип type=user - авторизирует входящий вызов.
  • тип type=peer - это кто-то, кто совершает исходящие вызовы.
  • type=friend - это, конечно, и то и другое.

Для инструкций по поводу использования директивы "auth=rsa", см: Asterisk IAX RSA авторизация.

Теперь, когда мы завершили шаги 1 и 2, осталось только настроить план набора. Прочитайте нижеприведенные примера, для того, чтобы понять, как это лучше сделать.

Соединение планов набора.

Пример 1

extensions.conf:
exten => _7XXX,1,Dial(IAX2/myserver:passwordA@IAXserverA/$,30,r)
exten => _7XXX,2,Dial(SIP/myserver:passwordA@SIPserverA/$,30,r)
exten => _7XXX,3,Congestion

exten => _8XXX,1,Dial(IAX2/myserver:passwordB@IAXserverB/$,30,r)
exten => _8XXX,2,Dial(SIP/myserver:passwordB@SIPserverB/$,30,r)
exten => _8XXX,3,Congestion

Конечно, нам нужно вместо записей типа [IAXserverA] и т.д., указать те, что мы прописали в файлах iax.conf и sip.conf, чтобы все работало как нужно. В этом примере, SIP используется как резервный канал, в случае проблем соединения по IAX протоколу.
Обратите внимание, что в этом примере имя пользователя и пароль попадает в CDR записи (Вам возможно захочется использовать второй пример или использовать ключевые выражения вместо комбинаций имя пользователя/пароль)!

Пример 2

В этом примере в CDR записях не показывается поле username и secret.

(сервер A)
iax.conf
[general]
register => :

[serverB]
type=friend
user=
secret=

extensions.conf
exten => _7XXX,1,Dial(IAX2/serverB/$,30,r)
exten => _7XXX,2,Congestion

(сервер B)
iax.conf
[serverA]
type=friend
user=
secret=

extensions.conf
exten => _8XXX,1,Dial(IAX2/serverA/$,30,r)
exten => _8XXX,2,Congestion

В некоторых случаях, параметры serverA и serverB, должны содержать имя пользователя сервера.

Пример 3

С помощью объекта Switch в файле extensions.conf Вы можете соединить два сервера Asterisk и план набора другова сервера. В данном случае, наш "server C" или соединяется с "server A" или с "server B":

[default]
exten => _801XXX,1,Goto,srvA|$|1
exten => _802XXX,1,Goto,srvB|$|1

[srvA]
exten => _801XXX,1,StripMSD,3
exten => _XXX,2,Goto,1
switch => IAX/serverA

[srvB]
exten => _802XXX,1,StripMSD,3
exten => _XXX,2,Goto,1
switch => IAX/serverB

Замечания: Вы не можете установить замкнутую цепочку, используя switch с serverA на serverB и с serverB на serverA! Также, обратите внимание на (новую) установку в файле iax.conf "autokill slave"
trunk=yes
notransfer=yes

[slave]
type=peer
auth=plaintext
context=outbound-nuphone
secret=secret
host=dynamic
trunk=yes
notransfer=yes

IВ файле extensions.conf (на slave):

[assigned-dids]
; Выберете механизм вызова, первый вызывает указанный екстеншен,
; второй вызывает специальный екстеншен - s.

;exten => 7046446999,1,Dial,IAX2/master@slave/$
;exten => 7046446999,1,Dial,IAX2/master@slave

В файле iax.conf (на slave):

[master]
type=user
secret=secret
context=acontext
trunk=yes
canreinvite=no

Команда register.

Когда ip адрес клиента типа user неизвестен, пользователь типа peer не знает, куда совершать вызов (например, при вызове из офиса сотрудника, который работает на дому, когда у него имеется только динамически назначаемый ip адрес или он находиться за NAT.) Для решения этой задачи, домашний работник активно регистрируется на сервере в офисе, предоставляя свои данные и местоположение в сети.

Для включения регистрации, в секции [general] файла iax.conf, добавьте директиву для регистрации:

При этом непрерывно, через некоторые интервалы, будет обновляться информация о пользователе, и сервер всегда будет знать, как вызвать пользователя, даже если его IP адрес будет меняться.

Директива "register" работает только, если вы хотите соединить свой сервер с динамическим IP адресом c сервером, который имеет статический (реальный) IP адрес, т.е. для пользователя, на котором производиться регистрация, Вы должны добавить директиву "host=dynamic" в файле iax.conf. Если оба сервера имеют известные статические IP адреса, то в этом случае нет никакой нужды в регистрации, просто используйте директиву host=hostname на обоих серверах.
--

Протокол IAX версии 2 используется в Asterisk VOIP PBX, как альтернатива протоколам SIP, H.323, и т.д. Пир работе с другими устройствами, которые поддерживают IAX протокол (на данный момент список их небольшой, но он очень быстро растет).

  • Протокол IAX - это не результат какой то группы стандартов, а, скорее всего, плод труда сообщества разработчиков.
  • Протокол IAX использует только один UDP порт 4569, что позволяет с успехом работать через системы с трансляцией адресов - NAT (устаревший протокол IAX1 использовал порт 5036). Протокол IAX использует ТОЛЬКО один udp порт, как для передачи контрольной информации, так и для передачи данных. Как уже было сказано в пункте 4 статьи IAX против SIP: при использовании протокола IAX, Вы всегда будете получать аудиоданные, если имеется возможность установить контрольное соединение.


Стоит отметить, что использование транковых каналов требует поддержки этой возможности от обеих сторон (т.е. от них требуется, правильное описание канала). Если на одной из сторон установлено: trunk=yes,а другая сторона не может подтвердить использование этой возможности, то в результате Вы получите прохождение аудиосигнала только в одну сторону. Простейший путь обеспечить правильную работу транковых каналов - это использование регистрации, для тех систем, с которыми Вы хотите установить транковое соединение.

Обратимся к автомобильным кодам регионов.
Тогда дозвон из Самары будет 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

; 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) )
exten => _916.,n,NoOp($)
exten => _916.,n,Dial(IAX2/samara:password4samara@kazan/$,60,tT)
exten => _916.,n,HangUp
.

[office_rules]
exten => _[12]XX,1,Dial(SIP/$,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

; 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) )
exten => _963.,n,NoOp($)
exten => _963.,n,Dial(IAX2/kazan:password4kazan@samara/$,60,tT)
exten => _963.,n,HangUp
.

[office_rules]
exten => _[12]XX,1,Dial(SIP/$,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

Читайте также: