Pull to refresh

Практическое применение Asterisk в домашних условиях

Reading time 5 min
Views 34K
Как и у многих коллег по цеху, дома у меня построена небольшая сеть. И, конечно же, есть домашний сервер, этакий плацдарм для испытания новых технологий. С регулярной периодичностью тихими вечерами под монотонное бубнение какого-нибудь подкаста, меня посещают мысли поковырять что-то новое и интересное. Объявление провайдера об открытии услуги sip-телефонии натолкнуло меня на мысль пойти в сторону voip. Интересное и перспективное направление. Казалось бы, что тут такого – поставил софтфон, а еще лучше железный sip-шлюз и радуйся жизни. Но разве это тот путь, который мы выбрали, пойдя по пути инженера, сисадмина, программиста (нужное подчеркнуть). Гораздо интереснее будет поставить свой собственный VoIP-сервер, повесить на нем голосовую почту и пускай красивым женским голосом отвечает на звонки, когда никто не может снять трубку. Конечно выбор пал на Asterisk.


Установка дистрибутива


Домашний сервер крутится под управлением FreeBSD. Все процедуры и пути будут относиться к этой операционной системе. Собственно при небольшом усилии все прекрасно адаптируется под любую платформу, на которой может работать Asterisk.

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

cd /usr/ports/net/asterisk
make install clean


Оставил все по умолчанию в конфигураторе. Все собралось без лишних вопросов. Как и полагается, конфиги попали в /usr/local/etc/asterisk/. И как обычно их было не маленькое количество. Нам же, собственно, понадобятся только три из них.

Не забудьте про автозапуск демона:
echo ‘asterisk_enable=”YES”’ >> /etc/rc.conf

Конфигурация


Провайдер предоставляет услуги sip-телефонии. Дает прямой городской номер. По техзаданию мой сервер должен автоматически регистрироваться на сервере провайдера и в случае входящего звонка от провайдера, маршрутизировать его на внутренний телефон. Внутренний телефон – обычный телефонный аппарат, подключенный через железный шлюз по sip к нашему серверу. Если трубку никто не снимает, то проигрываем голосовое сообщение и предлагаем звонящему оставить голосовое сообщение.

При звонке с «локального» телефона для выхода на провайдера будем использовать префикс (я остановился на 9, как наиболее привычный вариант). При наборе номера (в моем случае 777, попадаем в меню голосовой почты). Можно было сделать выход «на город» и без префикса, но в планах у меня подключится к sipnet.ru и использовать междугородние и международные направления именно через него. Ведь, если смотреть правде в глаза, услуга моего местного провайдера только и полезна, что прямым городским номером и дешевыми звонками в пределах города.

Вернемся к конфигурации.
Все соединения будут проходить с помощью SIP протокола. Все, что касается работы Asterisk с sip-ом, описывается в файле /usr/local/etc/asterisk/sip.conf:

[general]
videosupport=no
useragent=boorhomepbx
register=<_username>:<_password>@<_server_address>/200

[100]
type=friend
host=dynamic
username=100
secret=пароль для локального абонента
language=ru
nat=no
canreinvite=no
context=home
mailbox=200@default
disallow=all
allow=ulaw
allow=alaw
deny=0.0.0.0/0
permit=192.168.0.0/24

[ext-out]
type=peer
context= extrnl
username=username
secret=<_password>
host=server_address
dtmf=inband
nat=yes
canreinvite=no
insecure=invite,port
fromuser=<_username>
fromdomain=<_server_address>
authname=<_username>
authuser=<_username>


100 – это локальный телефон
ext-out — это провайдер
_username — имя пользователя для регистрации у провайдера
_password — пароль для регистрации у провайдера
_server address — адрес сервера провайдера

Важно обратить внимание на строку:
register=<_username>:<_password>@<_server_address>/200

Здесь мы указываем серверу зарегистрироваться у провайдера и в случае входящего звонка, направить его (звонок) на 200 экстеншн.

Так же (как совершенного справедливо порекомендовал litnimax), стоит завести привычку использовать директивы deny/permit. Береженого, как говорится, Бог бережет.

Дальше нужно настроить диалплан, чтобы сервер знал, что ему нужно делать с прилетающими звонками. Диалплан настраивается в файле /usr/local/etc/asterisk/extensions.conf:

