Текст книги "Asterisk™: будущее телефонии Второе издание"
Автор книги: Джим Меггелен
Соавторы: Джаред Смит,Лейф Мадсен
Жанр:
ОС и Сети
сообщить о нарушении
Текущая страница: 12 (всего у книги 41 страниц)
Подключение к поставщику сервисов SIP
С появлением интернет-телефонии по всему миру возникло множество телефонных компаний, использующих интернет-технологии! Поэтому выбор у нас огромен. Многие из этих поставщиков сервисов обеспечивают возможность подключения частной Asterisk-системы к их сетям[66]66
Обязательно проверяйте политику провайдера, к которому вы планируете подключиться, поскольку некоторые из них могут запрещать использование офисной АТС с их сервисом. Обязательно проверяйте политику провайдера, к которому вы планируете подключиться, поскольку некоторые из них могут запрещать использование офисной АТС с их сервисом.
[Закрыть], а некоторые даже используют Asterisk сами!
Следующая конфигурация должна обеспечить подключение к поставщику сервисов интернет-телефонии (Internet Telephony Service Provider, ITSP)[67]67
Также их называют провайдерами VoIP (VoIP Service Provider, VSP).VoIP (VoIP Service Provider, VSP).
[Закрыть], хотя невозможно предугадать, какую конфигурацию потребует конкретный поставщик. В идеале поставщик сам предоставит вам настройки, которые необходимы для подключения вашей системы. Однако не все поддерживают Asterisk, поэтому мы собираемся предложить универсальную конфигурацию, на выполнение которой уйдет лишь несколько минут и которая должна помочь вам:
[мой_поставщик_услуг]
type=peer
host=10.251.55.100
fromuser=мой_уникальный_id
secret=мой_секретный пароль
context=incoming_calls
dtmfmode=rfc2833
disallow=all
allow=gsm
allow=ulaw
Конфигурация локального межсетевого экрана
Если межсетевой экран ip-таблиц используется на одном компьютере с сервером Asterisk, выполнив следующие команды, можно открыть порт 5060 для обмена сигналами по протоколу SIP и порты от 10000 до 20000 для RTP-трафика. Также диапазон RTP-портов можно сузить в файле rtp.conf, находящемся в папке /etc/asterisk. Замечательная книга по организации межсетевых экранов с помощью ip-таблиц – «Linux Firewalls» (издательство Novell Press) Стива Суэринга (Steve Suehring) и Роберта Циглера (Robert Ziegler).
# iptables -I RH-Firewall-1-INPUT -p udp –dport 5060 -j ACCEPT
# iptables -I RH-Firewall-1-INPUT -p udp –dport 10000:20000 -j ACCEPT
# service iptables save
Помните, что это откроет порты 5060 и от 10000 до 20000 для всего UDP-трафика из любого источника.
deny=0.0.0.0/0
permit=10.251.55.100/32
insecure=invite
Большинство приведенных настроек должны быть вам знакомы, но если нет, далее дается их краткое описание.
Задавая тип peer, мы указываем Asterisk, что при получении сообщения INVITE (Приглашение) (когда поставщик присылает вызов) нужно сравнивать не имя [мой поставщик сервисов], а IP-адрес, указанный в этом сообщении. Параметр host – это IP-адрес, на который мы будем направлять наши вызовы, и этот IP-адрес будет сопоставляться при получении вызова от поставщика.
Параметр fromuser (от пользователя) влияет на то, как структурировано наше сообщение INVITE при отправке вызова поставщику сервисов.
Сопоставление имени пользователя, а не IP-адреса
Некоторые поставщики услуг для отправки своих вызовов могут использовать вместо протокола Session Initiation Protocol множество IP-адресов, требуя от вас создания отдельной учетной записи типа peer для каждого IP-адреса. Если известны не все IP-адреса, вероятно, придется сравнивать имена пользователей. В этом случае потребуется лишь немного изменить формат описания поставщика сервисов. Самое большое изменение, на которое следует обратить внимание, – то, что вам понадобится задать [заголовок_поставщика_услуг] как имя пользователя, которому ваш поставщик сервисов собирается направлять вызовы. Также мы изменили тип peer (равноправный) на friend (дружественный), что с точки зрения Asterisk создает типы и user (пользователь), и peer, где тип user будет сравниваться раньше peer: [мой_уникальный_id] type=friend host=10.251.55.100 fromuser=мой_уникальный_id secreЛ=мой_секретный пароль context=incoming_calls dtmfmode=rfc2833 disallow=all allow=gsm allow=ulaw insecure=invite
Обратите внимание, что удалены параметры deny (отклонить) и permit (разрешить), поскольку IP-адреса, с которых будут поступать вызовы, могут быть неизвестны. Если вдруг эти адреса известны и вы по-прежнему хотите сравнивать их, параметры deny и permit для IP-адресов можно восстановить.
Если имя пользователя задано в параметре fromuser, при отправке вызова поставщику меняются поля From: (От:) и Contact: (Контакт:) сообщения INVITE. Этого может требовать сам поставщик, если он использует эти поля в процедуре аутентификации. То, где Asterisk меняет заголовок, можно увидеть в следующих двух фрагментах кода.
Без параметра fromuser:
Audio is at 66.135.99.122 port 18154
Adding codec 0x2 (gsm) to SDP
Adding codec 0x4 (ulaw) to SDP
Adding non-codec 0x1 (telephone-event) to SDP
Reliably Transmitting (no NAT) to 10.251.55.100:5060:
INVITE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 66.135.99.122:5060;branch=z9hG4bK32469d35;rport
From: "asterisk"
To:
Contact:
Call-ID: [email protected]
CSeq: 102 INVITE
User-Agent: Asterisk PBX
Max-Forwards: 70
Date: Fri, 20 Apr 2007 14:59:24 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY Supported: replaces Content-Type: application/sdp Content-Length: 265
С параметром fromuser:
Audio is at 66.135.99.122 port 11700
Adding codec 0x2 (gsm) to SDP
Adding codec 0x4 (ulaw) to SDP
Adding non-codec 0x1 (telephone-event) to SDP
Reliably Transmitting (no NAT) to 10.251.55.100:5060:
INVITE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 66.135.99.122:5060;branch=z9hG4bK635b0b1b;rport
From: "asterisk"
To:
Contact:
Call-ID: [email protected]
CSeq: 102 INVITE
User-Agent: Asterisk PBX
Max-Forwards: 70
Date: Fri, 20 Apr 2007 15:00:30 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY Supported: replaces Content-Type: application/sdp Content-Length: 265
Параметры deny и permit используются для отклонения всех входящих вызовов к этому участнику сети от всех IP-адресов, кроме заданного параметром permit. Это просто мера безопасности, которая обеспечивает поступление к данному участнику сети трафика только с ожидаемого IP-адреса.
В конце видим выражение insecure=invite, которое может быть необходимо для вашего поставщика, потому что источник сообщения INVITE может находиться на платформе сервера, но передаваться через его прокси-сервер SIP. По сути, это означает, что в строке Contact (Контакт) (поле сообщения INVITE, которое вы проверяете при приеме вызова от своего поставщика) может быть совсем не тот IP-адрес, по которому находится участник сети. Это выражение указывает Asterisk игнорировать данное несоответствие и принимать приглашение в любом случае.
Возможно, понадобится задать и invite=invite,port, если адрес порта также не соответствует тому, что ожидает Asterisk.
Теперь в разделе [general] файла sip.conf требуется задать один дополнительный параметр: register. register (реестр) укажет поставщику сервисов, куда направлять адресованные нам вызовы. Так Asterisk говорит поставщику сервисов: «Эй! Если ты получил вызов ко мне, пошли его на IP-адрес 10.251.55.100». Параметр register имеет следующий вид:
register => имяпользователя:секрет@мой.поставщик_сервисов.Ш Теперь осталось только сконфигурировать простой диалплан для обработки входящих вызовов и отправки вызовов через поставщика сервисов. Мы собираемся внести коррективы в диалплан, который начали создавать в разделе «Настройка диалплана для выполнения тестовых вызовов» данной главы. Строки, выделенные курсивом, – это новые части, добавленные в диалплан. Все остальное взято без изменений из предыдущего раздела[68]68
Также предполагается, что сконфигурирован по крайней мере один добавочный номер SIP из предыдущего раздела.
[Закрыть].
[globals] [general] [default]
exten => s,1,Verbose(1|Unrouted call handler)
exten => s,n,Answer()
exten => s,n,Wait(1)
exten => s,n,Playback(tt-weasels)
exten => s,n,Hangup()
[incoming_calls]
exten => _X.,1.NoOp()
exten => _X.,n,Dial(SIP/1000)
[outgoing_calls] exten => _X.,1,NoOp()
exten => X.,n,Dial(SIP/мой поставщик сервисов/${EXTEN})
[internal]
exten => 1000,1,Verbose(1|Extension 1000)
exten => 1000,n,Dial(SIP/1000,30)
exten => 1000,n,Hangup()
exten => 500,1,Verbose(1|Echo test application)
exten => 500,n,Echo()
exten => 500,n,Hangup()
[phones]
include => internal include => outgoing_calls
Соединение двух серверов Asterisk по протоколу SIP
Может настать время, когда у вас появится два сервера Asterisk и вам захочется передавать вызовы между ними. К счастью, здесь нет особых сложностей, хотя имеются некоторые странности, с которыми придется справляться, но с точки зрения конфигурации на самом деле это совсем не так уж трудно.
Конфигурация локального межсетевого экрана
Если ip-таблицы используются на одном компьютере с сервером Asterisk, с помощью следующих команд можно открыть порт 5060 для обмена сигналами по протоколу SIP и порты от 10000 до 20000 для RTP-трафика. Также диапазон RTP-портов можно сузить в файле rtp.conf, находящемся в папке /etc/asterisk. Замечательная книга по межсетевым экранам для ip-таблиц – «Linux Firewalls» (издательство Novell Press) Стива Суэринга (Steve Suehring) и Роберта Циглера (Robert Ziegler).
# iptables -I RH-Firewall-1-INPUT -p udp –dport 5060 -j ACCEPT
# iptables -I RH-Firewall-1-INPUT -p udp –dport 10000:20000 -j ACCEPT
# service iptables save
Помните, что это откроет порты 5060 и от 10000 до 20000 для всего UDP-трафика из любого источника.
Наша топология будет состоять из SIP-телефона (Элис (Alice)), зарегистрированного в Asterisk A (Торонто (Toronto)), и SIP-телефона (Боб (Bob)), зарегистрированного в Asterisk B (Осака (Osaka)). К концу данного раздела вы сможете с помощью пары серверов Asterisk производить звонки от Элис к Бобу (и наоборот) – рис. 4.5. Это типовой сценарий, когда имеется два физических местоположения, например ком-
Рис. 4.5. Топология объединения каналов SIP
пания с несколькими офисами, и требуется обеспечить единую логическую топологию расширения.
Прежде всего давайте сконфигурируем серверы Asterisk.
Конфигурация серверов Asterisk
У нас есть пара серверов Asterisk, назовем их Торонто и Осака, и мы собираемся зарегистрировать их друг на друге. В этом сценарии будем использовать самый элементарный файл sip.conf. Как и в случае с рассматриваемой ранее в данной главе конфигурацией SIP-телефона, это не лучший способ, но он работает.
Вот конфигурация сервера Торонто:
[general]
register => toronto:[email protected]/osaka
[osaka]
type=friend
secret=welcome
context=osaka_incoming
host=dynamic
disallow=all
allow=ulaw
И конфигурация сервера Осака:
[general]
register => osaka:[email protected]/toronto
[toronto]
type=friend
secret=welcome
context=toronto_incoming
host=dynamic
disallow=all
allow=ulaw
Многие из приведенных опций могут быть вам знакомы, но давайте на всякий случай остановимся на них подробнее.
Вторая строка файла указывает серверу Asterisk зарегистрироваться на другом сервере. Таким образом мы сообщаем удаленному серверу
Asterisk, куда направлять вызовы, когда он пожелает обратиться к нашему локальному серверу Asterisk. Помните, мы предупреждали о небольших странностях в конфигурации? Видите в конце строки регистрации слэш и имя удаленного сервера Asterisk? Так удаленный сервер Asterisk получает информацию о том, какое краткое имя использовать при вызове. Если не добавить этого, при попытке дальнего конца сделать вызов в окне командной строки Asterisk появится следующее сообщение:
[Apr 22 18:52:32] WARNING[23631]: chan_sip.c:8117 check_auth: username
mismatch, have
Таким образом, добавляя слэш и имя, мы сообщаем противоположному концу, что должно быть указано в качестве краткого имени пользователя в поле Proxy Authorization (Авторизация прокси) SIP-сообщения INVITE.
Весь остальной файл занимает блок авторизации, используемый для управления входящими и исходящими вызовами другого сервера Asterisk. Сервер Торонто использует блок авторизации [osaka], и сервер Осака использует блок [toronto]. Определен тип friend, что позволяет принимать и направлять вызовы к другому серверу Asterisk. Параметр secret (секрет) – это пароль, который должна использовать другая система при аутентификации. Параметр context (контекст) указывает, в какой части диалплана (extensions.conf) обрабатываются входящие вызовы. Для параметра host задано значение dynamic (динамический), это указывает серверу Asterisk на то, что противоположный конец сообщит свой IP-адрес, на который следует направлять адресованные ему звонки, при регистрации. Наконец, с помощью параметров disallow (запретить) и allow (разрешить) можно определять, какие кодеки будут использоваться при общении с противоположным концом. После сохранения файла и перезагрузки SIP-канала на обоих серверах Asterisk (выполнение команды sip reload из консоли Asterisk) в окне командной строки должно быть выведено примерно следующее сообщение, что свидетельствует об успешной регистрации удаленного сервера:
*CLI> – Saved useragent "Asterisk PBX" for peer toronto (Для равноправного участника сети торонто сохранен агент пользователя "офисная АТС Asterisk") После выполнения команды sip show peers статус хоста Unspecified (Не определен) должен быть замен IP-адресом удаленного сервера: *CLI> sip show peers
Name/username Host Dyn Nat ACL Port Status
toronto/osaka 192.168.2.202 D 5060 Unmonitored
Убедиться в успешности собственной регистрации можно, выполнив команду sip show registry из консоли Asterisk: *CLI> sip show registry
Host Username Refresh State Reg.Time
192.168.1.101:5060 osaka 105 Registered Sun, 22 Apr 2007 19:13:20
Теперь, когда оба сервера Asterisk довольны друг другом, займемся конфигурацией пары SIP-телефонов, чтобы иметь возможность позвонить.
Конфигурация SIP-телефона
Подробнее о конфигурации SIP-телефонов в Asterisk рассказывается в разделе «Конфигурация канала FXS для аналогового телефона» данной главы. Ниже представлена конфигурация SIP-телефона в файле sip.conf для каждого из двух серверов, которые будут использоваться в диалплане в следующем разделе, предоставляющая нам две конечные точки для установления соединения. Эти строки должны быть добавлены в конце файла sip.conf для каждого соответствующего сервера.
Файл sip.conf для сервера Торонто:
[1000] type=friend host=dynamic context=phones
Файл sip.conf для сервера Осака:
[1001] type=friend host=dynamic context=phones
Теперь для сервера Торонто должен быть зарегистрирован добавочный номер 1000, а для сервера Осака – 1001. Убедиться в этом можно с помощью команды sip show peers. Далее мы собираемся сконфигурировать логику диплплана, что позволит производить звонки с одного добавочного номера на другой.
Конфигурация диалплана
Теперь можно сконфигурировать простой диалплан для каждого сервера, который позволит выполнять звонки между зарегистрированными телефонами: один для Торонто, а другой – для Осаки. В разделе «Работа с конфигурационными файлами интерфейсов» данной главы мы создали простой файл extensions.conf. Теперь давайте на базе этой конфигурации создадим диалплан. Диалпланы обоих серверов будут очень похожи, но для ясности здесь приведены оба. Новые строки, добавленные в существовавший до этого файл, выделены курсивом:
Файл extensions.conf для Торонто:
[globals]
[general]
autofallthrough=yes
[default]
[incoming_calls]
[phones]
include => internal include => remote
[internal]
exten => _2XXX,1,NoOp()
exten => _2XXX,n,Dial(SIP/${EXTEN},30)
exten => _2XXX,n,Playback(the-party-you-are-calling&is-curntly-unavail) exten => _2XXX,n,Hangup()
[remote]
exten => _1XXX,1,NoOp()
exten => _1XXX,n,Dial(SIP/osaka/${EXTEN})
exten => _1XXX,n,Hangup()
[osaka_incoming] include => internal
Файл extensions.conf для Осаки:
[globals]
[general]
autofallthrough=yes [default] [incoming_calls] [phones]
include => internal include => remote
[internal]
exten => _1XXX,1,NoOp()
exten => _1XXX,n,Dial(SIP/${EXTEN},30)
exten => _1XXX,n,Playback(the-party-you-are-calling&is-curntly-unavail) exten => _1XXX,n,Hangup()
[remote]
exten => _2XXX,1,NoOp()
exten => _2XXX,n,Dial(SIP/toronto/${EXTEN})
exten => _2XXX,n,Hangup()
[toronto_incoming] include => internal
После того как файл extensions.conf сконфигурирован, можно выполнить его перезагрузку из консоли Asterisk с помощью команды dialplan reload. Удостовериться в том, что диалплан загружен, поможет команда dialplan show.
Вот и все! Теперь можно звонить с одного сервера Asterisk на другой.
Конфигурация программного телефона IAX
Протокол IAX2 создан для обеспечения удобства работы с сетями, имеющими необычную конфигурацию, особенно с использованием технологии NAT (Network Address Translation – трансляция сетевых адресов). Это является его основным преимуществом и делает IAX2 превосходным протоколом для программных телефонов, выступающих в роли клиентов, поскольку они часто используются на портативных компьютерах, которые подключаются к различным сетям, зачастую без возможности управления самой сетью (например, при подключении к сети в разных гостиницах).
Протокол Inter-Asterisk eXchange (IAX) обычно используется для связи сервер-сервер; по сравнению с SIP его поддерживает большее число аппаратных телефонов. Есть и программные телефоны, поддерживающие протокол IAX, и работа по обеспечению поддержки аппаратных телефонов во встроенном ПО продолжается по нескольким направлениям. Основное различие между протоколами IAX и SIP – способ передачи медиа-данных между конечными точками.
При использовании протокола SIP для передачи трафика RTP (голоса) используются порты, отличные от тех, что работают с методами обмена сигналами. Например, Asterisk получает сигналы SIP через порт 5060, а трафик RTP (голос) проходит через порты от 10000 до 20000 по умолчанию. IAX-протокол отличается тем, что и обмен сигналами, и трафик медиа-данных выполняется через один порт: 4569. Следствие такого подхода – протокол IAX лучше подходит для топологий с использованием NAT.
Существует множество программных телефонов на базе IAX, но не так много аппаратных. Наиболее очевидная причина этому – IAX2 до сих пор не стандартизован IETF (Internet Engineering Task Force – Комитет по стандартизации интернет-протоколов), хотя многие уже перешли на него и пользуются предоставляемыми им преимуществами.
Превосходный программный телефон на базе IAX2 – idefisk. Он доступен бесплатно для скачивания по адресу http://www.asteriskguru.com На сайте Asterisk Guru можно также найти большое количество превосходной документации! Пожалуйста, обратите внимание, что пробел не входит в список допустимых символов. Не используйте пробелы в именах контекстов, потому что результат вам не понравится!. Авторы данной книги добились замечательных результатов с этим программным телефоном, и, поскольку он выполняется в Microsoft Windows, Mac OS X и Linux, он является отличным примером для применения межплатформенных программных телефонов. Здесь будет продемонстрирована версия 1.31, хотя в апреле 2007 была выпущена версия 2.0, но пока не вышла ее реализация для Linux.
Настройка конфигурационного файла канала (iax.conf)
Как всегда, постараемся наладить все быстро с минимальной настройкой конфигурационного файла, чтобы максимально сократить проблемы, которые могут возникнуть при конфигурации устройств. Как это было с файлом sip.conf, для регистрации IAX-телефона в Asterisk, в файл iax.conf необходимо добавить лишь несколько простых строк. Давайте посмотрим:
[general] autokill=yes
[idefisk] type=friend host=dynamic context=phones
Да, действительно, это все, что необходимо для настройки программного телефона. Это не самая безопасная или функциональная конфигурация (даже не использует ся пароль), но она будет работать. В разделе [general] файла iax.conf имеется единственная опция – autokill=yes. Она используется для того, чтобы предотвратить задержку в системе, когда участник сети не отвечает (ACK) на пакет NEW (запрос на установление нового соединения) в течение 2000 мс. Вместо значения yes здесь можно задать время (в миллисекундах) ожидания ACK на пакет NEW. Управлять опцией autokill (автоуничтожение) для каждого отдельного равноправного участника сети можно, определяя параметр qualify (качество) для тех участников, о возможном недостаточном качестве используемых сетевых соединений которых известно заранее.
Весь остальной файл – описание программного телефона. Мы определяем для него тип friend, указывая Asterisk на то, что будем производить звонки на это устройство, а также принимать звонки с него. friend является сокращенной записью для одновременного определения peer (отправляющего вызовы программному телефону) и user (принимающего вызовы от программного телефона). Можно было бы дать отдельные описания для peer и user:
[idefisk] type=user context=phones
[idefisk] type=peer host=dynamic
Сконфигурировав файл iax.conf, сохраняем его и перезагружаем модуль канала IAX2 из консоли Asterisk с помощью команды module reload chan_iax2.so. Подтверждаем существование нового равноправного участника сети, выполнив команду iax2 show peers.
localhost*CLI> iax2 show peers
Name/Username Host Mask Port Status
idefisk (Unspecified) (D) 255.255.255.255 0 Unmonitored
1 iax2 peers [0 online, 0 offline, 1 unmonitored]
Конфигурация программного телефона
Рис. 4.7. Окно Account Options (Опции учетной записи) программного телефона idefisk
После установки программного телефона idefisk откройте клиентское приложение. На экран будет выведено окно, представленное на рис. 4.6.
Рис. 4.6. Программный телефон idefisk
После запуска программного телефона, чтобы можно было выполнять с него звонки, его необходимо настроить. Также, чтобы можно было принимать звонки, этот телефон должен быть зарегистрирован в Asterisk. Для этого щелкните правой кнопкой мыши по иконке в верхнем левом углу экрана. Откроется меню. Выберите в нем пункт Account Options (Опции учетной записи), что обеспечит открытие окна, показанного на рис. 4.7.
Начните с создания новой учетной записи для программного телефона, щелкнув по кнопке New (Новая) и введя соответствующую информацию. В поле Host (Хост) должен быть указан IP-адрес или доменное имя вашей системы Asterisk, при этом имя пользователя должно совпадать с именем, указанным в квадратных скобках [] в файле iax.conf. Поле Password (Пароль) оставляем незаполненным, потому что мы не задавали параметр secret в файле iax.conf, а в полях Caller ID (ID звонящего) и Number (Номер) можно задать любые значения. Чтобы idefisk зарегистрировал эту учетную запись при запуске, поставьте флажок Register on startup (Зарегистрировать при запуске). Введя все необходимые данные, щелкните по кнопке OK, чтобы сохранить новую учетную запись.
Если был установлен флажок Register on startup (Зарегистрировать при запуске), телефон попытается зарегистрироваться в Asterisk. В консоли Asterisk будет выведена информация о том, что телефон зарегистрирован:
– Registered IAX2 'idefisk' (UNAUTHENTICATED) at 127.0.0.1:32771 Проверить регистрацию можно из консоли Asterisk с помощью команды iax2 show peers:
localhost*CLI> iax2 show peers
Name/Username Host Mask Port Status
idefisk 127.0.0.1 (D) 255.255.255.255 32771 Unmonitored
1 iax2 peers [0 online, 0 offline, 1 unmonitored]
Конфигурация диалплана для тестирования
Осталось только подтвердить возможность выполнения вызовов с помощью нашего телефона, задав простой диалплан в файле extensions. conf. Можно просто проверить наличие аудиосигнала в обоих направлениях, позвонив на добавочный номер 500, или настроить диалплан, созданный в разделе «Настройка диалплана для выполнения тестовых вызовов» данной главы, чтобы выполнить ряд тестовых вызовов. Если добавочный номер 1000 задан для SIP-телефона, что мы делали в предыдущих разделах, обеспечим, чтобы данная конфигурация не перекрывала его, и используем добавочный номер 1001 (если вы сконфигурировали несколько добавочных номеров для SIP, просто задайте здесь для программного телефона IAX2 уникальный добавочный номер): [globals]
[general]
[default]
exten => s,1,Verbose(1|Unrouted call handler)
exten => s,n,Answer()
exten => s,n,Wait(1)
exten => s,n,Playback(tt-weasels)
exten => s,n,Hangup()
[incoming_calls]
[internal]
exten => 500,1,Verbose(1|Echo test application)
exten => 500,n,Echo()
exten => 500,n,Hangup()
exten => 1001,1,Verbose(1Extension 1000)
exten => 1001,n,Dial(IAX2/idefisk,30)
exten => 1001,n,Hangup()
[phones]
include => phones
Подключение к поставщику сервисов IAX
Некоторые поставщики сервисов интернет-телефонии (ITSP) предоставляют возможность начинать и завершать соединения с помощью протокола IAX2. Кроме сведения до минимума количества портов, которые необходимо открыть в межсетевом экране (для IAX2 требуется лишь один порт, через который ведется и обмен сигналами, и передача медиа-данных), способность объединения каналов этого протокола привлекательна как для поставщиков сервисов, так и для их клиентов из– за сохранения полосы пропускания, которое возможно при выполнении множества одновременных соединений между конечными точками. Если ITSP предлагает завершение соединения с использованием IAX2, очень высока вероятность, что он использует Asterisk; таким образом, конфигурация для подключения к этому поставщику сервисов, скорее всего, будет аналогична той, которую мы приводим здесь. Следующая конфигурация – это шаблон для подключения к поставщику сервисов IAX2:
[general] autokill=yes
register => имяпользователя:пароль@мой.провайдер-сервиса.Ш
[мой_уникальный^]
type=user
secret=мой_уникальный_пароль
context=incoming_calls
trunking=yes
disallow=all
allow=gsm
allow=ulaw
deny=0.0.0.0/0.0.0.0 permit=10.251.100.1/255.255.255.255
[мой_уникальный^]
type=peer
host=10.251.100.1
trunking=yes disallow=all allow=gsm allow=ulaw
Чтобы принимать входящие вызовы по прямому номеру (номеру прямого набора внутренних абонентов – Direct Inward Dialing, DID), присвоенному вам поставщиком сервисов, необходимо откорректировать файл extensions.conf. Возможно, вы хотите направлять звонки на автоответчик или просто на телефон у себя на столе. В любом случае звонки от поставщика услуг можно принимать и сопоставлять с входящим DID с помощью следующей реализованной в диалплане логики: [globals]
[general]
autofallthrough=yes
[default]
[incoming_calls]
exten => 14165551212,1,NoOp()
exten => 14165551212,n,Dial(SIP/1000,30)
exten => 14165551212, n, Playback(the-party-you-are-calling&is-curntly-unavail) exten => 14165551212,n,Hangup()
exten => 4165551212,1,Goto(1${EXTEN})
[internal]
[phones]
include => internal
Соединение двух серверов Asterisk по протоколу IAX
Часто желательно объединить два физических сервера Asterisk по протоколу IAX, чтобы иметь возможность обмениваться вызовами между двумя физическими местоположениями (расстояние между этими точками можем быть ничтожно мало, а может измеряться и километрами). Одно из преимуществ использования протокола IAX для этого – его способность, называемая объединением каналов, в которой используется метод отправки голосовых данных множества звонков под одним заголовком. Для одного или двух одновременных вызовов эффект от этой возможности невелик, но если между двумя точками выполняются десятки или сотни звонков, выигрыш в пропускной способности за счет использования объединения каналов может быть огромным.
Конфигурация локального межсетевого экрана
Если ip-таблицы используются на одном компьютере с сервером Asterisk, можно выполнить следующие команды для открытия порта 4569 для протокола IAX2. Замечательная книга по организации межсетевых экранов с помощью ip-таблиц – «Linux Firewalls» (Novell Press) Стива Суэринга (Steve Suehring) и Роберта Циглера (Robert Ziegler).
# iptables -I RH-Firewall-1-INPUT -p udp –dport 4569 -j ACCEPT
# service iptables save
Помните, что это откроет порт 4569 для всего UDP-трафика из любого источника.
Системе понадобится интерфейс синхронизации – или аппаратный, производства Digium, или программный, использующий ядро драйвера ztdummy. Для этого в системе должен быть установлен и запущен драйвер Zaptel. Подробно об установке Zaptel рассказывается в главе 3.
Конфигурация серверов Asterisk
Мы будем использовать простую схему из двух серверов Asterisk, зарегистрированных непосредственно друг на друге, и отдельных телефонов, зарегистрированных на каждом из серверов Asterisk. Будем называть серверы Asterisk Торонто и Осака (см. раздел «Соединение двух серверов Asterisk по протоколу SIP»). Телефон Боба будет зарегистрирован и подключен к Торонто, а телефон Элис – к серверу Осака.
Прежде всего создадим новый файл канала (iax.conf). Для этого переименуем текущий файл шаблона в iax.conf.sample и создадим новый пустой файл iax.conf:
# cd /etc/asterisk
# mv iax.conf iax.conf.sample
# touch iax.conf
Далее откроем файл iax.conf и введем следующие настройки для сервера Asterisk Торонто:
[general] autokill=yes
register => toronto:[email protected]
[osaka]
type=friend
host=dynamic
trunk=yes
secret=welcome
context=incoming_osaka
deny=0.0.0.0/0.0.0.0
permit=192.168.1.107/255.255.255.255
Пояснения к параметру autokill=yes приведены в предыдущем разделе, а его назначение – гарантировать, что новые соединения, устанавливаемые с удаленной системой и не получившие подтверждения приема в течение заданного времени (по умолчанию – две секунды), корректно завершаются. Это спасает от возникновения множества подвешенных каналов, просто ожидающих подтверждения приема, которое, возможно, никогда не будет получено.
Строка register используется для указания удаленному серверу Asterisk нашего местоположения, чтобы, когда сервер по адресу 192.168.1.107 будет готов послать нам вызов, он отправлял его на наш IP-адрес (в данном случае наш IP-адрес – 192.168.1.104, его мы увидим в конфигурационном файле iax.conf сервера Осака). Имя пользователя Toronto и пароль welcome посылаются на сервер Осака, который проверяет нашу регистрацию. Если аутентификация пройдена успешно, он записывает в память местоположение нашего сервера Asterisk и будет использовать эту информацию при отправке нам вызовов.
Описание [Osaka] используется для управления аутентификацией удаленного сервера и доставки на него нашего диалплана. Osaka – это имя пользователя, используемое для аутентификации при поступлении вызовов. Для параметра type задано значение friend, потому что мы хотим иметь возможность отправлять вызовы на сервер Осака и принимать от него вызовы. Для параметра host задано значение dynamic, что указывает Asterisk направлять вызовы на IP-адрес, полученный при регистрации противоположной конечной точки.