unix 2012-03-21 22-43-45
Использование asterisk в качестве домашней АТС
MooSE 2011-09-04 05:30:13
Обычно Asterisk позиционируется как решение для IP-PBX. То есть для обслуживания нужд офисов с достаточно хитрой системой обработки входящих звонков и сложной внтуренней номерацией, однако в ряде случаев asterisk окажется удобен для использования и в домашних условиях. Пример такого использования будет показан далее.
Никого уже не удивишь тем, что домашний телефон заходит в квартиру не "лапшой", а по тому же кабелю что и интернет в цифровом виде. Чаще всего используя протокол SIP. Разные SIP-провайдеры предлагаю разные условия и разные тарифы на разные направления, так что наиболее выгодным будет использование одновременно нескольких SIP-провайдеров, "разруливая" исходящие звонки между каналами с учётом их стоимости.
Для примера возьмём казанского SIP-оператора «Мэлт» и федерального оператора «Мегафон» с его услугой «Мультифон», которая технически представляет собой тот же SIP.
Итак, у нас есть номер от «Мэлта» "2009111" с паролем "pass1" и номер от «Мегафона» "+79271111111" с подключенной услугой «Мультифон» и паролем от ней "pass2". Задача: поднять на домашнем сервере asterisk, завести на нём SIP-аккаунт для домашнего телефона, "зацепить" внешние транки и настроить следующее:
Все входящие звонки для обоих транков попадают на домашний телефон;
Исходящие звонки внутри города идут через «Мэлт»;
Исходящие звонки на мобильные номера и межгород идут через «Мегафон«
На сервере у нас установлена Ubuntu Server 11.04. Установим asterisk:
apt-get install asterisk
Для начала создадим SIP-аккаунт для домашнего телефона. Логин будет "200" и пароль "p4ssw0rd". Для этого приведём файл "/etc/asterisk/users.conf" к виду:
[general]
fullname = New User
userbase = 6000
hasvoicemail = yes
vmsecret = 1234
hassip = yes
hasiax = yes
hasmanager = no
callwaiting = yes
threewaycalling = yes
callwaitingcallerid = yes
transfer = yes
canpark = yes
cancallforward = yes
callreturn = yes
callgroup = 1
pickupgroup = 1
[200]
secret = p4ssw0rd
nat = yes
host = dynamic
username = home
fullname = Home Phone
vmsecret = p4ssw0rd
hassip = yes
hasiax = no
hash323 = no
hasmanager = no
callwaiting = no
context = international
host = dynamic
context=sip-dialout
hasvoicemail = yes
Теперь настроим внешние транки. Для этого в файл "/etc/asterisk/sip.conf" добавим строки:
register => 2009111:pass1@voice.melt.ru/2009111
register => 79271111111@multifon.ru:pass2:79271111111@sbc.megafon.ru:5060/79271111111
[melt]
type=friend
secret=pass1
username=2009111
host=voice.melt.ru
dtmfmode=rfc2833
canreinvite=no
disallow=all
allow=ulaw
allow=alaw
allow=gsm
insecure=port,invite
fromdomain=voice.melt.ru
context=incoming
[multifon]
type=peer
username=79271111111
secret=pass2
host=sbc.megafon.ru
dtmfmode=inband
canreinvite=no
allow=all
insecure=port,invite
fromdomain=multifon.ru
fromuser=79271111111
context=incoming-multifon
;transport=tcp
nat=yes
port=5060
Теперь в настройках планов дозвона ("dialplans") настроим соответствующие контексты. Эти настройки выполняются в файле "/etc/asterisk/extensions.conf". Для этого допишем следующие строки:
;===============================================================================
; Этот контекст описывает исходящие звонки
[sip-dialout]
; Звонки на семизначные номера, начинающиеся на 2 или 5
exten => _[25]XXXXXX,1,Log(NOTICE, Dialing out from ${CALLERID(all)} to ${EXTEN} through Melt)
exten => _[25]XXXXXX,n,Dial(SIP/melt/${EXTEN},60)
exten => _[25]XXXXXX,n,Playtones(congestion)
exten => _[25]XXXXXX,n,Hangup()
; Тоже самое, но с указанием кода города (в данном случае Казани)
exten => _[78]843[25]XXXXXX,1,Log(NOTICE, Dialing out from ${CALLERID(all)} to ${EXTEN} through Melt)
exten => _[78]843[25]XXXXXX,n,Dial(SIP/melt/${EXTEN:4},60)
exten => _[78]843[25]XXXXXX,n,Playtones(congestion)
exten => _[78]843[25]XXXXXX,n,Hangup()
; Межгород и мобильные
exten => _[78]XXXXXXXXXX,1,Log(NOTICE, Dialing out from ${CALLERID(all)} to ${EXTEN} through Multifon)
exten => _[78]XXXXXXXXXX,n,Dial(SIP/multifon/7${EXTEN:1},60)
exten => _[78]XXXXXXXXXX,n,Playtones(congestion)
exten => _[78]XXXXXXXXXX,n,Hangup()
;===============================================================================
; В этом контексте описаны входящие звонки, пришедшие через Мэлт
[incoming]
exten => 2009456,1,Log(NOTICE, Incoming call from ${CALLERID(all)})
exten => 2009456,2,Dial(SIP/200,20,t)
exten => 2009456,3,Voicemail(200@home, u)
exten => 2009456,4,Hangup()
;===============================================================================
; В этом контексте описаны входящие звонки, пришедшие через Мегафон
[incoming-multifon]
exten => 79271111111,1,Log(NOTICE, Incoming call from ${CALLERID(all)})
exten => 79271111111,2,Dial(SIP/200,20,t)
exten => 79271111111,3,Voicemail(200@home, u)
exten => 79271111111,4,Hangup()
Теперь надо "все" входящие на мегафон на SIP, для этого нужно выполнить команду:
curl https://sm.megafon.ru/sm/client/routing?login=79271111111@multifon.ru\&password=pass2
На этом настройка закончена и можно перезапустить asterisk:
invoke-rc.d asterisk restart
Теперь остаётся только настроить SIP-клиент (или SIP-адаптер) для подключения к нашему asterisk и можно пользоваться. Чтобы проверить состояние внешних транков нужно ввести команду:
asterisk -rx 'sip show registry'
А для просмотра всех SIP-соединений:
asterisk -rx 'sip show peers'