[home]
exten => 777,1,VoiceMailMain(300)
exten => _9.,1,Dial(SIP/ext-out/${EXTEN:1},30,r)

[extrnl]
exten => 200,1,Dial(SIP/100,20,Ttr)
exten => 200,2,Playback(vm-nobodyavail)
exten => 200,3,Voicemail(200@default)
exten => 200,n,Hangup


Здесь имеем два контекста: home и extrnl. Первый используется для «локальных» звонков, во второй попадают звонки «снаружи» (опция context в sip.conf).
В home всего две строки. Первая позволяет при наборе номера 777 попасть в меню голосовой почты (с ней разберемся дальше).
Вторая строчка несколько хитрее. Здесь при попытке набрать номер с префиксом 9, автоматически отбрасывается первый символ (префикс), а оставшейся номер без изменений сливается провайдеру.

В префиксе extrnl описываем экстеншн 200. Вспомните опцию register в sip.conf. Собственно здесь в первую очередь пытаемся вызвать абонента SIP/100 – это наш локальный телефон (exten=>200,1,Dial(SIP/100,20,Ttr)), если никто не снимает трубку в течении 20 секунд проигрываем голосовое сообщение (exten=> 200,2,Playback(vm-nobodyavail)) и перебрасываем звонящего в голосовую почту (exten=>200,3,Voicemail(200@default)). Последнее действие «кладет трубку».
Здесь используются стандартные звуковые файлы из состава дистрибутива. Их можно заменить на свои собственные.

Дальше нужно разобраться с голосовой почтой. За это отвечает файл /usr/local/etc/asterisk/voicemail.conf:

[general]
format=wav49|gsm|wav
serveremail=asterisk
attach=yes
skipms=3000
maxsilence=10
silencethreshold=128
maxlogins=3
emaildateformat=%A, %d %B %Y at %H:%M:%S
mailcmd=/usr/sbin/sendmail –t
sendvoicemail=yes

[zonemessages]
eastern=America/New_York|'vm-received' Q 'digits/at' Imp
central=America/Chicago|'vm-received' Q 'digits/at' Imp
central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours'
military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p'
european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM

[default]
; Голосовые ящики + отправка уведомления на e-mail
;номер = пароль, имя_пользователя, почтовый ящик, закрепить сообщение_голосовое
200 = 123, Incoming , email@me.com, attach=yes


Здесь в секции [general] указываем опции, названия говорят сами за себя. В [default] описываем почтовый ящики абонентов. У нас один абонент с ящиком 200. Помните строку exten => 200,3,Voicemail(200@default) из extensions.conf?

Это минимальные настройки, при которых мы получим работающую систему. Мониторинг, отладку и управление сервером можно проводить через интерактивную консоль, которая вызывается командой asterisk –r.

Вообще возможности Asterisk воистину безграничны. Как я уже говорил, можно регистрироваться у нескольких voip-провайдеров и маршрутизировать звонки по наиболее выгодным в финансовом плане направлениям. Можно автоматически отслеживать доступность тех или иных направлений. Чисто из рюшечек вместо стандартных гудков при вызове можно прикрутить какую-нибудь красивую мелодию. Это может сыграть на руку при работе фрилансером из дома.

Если пойти дальше, то можно прикрутить сотовый телефон. Для этого понадобится sim-карта от gsm-провайдера (желательно с безлимитными звонками на ваш номер и обратно) и sip-gsm шлюз. Железный или софтварный. Из софтварного я знаю только www.sipgsm.ru. Есть один огромный, на мой взгляд, недостаток – работает только под windows. А так работал в течении тестового периода вполне стабильно. Это к вопросу как завести gsm на свой asterisk. Ну а дальше настраиваем очередь и пожалуйста – вы всегда на связи. При входящем звонке вызываем первого абонента (домашный стационарный телефон), если никто не берет, пытаемся вызвать свой сотовый через gsm-шлюз. При некоторой фантазии можно получить возможность выхода со своего сотового на межгород по тарифам sip-провайдера. Вообще тут такого можно навертеть, что самому страшно. Все ограничивается лишь Вашей фантазией.

Ссылки:

Официальная страница проекта
Asterisk по-русски
Материалы на русском
База знаний по Asterisk
Вопросы — Asterisk: Вопросы и Ответы
Блог компании АТС Дизайн
Asterisk — voip-info.org
Tags:
Hubs:
+43
Comments 33
Comments Comments 33

Articles