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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Перевод вызова в очередь при вызове участника этой очереди

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

В некоторых случаях нежелательно пропускать внутренние вызовы на определённых абонентов. Например, техподдержку в компании осуществляет несколько сотрудников, в этом случае желательно не позволять большей части пользователей звонить на номера конкретных сотрудников техподдержки. Вместо этого можно переводить вызов на очередь со всеми сотрудниками техподдержки для более равномерного распределения нагрузки между ними. В данной статье будет описана реализация этого сценария в Asterisk.
Инструкции, приведённые в статье, рассчитаны на FreePBX 13.

Реализация сценария с помощью диалплана Asterisk


На первый взгляд описываемый сценарий реализуется просто, но тут есть определённые сложности. После того, как вызов будет переведён в очередь, из очереди вызов пойдёт на сотрудников техподдержки - самое важное избежать бесконечного цикла в этом месте. Также, сами сотрудники техподдержки и, как минимум, их непосредственный начальник должны иметь возможность звонить на внутренние номера техподдержки без перевода в очередь. Для избежания бесконечного цикла будет использоваться наследуемая переменная-флаг, для разрешения отдельным абонентам прозвона на внутренние номера техподдержки - проверка членства номера звонящего в очереди и записи в AstDB для пропуска вызовов с номеров, не являющихся членами очереди.

 

Ниже приведён код контекста sub-redirect-to-queue, этот контекст будет выполнять все необходимые манипуляции, затем переводить вызов в очередь.

[sub-redirect-to-queue]
exten => s,1,ExecIf($["${ARG1}" = "" | "${ARG2}" = ""]?Return)
same  => n,Set(ARRAY(Q_REDIR_TO,ORIG_DST)=${ARG1},${ARG2})
same  => n,StackPop
same  => n,GotoIf($["${CHANNEL(channeltype)}" != "SIP"]?cont1)
same  => n,GotoIf($[${REGEX("^[0-9]+$" ${SIP_HEADER(X-Asterisk-Redirected-To)})} = 0]?cont1)
same  => n,Set(__REDIRECTED_TO_${SIP_HEADER(X-Asterisk-Redirected-To)}=true)
same  => n(cont1),GotoIf($["${REDIRECTED_TO_${Q_REDIR_TO}}" = "true"]?from-internal-additional,${ORIG_DST},1)
same  => n,Set(__REDIRECTED_TO_${Q_REDIR_TO}=true)
same  => n,SIPRemoveHeader(X-Asterisk-Redirected-To:)
same  => n,SIPAddHeader(X-Asterisk-Redirected-To:${Q_REDIR_TO})
same  => n,GotoIf($["${Q_REDIR_TO}" = "${ORIG_DST}"]?end)
same  => n,GotoIf(${DB_EXISTS(${Q_REDIR_TO}_ALLOW_DIRECT/${CALLERID(num)})}?from-internal-additional,${ORIG_DST},1)
same  => n,GotoIf(${REGEX("(^|,)Local/${CALLERID(num)}@" ${QUEUE_MEMBER_LIST(${Q_REDIR_TO})})}?from-internal-additional,${ORIG_DST},1)
same  => n,GotoIf($["${BLINDTRANSFER}" = ""]?end)
same  => n,Set(BL_TRANSFERER=${CUT(BLINDTRANSFER,-,1)})
same  => n,Set(FIELDNUM=${FIELDQTY(BL_TRANSFERER,/)})
same  => n,Set(BL_TRANSFERER=${CUT(BL_TRANSFERER,/,${FIELDNUM})})
same  => n,GotoIf(${DB_EXISTS(${Q_REDIR_TO}_ALLOW_DIRECT/${BL_TRANSFERER})}?from-internal-additional,${ORIG_DST},1)
same  => n,GotoIf(${REGEX("(^|,)Local/${BL_TRANSFERER}@" ${QUEUE_MEMBER_LIST(${Q_REDIR_TO})})}?from-internal-additional,${ORIG_DST},1)
same  => n(end),Goto(from-internal-additional,${Q_REDIR_TO},1)

Контекст рассчитан на вызов с помощью Gosub и принимает два параметра - номер очереди, в которую должен быть переведён вызов, и номер, на который изначально звонили.

 

Теперь при вызове любого внутреннего номера нужно проверять, относится ли он к одной из очередей, для которых нужно реализовывать описываемую логику, если относится - вызывать контекст sub-redirect-to-queue. В FreePBX это можно сделать в контексте from-internal-custom (нужно описывать его в файле /etc/asterisk/extensions_custom.conf).

[from-internal-custom]
exten => _XXX,1,Set(Q_I=1)
same  => n(next),GotoIf($["${Q_CHECK_REDIR${Q_I}}" = ""]?end)
same  => n,GosubIf($["${EXTEN}" = "${Q_CHECK_REDIR${Q_I}}"]?sub-redirect-to-queue,s,1(${Q_CHECK_REDIR${Q_I}},${EXTEN}))
same  => n,GosubIf(${REGEX("(^|,)Local/${EXTEN}@" ${QUEUE_MEMBER_LIST(${Q_CHECK_REDIR${Q_I}})})}?sub-redirect-to-queue,s,1(${Q_CHECK_REDIR${Q_I}},${EXTEN}))
same  => n,Set(Q_I=$[${Q_I} + 1])
same  => n,Goto(next)
same  => n(end),Goto(from-internal-additional,${EXTEN},1)

(в данном примере предполагается, что используются трёхзначные внутренние номера)
Обратите внимание на то, что вызов на номер самой очереди также заворачивается в контекст sub-redirect-to-queue, это нужно для простановки переменной-флага.

 

Сами номера очередей, для которых нужно реализовывать описываемую логику, нужно вписать в глобальные переменные Q_CHECK_REDIR<X>, в FreePBX пользовательские глобальные переменные можно описать в файле /etc/asterisk/globals_custom.conf. Предположим, что в нашем случае это очереди с именами 700 и 800.

Q_CHECK_REDIR1=700
Q_CHECK_REDIR2=800

Речь также шла о внутренних номерах, не входящих в очередь, которым будет разрешён прямой прозвон на операторов очереди, их нужно добавить в AstDB в качестве ключа с любым значением в ветку <ИМЯ_ОЧЕРЕДИ>_ALLOW_DIRECT. Ниже, прямой прозвон на опероаторов очереди 700 будет разрешён для номеров 150 и 160.

asterisk -rx "database put 700_ALLOW_DIRECT 150 1"
asterisk -rx "database put 700_ALLOW_DIRECT 160 1"

Сценарий реализован, можно приступать к тестированию.

 

Реализация сценария для двух и более серверов Asterisk


Если требуется реализовать описываемый сценарий на нескольких серверах Asterisk, связанных друг с другом SIP-соединениями, описанные выше настройки нужно внести на каждом из серверов. Также, на каждом из серверов нужно создать все очереди, для которых требуется реализовывать описываемый сценарий, с одинаковым набором операторов.
Состояние переменной-флага будет передаваться в пользовательском заголовке SIP X-Asterisk-Redirected-To, его добавление и обработка уже реализованы в контексте sub-redirect-to-queue, дополнительных действий не требуется.
Если используется IAX2, а не SIP, для передачи состояния переменной-флага можно использовать функцию IAXVAR (не будет рассмотрено в рамаках данной статьи).

 

asterisk, sip, FreePBX, Channel, внутренние номера, callerid