Соединение двух серверов Asterisk
Обзор
Конечно, Вы также можете использовать 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".
- Сервер A - имеет статический IP адрес, сервер B - динамический IP адрес: Тогда для сервера B нужно прописать строку регистрации на сервере A в sip.conf.
- Оба сервера имеют статические IP адреса: Тут нам вообще не нужна регистрация.
- Оба сервера имеют динамические IP адреса: Тут есть одна хитрость, которую можно использовать, можно воспользоваться динамическим DNS сервисом, например, dyndns.org, для регистрации каждого сервера на другом. В любом случае, это не самое удачное решение, использовать динамические адреса для обоих серверов, т.к. при смене IP адреса, соединение может быть потеряно, до тех пор пока информация не обновиться на динамическом DNS сервере.
- Оба сервера имеют доступ друг к другу через NAT: Не используйте SIP протокол, вместо этого попробуйте использовать IAX2.
Настройка 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 для проверки (авторизации) перед тем, как позволить ему нас вызвать.[username]
type=user
auth=md5
secret=secretword
context=iax2users
type=user
auth=md5
secret=secretword
context=iax2users
Параметр "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=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 - это, конечно, и то и другое.
Использование типа "type=friend" делает жизнь проще, но не долго. Если вы добавите одновременно: "type=friend" и "host=hostname@domain.ext", то этим вы ограничите одним хостом, число тех серверов, с которых эта учетная запись может принять вызов на обработку, что, возможно, совсем не то, что Вам нужно.
Для инструкций по поводу использования директивы "auth=rsa", см: Asterisk IAX RSA авторизация.
Теперь, когда мы завершили шаги 1 и 2, осталось только настроить план набора. Прочитайте нижеприведенные примера, для того, чтобы понять, как это лучше сделать.
Соединение планов набора.
Пример 1
extensions.conf:exten => _7XXX,1,Dial(IAX2/myserver:passwordA@IAXserverA/${EXTEN:1},30,r)
exten => _7XXX,2,Dial(SIP/myserver:passwordA@SIPserverA/${EXTEN:1},30,r)
exten => _7XXX,3,Congestion
exten => _8XXX,1,Dial(IAX2/myserver:passwordB@IAXserverB/${EXTEN:1},30,r)
exten => _8XXX,2,Dial(SIP/myserver:passwordB@SIPserverB/${EXTEN:1},30,r)
exten => _8XXX,3,Congestion
Конечно, нам нужно вместо записей типа [IAXserverA] и т.д., указать те, что мы прописали в файлах iax.conf и sip.conf, чтобы все работало как нужно. В этом примере, SIP используется как резервный канал, в случае проблем соединения по IAX протоколу.
Обратите внимание, что в этом примере имя пользователя и пароль попадает в CDR записи (Вам возможно захочется использовать второй пример или использовать ключевые выражения вместо комбинаций имя пользователя/пароль)!
Пример 2
В этом примере в CDR записях не показывается поле username и secret.(сервер A)
iax.conf
[general]
register => <username>:<password>@<имя или IP адрес сервера B>
[serverB]
type=friend
user=<username>
secret=<password>
host=<имя или IP адрес сервера B>
extensions.conf
exten => _7XXX,1,Dial(IAX2/serverB/${EXTEN:1},30,r)
exten => _7XXX,2,Congestion
(сервер
iax.conf
[serverA]
type=friend
user=<username>
secret=<password>
host=<dynamic> | <имя или IP адрес сервера A>
extensions.conf
exten => _8XXX,1,Dial(IAX2/serverA/${EXTEN:1},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|${EXTEN}|1
exten => _802XXX,1,Goto,srvB|${EXTEN}|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=", которая предотвращает длительное зависание, если удаленный сервер не работает или отсоединился.
Пример 4
В файле extensions.conf (на master):[outbound]
switch => IAX2/master:secret@iax-gw1.company.net/outbound
В файле iax.conf (на master):
[slave]
type=user
auth=plaintext
context=outbound
context=outbound2 ; (по вашему желанию, их может быть несколько)
secret=secret
host=dynamic
callerid="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}
;exten => 7046446999,1,Dial,IAX2/master@slave
В файле iax.conf (на slave):
register => slave:secret@iax-gw1.company.net
[master]
type=peer
host=iax-gw1.company.net
secret=secret
context=outbound
trunk=yes
canreinvite=no
[master]
type=user
secret=secret
context=acontext
trunk=yes
canreinvite=no
Команда register.
Когда ip адрес клиента типа user неизвестен, пользователь типа peer не знает, куда совершать вызов (например, при вызове из офиса сотрудника, который работает на дому, когда у него имеется только динамически назначаемый ip адрес или он находиться за NAT.) Для решения этой задачи, домашний работник активно регистрируется на сервере в офисе, предоставляя свои данные и местоположение в сети.
Для включения регистрации, в секции [general] файла iax.conf, добавьте директиву для регистрации:
register => user:password@hostname.domain.ext
При этом непрерывно, через некоторые интервалы, будет обновляться информация о пользователе, и сервер всегда будет знать, как вызвать пользователя, даже если его IP адрес будет меняться.
Директива "register" работает только, если вы хотите соединить свой сервер с динамическим IP адресом c сервером, который имеет статический (реальный) IP адрес, т.е. для пользователя, на котором производиться регистрация, Вы должны добавить директиву "host=dynamic" в файле iax.conf. Если оба сервера имеют известные статические IP адреса, то в этом случае нет никакой нужды в регистрации, просто используйте директиву host=hostname на обоих серверах.
--
Asterisk