Курсы по использованию Asterisk

IP-телефония — технология будущего. Обучитесь работе с IP-АТС Asterisk для того чтобы внедрить и профессионально использовать при решении коммуникационных задач.

Работайте с Asterisk профессионально!

Многоуровневая защита IP-АТС Asterisk

Телефонные станции очень часто становятся объектами хакерских атак. Узнайте, каким образом необходимо строить многоуровневую защиту для Вашей IP-АТС.

Не оставьте хакерам шансов. Защитите свой Asterisk от атак.

Используйте Веб-Интерфейс для удобства настройки

Панель управление FreePBX позволяет легко и удобно управлять всей системой. Научитесь эффективно использовать FreePBX для решения своих задач.

Управление станцией и статистика в окне браузера.

Научитесь работать с Asterisk из консоли

Для понимания работы с Asterisk необходимо уметь настраивать его вручную с конфигурационными файлами и командной строкой CLI Asterisk.

Научитесь «тонкой» настройке Asterisk

Цель курсов - максимум практики.

Обучение нацелено на практическую работу с IP-оборудованием: платы потоков E1, VoIP-телефонные аппараты, голосовые шлюзы FXS и прочее.

Обучение на реальном оборудовании — залог успеха.

Как не терять звонок, когда звонящий набирает недоступный внутренний номер в IVR FreePBX

База знаний Настройка Asterisk

В модуле FreePBX IVR есть защита от набора несуществующего номера, но нет защиты от неответа или недоступности существующего номера. В данной статье будет описан сценарий обработки входящих вызовов, который позволит в этих случаях обрабатывать вызов так же, как если бы звонящий ввёл несуществующий номер. Приведённый сценарий рассчитан также на Follow Me и на донабор внутренних номеров, расположенных не на текущем сервере телефонии.
Настройки, приведённые в статье, рассчитаны на FreePBX 13.

Настройки в web-интерфейсе FreePBX

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

Inbound IVR


Все остальные настройки относятся к правке диалплана Asterisk.

 

Изменения в диалплане


Добавление обработки переменной RETURN_AT_ONCE в контексты FreePBX


Первое, что требуется сделать - получить в диалплане, сгенерированном FreePBX, универсальный механизм, позволяющий возвращаться из вызова внутреннего номера (включая Follow Me) и вызова номера через транк, до выполнения стандартных обработчиков завершения этих вызовов. Для этого в диалплане будет устанавливаться флаг RETURN_AT_ONCE=true, а в контекстах, вызываемых через Macro и Gosub, будет выполняться соответственно MacroExit и Return сразу после завершения приложения Dial, если флаг установлен. Такой механизм нам нужен в следующих контекстах:
macro-dial-one - для вызова внутренних номеров
macro-dialout-trunk и контексты outrt-*, относящиеся к интересующим нас маршрутам - для вызова внутренних номеров, расположенных не на текущем сервере телефонии
followme-check и followme-sub - для Follow Me

 

macro-dial-one, macro-dialout-trunk, followme-check и followme-sub


Эти контексты нужно скопировать из файла /etc/asterisk/extensions_additional.conf в файл /etc/asterisk/extensions_override_freepbx.conf и внести в них проверки флага RETURN_AT_ONCE. В архиве. в файле extensions_override_freepbx.conf есть все указанные контексты, изменения выделены комментариями (диалплан может немного отличаться между подверсиями FreePBX, поэтому желательно скопировать свои версии контекстов из файла /etc/asterisk/extensions_additional.conf и внести в них изменения по приложенному файлу).

 

outrt-*


В эти контексты в каждый экстеншен нужно добавить строку

same  => n,ExecIf($["${RETURN_AT_ONCE}" = "true"]?Return())


после всех вызовов macro-dialout-trunk. Для этого можно внести правки в файл FreePBX /var/www/html/admin/modules/core/functions.inc.php - нужно добавить строку

$ext->add($context, $exten, '', new ext_execif('$["${RETURN_AT_ONCE}" = "true"]','Return',''));


сразу после цикла

foreach ($trunks as $trunk_id) {
        if (isset($trunk_table[$trunk_id])) switch(strtolower($trunk_table[$trunk_id]['tech'])) {
                case 'dundi':
                $trunk_macro = 'dialout-dundi';
                break;
                case 'enum':
                $trunk_macro = 'dialout-enum';
                break;
                default:
                $trunk_macro = 'dialout-trunk';
                break;
        }
        $ext->add($context, $exten, '', new ext_macro(
        $trunk_macro, $trunk_id . ',' . $pattern['prepend_digits'] . '${EXTEN' . $offset . '},' . $password . ',' . $trunk_table[$trunk_id]['continue']));
        $password = '';
        $trunk_type_needed['macro-' . $trunk_macro] = true;
}

Затем применить настройки FreePBX.

 

Добавление контекстов для реализации описываемого сценария


Для реализации описываемого сценария приведённые ниже контексты нужно добавить в файл /etc/asterisk/extensions_custom.conf.

