Пример конфигурации IP АТС Asterisk
В материале приводится небольшой пример конфигурации Asterisk. Этот пример можно использовать для понимания работы Asterisk, а также как основу для более сложных конфигураций. В качестве “железа” использовалась платформа Intel INTEL NUC DE3815TYKHE с 2 Гб оперативной памяти, HDD объёмом 320 Гб. Операциционная система Linux Debian 7.
Начальные условия
В качестве “железа” использовалась платформа Intel INTEL NUC DE3815TYKHE с установленной оперативной памятью KINGSTON VALUERAM KVR16LS11S6/2 DDR3L объёмом 2Гб 1600, SO-DIMM и жёстким диском SEAGATE (SAMSUNG) Momentus ST320LM001 объёмом 320Гб. На момент покупки системы, это были самые доступные комплектующие, к тому же, хотелось использовать именно x86 архитектуру системы, а не ARM. Хотя использование ARM, например, платформы Raspberry Pi, почти вдвое бы удешевило стоимость «железа», но немного добавило бы сложности с инсталляцией Linux, к тому же, хотелось использовать HDD а не SD-карту в качестве накопителя.
В итоге, получился мини-сервер с пассивным охлаждением и отсутствием шума от вентиляторов, низким энергопотреблением порядка 5 Ватт и совсем не большими размерами. К несущественным минусам я бы отнес одноядерный процессор Intel® Atom™ E3815 1,46 ГГц, в моей конфигурации DE3815TYKHE, один интерфейс Ethernet, но со скоростью до 1000 Мбит/с. Если процессор на платформе не заменить, так как он припаян к материнской плате, то от проблемы одного сетевого интерфейса Ethernet можно уйти путем настройки нужного количества VLAN-интерфейсов, правда, для этого, понадобится дополнительное оборудование, которое понимает VLAN-теги, например, самый доступный коммутатор, который я смог найти это D-Link DGS-1100-05.
Внешний вид мини-ПК Intel NUC на картинках ниже.
Интересно, что где-то в интернете я нашёл отчет о тестировании, в котором говориться, что конфигурация аналогичная моей “тянет” до 100 одновременных вызовов с проксированием через Asterisk. Но думаю, что для такой нагрузки лучше взять “железо” помощнее.
Железо выбрано, теперь рассмотрим схему сети:
IP АТС Asterisk находится за маршрутизатором с публичным IP, внутренняя сеть, 192.168.2.0/24, внешний IP=84.52.XX.XX, на коммутаторе настроен проброс порта 9966 с 84.52.XX.XX на 192.168.2.254 – IP адрес АТС Asterisk. Для связи с телефонной сетью общего пользования используется оператор Телфин (номера 3091111 и 3091112 в примере). IP-телефоны получают IP адреса по протоколу DHCP из сети 192.168.2.0/24 в заранее определенном диапазоне. В реальной конфигурации использовались перепрошитые IP телефоны Cisco 7942 и 7945.
Инструкции о том как перепрошить и настроить телефоны Cisco 79XX для работы с IP АТС Asterisk описаны в данной статье.
Итак, ставим Linux на Intel NUC, я поставил дистрибутив Debian 7.8(другой рекомендуемый вариант дистрибутив CentOS), далее, настраиваем все необходимые сервисы для работы IP телефонов Cisco, это описано в данной статье.
Ставим Asterisk, это делается довольно просто, существует два способа установки:
1) Из пакетов Debian, но тогда версия Asterisk будет старой, установщик aptitude предложил мне 1.8, другой способ — добавить репозитории Asterisk и поставить, последнюю версию.
2) Скачать исходные коды asterisk, распаковать их и затем собрать Asterisk, этот вариант больше подходит тем кто хочет собрать Asterisk с определенными опциями и аддонами, в нашем случае это не требуется.
Более подробно ознакомиться с методами инсталляции Asterisk можно на соответствующих wiki-страницах сайта asterisk.org на английском языке. Для нашей конфигурации подойдет любая версия Asterisk начиная с 1.6. Я рекомендую для простых конфигураций использовать установку Asterisk из пакетов. Также рекомендую установить пакеты звуковых файлов на русском языке. Например, устанавливаем версию 1.8 из стандартного репозитория Debian:
#aptitude install asterisk asterisk-core-sounds-ru asterisk-voicemail
После установки IP АТС Asterisk рекомендую добавить автоматический запуск asterisk после перезагрузки, например для Debian:
#update-rc.d asterisk defaults
Описание конфигурации Asterisk которая будет реализована
При исходящих вызовах с префиксом “9” перед набираемым номером, вызов будет уходить на второй транк Телфин с номером 78123091111, при вызовах на остальные номера(те без набора 9ки перед номером) вызов будет уходить с АОНом 78123091112 на первый транк с Телфином.
При звонке на номер 700 с внутреннего номера, вызов отправляется на приложение voicemail для работы с голосовой почтой. Наборы на номера с маской 1XX –вызовы на внутренние телефоны. У каждого абонента есть голосовая почта, в случае недоступности или занятости абонента, вызов переадресуется на голосовую почту, для возможности оставить голосовое сообщение. При появлении нового голосового сообщения, владельцу голосового ящика отправляется уведомление с вложенным аудио файлом сообщения. Также на телефоне загорается индикатор о наличии новых голосовых сообщений.
Предусмотрена возможность установки переадресации при помощи набора специальных номеров с внутренних телефонов. Если переадресация установлена таким способом, вызов сразу же будет переадресован на указанный номер без проговаривания IVR.
Для установки безусловной переадресации с номера 78123091112 набрать #00#Номер телефона, для снятия переадресации набрать #00#.
Для установки переадресации безусловной переадресации с номера 78123091111 набрать #01#Номер телефона, для снятия переадресации набрать #01#.
Второй способ установки переадресации – прямо с IP-телефона, в таком случае вызов придет из группы поиска на телефон и будет переадресован на указанный номер для переадресации. При этом остальные телефоны в группе продолжат звонить. Перехват вызова при помощи набора *8 с телефона. Функции перевода вызова осуществляются через кнопки на IP-телефоне.
При входящем вызове на любой из двух номеров Телфина включается соответствующий набранному номеру сценарий обработки вызова. Перед номером вызывающего абонента добавляется префикс с номером транка Телфина, чтобы понимать с какого из двух номеров пришел вызовов, этот префикс отобразиться на экране IP-телефона. Сначала проверяется установлена ли безусловная переадресация, если нет, проигрывается заранее загруженный звуковой файл приветствия 78123091111.wav или 78123091112.wav из директории /var/lib/asterisk/sounds/ru/, файл должен быть в формате Аудио: 8 000 Гц; 16 Bit; Моно; PCM. Во время воспроизведения приветствия и после, в течение 6 секунд, абонент может набрать внутренний номер абонента в формате 1XX или 1XX#, если номер набран неправильно(номера не существует) предлагается еще раз ввести номер в течение 6 секунд, если опять набран не правильно, вызов переводится на группу. Если вызывающий абонент “донабрал” внутренний номер, который существует но занят или недоступен(не зарегистрирован), звонящий переводится на соответствующий занятому абоненту голосовой ящик. чтобы оставить голосовое сообщение. Если абонент ничего не “донабрал”, вызов переадресуется по таймауту на группу из двух номеров, для номера 78123091111 одновременно вызываются 100 и 101 номера, для 78123091112 вызываются 102 и 103 в течение 30 секунд. Если никто не подошел вызов переводится на голосовую почту абонета 100.
Для реализации на IP АТС Asterisk такой конфигурации нужно минимум сконфигурировать три файла в директории где хранятся конфигурационные файлы /ets/asterisk. Кстати, примеры всех конфигурационных файлов чаще всего инсталлируются в указанную директорию по умолчанию, при установки Asterisk из пакетов (или командой make samples при сборке из исходных кодов). Первый из них sip.conf, в этом файле настраиваются общие параметры сигнального протокола SIP, учетные записи IP-телефонов, в примере это 4 номера 100-103, а также подключения к внешнему миру – два номера Телфин. Второй файл voicemail.conf описывает настройки голосовой почты. Третий файл extensions.conf, описывает сценарий работы IP АТС на языке дайлплана Asterisk в виде последовательности действий с вызовом.
Что касается дополнительных конфигурационных файлов Asterisk которые должны быть в директории /etc/asterisk, то это:
asterisk.conf – его можно оставить без изменений
cdr.conf – его можно оставить без изменений, но я бы изменил параметры
unanswered = yes
congestion = yes
тогда будут сохраняться и неуспешные вызовы.
Еще один параметр usegmtime=no – чтобы время в CDR сохранялось в местном часовом поясе.
cli.conf можно установить больший уровень отладки
core set verbose 9999 = yes
core set debug 999 = yes
features.conf – оставить все по умолчанию
logger.conf – оставить все по умолчанию
modules.conf – оставить все по умолчанию
musiconhold.conf – оставить все по умолчанию, а если хотите поменять музыку по удержанию то отредактировать
indications.conf – если этого файла не будет в директории конфигурации Asterisk, при входящем вызове не будет слышно КПВ, вместо этого тишина, например при вызове в очередь или вызов внутреннего абонента приложением Dial с ключем r.
Пример файлов конфигурации для настройки Asterisk
Сначала настроим каналы SIP, SIP-транки на оператора Телфин и учетные записи IP телефонов. А также общие настройки SIP.
#cat /etc/asterisk/sip.conf [general] context=default ;Контекст по умолчанию для входящих вызовов allowoverlap=no allowguest=no;отбивать все вызовы с неизветстный IP. alwaysauthreject=yes;Присылать одно и тоже SIP сообщение вне ;зависимости неверный пароль или пользователь не существует. ;Опция усложняет взлом. useragent=PBX; То что будет отображаться в UA вашего Asterisk. defaultexpiry=360;Интервал обязательной перерегистрации абонентов. callevents=no;Означает что RTP для все вызовов должен проксироваться. limitonpeer=yes ;Считаем исходящие и входящие вызовы пиров вместе. rtptimeout=10 ;Таймаут отсутствия RTP-трафика language=ru ;Язык в системе по умолчанию. Например для голосовых файлов. bindport=9966 ;Заменяем стандартный порт SIP 5060 на нестандартный ;9966 уменьшает вероятность нахождения сканнером порта SIP. bindaddr=0.0.0.0 ;Слушаем на всех интерфейсах srvlookup=yes ;Активировать поиск DNS SRV-записей для исходящих вызовов disallow=all ;сначала запрещаем все кодеки затем, разрешаем только те, ;что хотим использовать. allow=ulaw allow=alaw allow=g729 ;можно использовать если очень узкий канал allow=g722 ;для звонков между IP-телефонов, кодек с повышенным ;качеством звука dtmfmode=auto rtpholdtimeout=300 rtpkeepalive=5 externip=84.52.XX.XX;Указываем наш внешний IP, Asterisk за NAT. localnet=192.168.2.0/255.255.255.0 ;Указываем внутреннюю сеть где находятся наши IP-телефоны register => 00081111:pass@voice.telphin.com:5068/00081111 ; номер 78123091111, регистрируем для входящих вызовов register => 00081112:рass2@voice.telphin.com:5068/00081112 ; номер 78123091113, регистрируем для входящих вызовов [78123091111] ; Первый номер context=inbound type=peer username=000115272 fromuser=000115272 secret=pass host=voice.telphin.com port=5068 promiscredir=yes qualify=yes insecure=port,invite [000115272] context=inbound type=peer username=000115272 host=voice.telphin.com port=5068 qualify=yes [78123091112] ; второй номер context=inbound type=peer username=00083807 fromuser=00083807 secret=H3QJgzPN host=voice.telphin.com port=5068 promiscredir=yes ;qualify=yes insecure=port,invite [00083807] context=inbound type=peer username=00083807 host=voice.telphin.com port=5068 qualify=yes ;Теперь опишем внутренних абонентов: [100] deny=0.0.0.0/0.0.0.0 permit=192.168.2.0/255.255.255.0 ;регистрироваться только из локальной сети type=friend context=phones ;контекст для телефонов host=dynamic secret=Z1gL4Z1gL4 dtmfmode=rfc2833 call-limit=2 ;Разрешим максимум 2 одновременных вызова disallow=all allow=ulaw allow=alaw pickupgroup=1 callgroup=1 ;Все телефоны в одной группе перехвата, перехват по умолчанию ;комбинацией *8 qualify=yes mailbox=100@voicemail ;Ящик для голосовой почты [101] deny=0.0.0.0/0.0.0.0 permit=192.168.2.0/255.255.255.0 type=friend context=phones host=dynamic secret=Z1gL4Z1gL4 dtmfmode=rfc2833 call-limit=2 disallow=all allow=ulaw allow=alaw pickupgroup=1 callgroup=1 qualify=yes mailbox=101@voicemail [102] deny=0.0.0.0/0.0.0.0 permit=192.168.2.0/255.255.255.0 type=friend context=phones host=dynamic secret=F8iIhF8iIh dtmfmode=rfc2833 call-limit=2 disallow=all allow=ulaw allow=alaw pickupgroup=1 callgroup=1 qualify=yes mailbox=102@voicemail [103] deny=0.0.0.0/0.0.0.0 permit=192.168.2.0/255.255.255.0 type=friend context=phones host=dynamic secret=F8iIhF8iIh dtmfmode=rfc2833 call-limit=2 disallow=all allow=ulaw allow=alaw pickupgroup=1 callgroup=1 qualify=yes mailbox=103@voicemail
На этом настройка каналов закончена, мы описали 2 внешних SIP-транка и 4 внутренних
номера. Теперь настроим голосовые почтовые ящики для наших абонентов:
#cat /etc/asterisk/voicemail.conf [general] format=wav49|gsm|wav serveremail=root@asteriskserver.com attach=yes ; прикрепить запись сообщения maxmsg=100 ;максимальное кол-во сообщений для ящика. maxsecs=180 ;максимальная длинна сообщения, 3 минуты макс. minsecs=3 ;минимальная длина maxgreet=60 ;Максимальное время приветствия skipms=3000 maxlogins=3 moveheard=yes charset=UTF-8 pbxskip=yes fromstring=Voicemail server ; от этого "лица" будут приходить сообщения emailsubject=Новое голосовое сообщение ${VM_MSGNUM} в ящике ${VM_MAILBOX} ; Subject электронного письма с оповещением emailbody=Вам пришло новое голосовое сообщение длительностью ${VM_DUR} под номером ${VM_MSGNUM} \nв ящик ${VM_MAILBOX} от ${VM_CALLERID}, в ${VM_DATE}. ; текст сообщения электронного письма emaildateformat=%A, %B %d, %Y at %r pagerdateformat=%A, %B %d, %Y at %r ;mailcmd=/usr/sbin/sendmail –t ;если у вас какой-то особенный MTA агент, укажите его. delete=yes ; Если голосовая почта отправляется только на email – 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 [voicemail] ; контекст голосовой почты 100 => 0,Ignat_100,info@mail.ru ;укажите почту получения сообщения 101 => 0,Ignat_101,ignat101@gmail.com 102 => 0,Ignat_102,ignat102@gmail.com 103 => 0,Ignat_103,ignat103@gmail.com
Теперь пришло время настроить логику работы Asterisk.
#cat /etc/asterisk/extensions.conf [general] [inbound] ;####### Начало обработки 78123091111(00081111) exten => 00081111,1, Verbose(!!! 78123091111 IVR Started !!!) ;Начало обработки вызова при звонке на номер 78123091111 same => n,Set(REDIRECTNUM=${DB(redirect/78123091111)}) ;Проверяем в AstDB установлена ли переадресация для номера same => n,GotoIf($[${ISNULL(${REDIRECTNUM})}]?proceed:redirect) ;Если да, то отправляем вызов на redirect, если нет то на proceed same => n(redirect),Set(CALLERID(num)=00081111) ;Если вызов переадресован, устанавливаем CallerID для Телфина same => n,Dial(SIP/78123091111/${REDIRECTNUM}) ;Звоним на номер переадресации same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) ;Если никто не подошел или абонент недоступен, ;отправляем на голосовую почту same => n(unavail),Voicemail(100@voicemail,u) ;Если абонент недоступен отправить на голосовую почту same => n,Hangup() ;Отбой same => n(busy),VoiceMail(100@voicemail,b) ;Если занято переадресация на голосовую почту same => n,Hangup() ;Отбой same => n(proceed), Set(CALLERID(name)=78123091111_) ;Добавляем признак что это звонок с номера 78123091111 same => n, Answer ;Ответ same => n, Background(78123091111) ;Проиграть заранее загруженный файл приветствия ;находящийся в /var/lib/asterisk/sounds/ru/78123091111.wav same => n,WaitExten(6) ;Ожидание ввода добавочного номера exten => i,1, NoOp(!!!! INVALID!!!!) ;Так же для функция NoOp для отладки exten => i,n,Playback(pbx-invalid) ;Проигрываем звуковой файл pbx-invalid exten => i,n,WaitExten(6) ;Ждем повторного набора еще 6 секунд ;exten => i,n,Goto(inbound,00081111,1) ;Кидаем вызов снова на IVR если номер набран неправильно, ;раскоментировано exten => _1XX,1,Dial(SIP/${EXTEN},15,m) ;Вызов на IP-телефон из пула сотых номеров ;вызов в течение 15 секунд same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) ;Если никто не ответил, или занято отправлять на voicemail same => n(unavail),Voicemail(${EXTEN}@voicemail,u) ;Сообщение о недоступности далее, на голосовую почту same => n,Hangup() same => n(busy),VoiceMail(${EXTEN}@voicemail,b) ;Сообщение о занятости далее, на голосовую почту same => n,Hangup() exten => _1XX#,1,Dial(SIP/${EXTEN:0:3},15,m) ;Трансфер если донабрали номер из сотого пула с# далее все тоже что и в первом случае с _1XX same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) same => n(unavail),Voicemail(${EXTEN:0:3}@voicemail,u) same => n,Hangup() same => n(busy),VoiceMail(${EXTEN:0:3}@voicemail,b) same => n,Hangup() exten => t,1,Playback(pbx-transfer) ;Обработка вызова по таймауту если абонент ничего не донабрал exten => t,n,Dial(SIP/100&SIP/101,30,m) ;Отправляем вызов на 100 и 101, звоним 30 секунд ;100 и 101 звонят одновременно same => n,Playback(followme/sorry) ;Проговариваем сообщение, если никто не ответил same => n,NoOp( trans to voicemailVoicemail ) ;Вывод отладочного сообщения same => n,Set(CDR(accountcode)=voicemail) ;Добавляем код voicemail в CDR same => n,VoiceMail(100@voicemail) ;Переводим вызов на голосовую почту same => n,Hangup ;###### 78123091111(00081111) Конец ;###### 3092545(00081112) Начало exten => 00081112,1, Verbose(!!! 78123091112 Started !!!) ; Начало IVR 78123091112 same => n,Set(REDIRECTNUM=${DB(redirect/78123091112)}) ;Проверяем установлена ли переадресация для 00081112, второй транк Телфин same => n,GotoIf($[${ISNULL(${REDIRECTNUM})}]?proceed:redirect) same => n(redirect),Set(CALLERID(num)=00081112) same => n,Dial(SIP/78123091112/${REDIRECTNUM}) ;Звоним на номер куда установлена переадерсация ;для второго транка Телфин с номером 78123091112 same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) same => n(unavail),Voicemail(100@voicemail,u) same => n,Hangup() same => n(busy),VoiceMail(100@voicemail,b) same => n,Hangup() same => n(proceed), Set(CALLERID(name)=78123091112_) same => n, Answer same => n, Background(78123091112) ;IVR 78123091112 same => n,WaitExten(6) same => n,Dial(SIP/102&SIP/103,30,m) same => n,Playback(followme/sorry) same => n,NoOp(Voicemail Started!!!) same => n,Set(CDR(accountcode)=voicemail) same => n,VoiceMail(100@voicemail) same => n,Hangup ;####### 78123091112 Конец include => redirect ;Добавим контекст для установки переадресации [phones] include => internal include => outbound include => redirect include => voicemail ;Добавляем возможности нашим телефонам которые ;находятся в контексте phones [internal] ;Контекст для внутренних вызовов ;если не дозвониться, возможность оставить голосовое сообщение exten => _1XX,1,Dial(SIP/${EXTEN},10) exten => _1XXX,1,Dial(SIP/${EXTEN},10) same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) same => n(unavail),Voicemail(${EXTEN}@voicemail,u) same => n,Hangup() same => n(busy),VoiceMail(${EXTEN}@voicemail,b) same => n,Hangup() [outbound] ;Контекст для исходящих вызовов с телефонов ;Исходящие вызовы с (00081112)78123091112 exten => _X.,1, Set(CALLERID(num)=00081112) ;Подставим внешний номер для Телфина exten => _X.,n,Dial(SIP/78123091112/${EXTEN}) ;Отправим вызов в транк 78123091112 exten => _+X.,1, Set(CALLERID(num)=00081112) ;Тоже, но если набран символ "+" перед номером exten => _+X.,n,Dial(SIP/78123091112/${EXTEN:1}) exten => _X.,n, Hangup() ;Исходящие вызовы с (00081111)78123091111 ;Самый простой способ отправить вызов на второй транк ;ввести префикс 9 перед номером. exten => _9X.,1, Set(CALLERID(num)=00081111) exten => _9X./00081111,n,Dial(SIP/78123091111/${EXTEN:1}) exten => _9X.,n, Hangup() ;Voicemail exten => 700,1,VoiceMailMain(${CALLERID(num)}@voicemail) ;Возможность абонентам звонить и проверять голосовую почту same => n,Hangup [redirect] ;Установка переадресации 78123091112 exten => _#00#X.,1,Set(DB(redirect/78123091112)=${EXTEN:4}) ;Абонент должен набрать #00#89627277780 exten => _#00#X.,2,Set(COUNT=${DB(redirect/78123091112)}) ;Набранный номер 89627277780 запишется в БД exten => _#00#X.,n,Answer() exten => _#00#X.,n,SayDigits(${COUNT}) ;Абоненту проговорится установленный номер exten => _#00#X.,n,Hangup() ;Снятие переадресации 78123091112 exten => _#00#,1,Set(${DB_DELETE(redirect/78123091112)}) ;Абонент должен набрать #00#, номер будет удален из БД same => n,Answer same => n,Playback(vm-goodbye) same => n,SayDigits(${DB(redirect/78123091112)}) ;Установка переадресации 78123091111 ;аналогично предыдущему номеру но набирать нужно #01# exten => _#01#X.,1,Set(DB(redirect/78123091111)=${EXTEN:4}) exten => _#01#X.,2,Set(COUNT=${DB(redirect/78123091111)}) exten => _#01#X.,n,Answer() exten => _#01#X.,n,SayDigits(${COUNT}) exten => _#01#X.,n,Hangup() ;Снятие переадресации 78123091111 exten => _#01#,1,Set(${DB_DELETE(redirect/78123091111)}) same => n,Answer same => n,Playback(vm-goodbye) same => n,SayDigits(${DB(redirect/78123091111)})
Вот и все для минимальной конфигурации.
Для отладки конфигурации, можно пользоваться следующими командами из CLI консоли Asterisk для проверки переадресации:
#ast_cli>database put redirect 78123091111 89627277780 #ast_cli>database del redirect 78123091111 #ast_cli>database put redirect 78123091112 89627277780 #ast_cli>database del redirect 78123091112
Команды соответственно помещают и удаляют из базы данных Asterisk значения переменных для установки переадресации.
Для тестовых наборов из консоли:
#ast_cli>channel originate SIP/78123091111/89627277780 extension 100@outbound
Asterisk наберет с номера 100 номер.
В файле /etc/asterisk/logger.conf можно установить
console => notice,warning,error,debug
ключевое слово debug означает что в CLI Asterisk будет выводиться максимум отладочной информации.
Автор: Игнат Кудрявцев
Похожие материалы:
alwaysauthreject=yes
Спасибо, исправил.
Спасибо , разбирался с Asterisk в том числе по этой статье, очень помогла.