[direct-dial-with-failover]
exten => _X.,1,Set(PASSED_DIRECT_DIAL=true)
same  => n,ExecIf($["${FAILOVER_DEST}" = ""]?Set(FAILOVER_DEST=${DEFAULT_FAILOVER}))
same  => n,Set(RETURN_AT_ONCE=true)
same  => n,Set(OLD_TRUNK_RING_TIMER=${TRUNK_RING_TIMER})
same  => n,Set(__TRUNK_RING_TIMER=${IVR_DIRECT_RINGTIME})
same  => n,Set(CWIGNORE=)
same  => n,Set(DIALSTATUS=)
same  => n,Gosub(sub-record-check,s,1(exten,${EXTEN},force))
same  => n,GotoIf(${DIALPLAN_EXISTS(ext-local,${EXTEN},1)}?dial_local:dial_remote)
same  => n(dial_local),GotoIf($["${DB(AMPUSER/${EXTEN}/cidnum)}" = ""]?virtual_exten)
same  => n,GotoIf($["${DB(DEVICE/${EXTEN}/dial)}" = ""]?virtual_exten)
same  => n,GotoIf($["${DIALPLAN_EXISTS(ext-findmefollow,${EXTEN},1)}" = "0"]?dial_one)
same  => n,Gosub(ext-findmefollow,${EXTEN},1)
same  => n,Goto(after_dial_local)
same  => n(dial_one),Set(CUR_CALLEE_STATE=${EXTENSION_STATE(${EXTEN}@ext-local)})
same  => n,GotoIf($["${CUR_CALLEE_STATE}" != "NOT_INUSE"]?after_dial_local)
same  => n,Macro(dial-one,${IVR_DIRECT_RINGTIME},${D_OPTS_IVR},${EXTEN})
same  => n,Goto(after_dial_local)
same  => n(virtual_exten),Dial(Local/${EXTEN}@ext-local,${IVR_DIRECT_RINGTIME},${D_OPTS_IVR})
same  => n(after_dial_local),ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup)
same  => n,NoOp(Dial failed with DIALSTATUS: ${DIALSTATUS})
same  => n,Goto(failover)
same  => n(dial_remote),GotoIf($[${DIALPLAN_EXISTS(dial-remote-from-ivr,${EXTEN},1)} = 0]?after_dial_remote)
same  => n,GotoIf($["${SIP_HEADER(X-Asterisk-Calltype)}" = "Direct_Dial"]?failover)
same  => n,SIPAddHeader(X-Asterisk-Calltype:Direct_Dial)
same  => n,Gosub(dial-remote-from-ivr,${EXTEN},1)
same  => n,SIPRemoveHeader(X-Asterisk-Calltype:)
same  => n(after_dial_remote),ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup)
same  => n,NoOp(Dial failed with DIALSTATUS: ${DIALSTATUS})
same  => n(failover),Set(RETURN_AT_ONCE=)
same  => n,Set(__TRUNK_RING_TIMER=${OLD_TRUNK_RING_TIMER})
same  => n,Goto(${FAILOVER_DEST})
 
[dial-remote-from-ivr]
include => outrt-1

В приведённых контекстах:
outrt-1 - контекст FreePBX, описывающий исходящий маршрут, который следует использовать для вызова на внутренние номера, расположенные не на текущем сервере телефонии (имена контекстов, описывающих исходящие маршруты, можно найти а файле /etc/asterisk/extensions_additional.conf, все эти контексты будут иметь названия outrt-<ID_маршрута_в_FreePBX>). В dial-remote-from-ivr можно включить несколько контекстов, если требуется.
DEFAULT_FAILOVER - глобальная переменная, указывающая на назначение по неответу по умолчанию (используется, если переменная FAILOVER_DEST не была установлена перед входом в direct-dial-with-failover)
IVR_DIRECT_RINGTIME - глобальная переменная, в которой содержится максимальное время ожидания ответа от номера, набранного в IVR
Переменные DEFAULT_FAILOVER и IVR_DIRECT_RINGTIME можно описать в файле /etc/asterisk/globals_custom.conf. Пример:

DEFAULT_FAILOVER=ext-queues,6001,1
IVR_DIRECT_RINGTIME=15


Добавление обработчика донабора внутреннего номера в контекст IVR


Всё, что осталось сделать - добавить переход в контекст direct-dial-with-failover при донаборе внутреннего номера в IVR, созданном на первом этапе настройки. Для этого нужно найти в файле /etc/asterisk/extensions_additional.conf контекст IVR, сгенерированный FreePBX (в данном примере - ivr-1), и дописать в него экстеншен _XXX (в данном примере все внутренние номера - трёхзначные). Дописывать новый экстеншен в контекст IVR можно в /etc/asterisk/extensions_override_freepbx.conf либо в /etc/asterisk/extensions_custom.conf - не имеет значения.

[ivr-1]
exten => _XXX,1,Set(FAILOVER_DEST=${CONTEXT},i,1)
same  => n,Goto(direct-dial-with-failover,${EXTEN},1)

Обратите внимание, что назначением по неответу устанавливается экстеншен i в текущем IVR. Настройка завершена, можно проверять.

 

asterisk, sip, настройка, FreePBX, внутренние номера, IVR