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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Реализация независимых чёрных списков в Asterisk

База знаний Настройка Asterisk
В Asterisk есть встроенный чёрный список, реализованный с помощью функции BLACKLIST, эта функция просто проверяет, есть ли CALLERID(num) текущего канала в ветке AstDB blacklist. Как видите, с помощью функции BLACKLIST можно без проблем реализовать только один чёрный список. В этой статье будет описана реализация произвольного количества независимых чёрных списков в Asterisk.

Подготовка контекстов


Для реализации чёрных списков нужно написать несколько служебных контекстов.

Контекст для добавления номера в чёрный список

Контекст принимает три аргумента:
ARG1 - номер, который нужно добавить в чёрный список (это единственный обязательный аргумент).
ARG2 - номер чёрного списка. Номер, указанный в ARG1 будет добавлен в ветку AstDB custom_blacklist_${ARG2} (если ARG2 не указать, номер будет добавлен в ветку custom_blacklist_0).
ARG3 - время в часах, через которое номер будет удалён из чёрного списка (необязательный аргумент, если не указать его, номер будет добавлен в чёрный список навсегда).

[sub-blacklist-add]
exten => s,1,GotoIf($["${ARG1}" = ""]?end)
same => n,Set(BL_INDEX=${ARG2})
same => n,ExecIf($["${BL_INDEX}" = ""]?Set(BL_INDEX=0))
same => n,Set(BL_TREE=custom_blacklist_${BL_INDEX})
same => n,Set(DB(${BL_TREE}/${ARG1}/timestamp)=${EPOCH})
same => n,GotoIf($[${REGEX("^[0-9]+$" ${ARG3})} = 0]?end)
same => n,Set(BL_EXPIRES=$[${ARG3} * 3600])
same => n,Set(DB(${BL_TREE}/${ARG1}/expires)=${BL_EXPIRES})
same => n(end),Return

Контекст для удаления номера из чёрного списка

Контекст принимает два аргумента:
ARG1 - номер, который нужно удалить из чёрного списка (обязательный аргумент).
ARG2 - номер чёрного списка. Номер, указанный в ARG1 будет удалён из ветки AstDB custom_blacklist_${ARG2} (если ARG2 не указать, номер будет удалён из ветки custom_blacklist_0).

[sub-blacklist-del]
exten => s,1,GotoIf($["${ARG1}" = ""]?end)
same => n,Set(BL_INDEX=${ARG2})
same => n,ExecIf($["${BL_INDEX}" = ""]?Set(BL_INDEX=0))
same => n,Set(BL_TREE=custom_blacklist_${BL_INDEX})
same => n,DBdeltree(${BL_TREE}/${ARG1})
same => n(end),Return

Контекст для проверки нахождения номера в чёрном списке

Контекст принимает два аргумента:
ARG1 - номер, который нужно проверить на наличие в чёрном списке.
ARG2 - номер чёрного списка. Номер, указанный в ARG1 будет проверен на наличие в ветке AstDB custom_blacklist_${ARG2} (если ARG2 не указать, номер будет проверен на наличие в ветке custom_blacklist_0).
Если номер находится в чёрном списке, значение переменной NUMBER_BLACKLISTED будет иметь значение true после прохождения контекста, в противном случае значение переменной NUMBER_BLACKLISTED будет пустым. Также этот контекст удаляет из чёрного списка проверяемый номер, если время нахождения номера в чёрном списке истекло.

[sub-blacklist-check]
exten => s,1,Set(NUMBER_BLACKLISTED=)
same => n,GotoIf($["${ARG1}" = ""]?end)
same => n,Set(BL_INDEX=${ARG2})
same => n,ExecIf($["${BL_INDEX}" = ""]?Set(BL_INDEX=0))
same => n,Set(BL_TREE=custom_blacklist_${BL_INDEX})
same => n,GotoIf($[${DB_EXISTS(${BL_TREE}/${ARG1}/timestamp)} = 0]?end)
same => n,Set(NUMBER_BLACKLISTED=true)
same => n,Set(BL_TIMESTAMP=${DB(${BL_TREE}/${ARG1}/timestamp)})
same => n,GotoIf($[${DB_EXISTS(${BL_TREE}/${ARG1}/expires)} = 0]?end)
same => n,Set(BL_EXPIRES=$[${BL_TIMESTAMP} + ${DB(${BL_TREE}/${ARG1}/expires)}])
same => n,GotoIf($[${EPOCH} < ${BL_EXPIRES}]?end)
same => n,Set(NUMBER_BLACKLISTED=)
same => n,DBdeltree(${BL_TREE}/${ARG1})
same => n(end),Return

Сервисные коды для добавления номера в чёрный список и удаления номера из чёрного списка

[fc-blacklist-number]
exten => _*30ZX.,1,Set(NUMBER_TO_BL=${EXTEN:4})
same => n,Set(INDEX_BL=${EXTEN:3:1})
same => n,Gosub(sub-blacklist-add,s,1(${NUMBER_TO_BL},${INDEX_BL}))
same => n,Answer
same => n,Wait(0.2)
same => n,Playback(beep)
same => n,Wait(0.2)
same => n,Hangup

[fc-unblacklist-number]
exten => _*31ZX.,1,Set(NUMBER_TO_UNBL=${EXTEN:4})
same => n,Set(INDEX_BL=${EXTEN:3:1})
same => n,Gosub(sub-blacklist-del,s,1(${NUMBER_TO_UNBL},${INDEX_BL}))
same => n,Answer
same => n,Wait(0.2)
same => n,Playback(beep)
same => n,Wait(0.2)
same => n,Hangup

Для добавления номера в чёрный список, нужно сделать вызов на номер *30<номер_чс><номер> (<номер> будет добавлен в чёрный список с номером <номер_чс>).
Для удаления номера из чёрного списка, нужно сделать вызов на номер *31<номер_чс><номер> (<номер> будет удалён из чёрного списка с номером <номер_чс>).

Пример использования чёрных списков

Далее приведён пример использования контекстов, описанных выше.

[internal]
;...
include => fc-blacklist-number
include => fc-unblacklist-number
exten => _*40X.,1,Set(NUMBER_TO_BL=${EXTEN:3})
same => n,Gosub(sub-blacklist-add,s,1(${NUMBER_TO_BL},1))
same => n,Gosub(sub-blacklist-add,s,1(${NUMBER_TO_BL},2))
same => n,Gosub(sub-blacklist-add,s,1(${NUMBER_TO_BL},3))
same => n,Answer
same => n,Wait(0.2)
same => n,Playback(beep)
same => n,Wait(0.2)
same => n,Hangup
;...
[blacklist-dst]
exten => s,1,Ringing
same => n,Wait(5)
same => n,Busy(5)
[provider-1]
exten => _X.,1,Gosub(sub-blacklist-check,s,1(${CALLERID(num)},1))
same => n,GotoIf($["${NUMBER_BLACKLISTED}" = ""]?internal,601,1)
same => n,Goto(blacklist-dst,s,1)
[provider-2]
exten => _X.,1,Gosub(sub-blacklist-check,s,1(${CALLERID(num)},2))
same => n,GotoIf($["${NUMBER_BLACKLISTED}" = ""]?internal,602,1)
same => n,Goto(blacklist-dst,s,1)
[provider-3]
exten => _X.,1,Gosub(sub-blacklist-check,s,1(${CALLERID(num)},3))
same => n,GotoIf($["${NUMBER_BLACKLISTED}" = ""]?internal,603,1)
same => n,Goto(blacklist-dst,s,1)

provider-1, provider-2, provider-3 - контексты для входящих вызовов через трёх разных провайдеров телефонии, при входящем вызове номер звонящего проверяется по чёрным спискам номер 1, 2 и 3 соответственно.
internal - контекст для внутренних вызовов, в него включены контексты с сервисными кодами для управления чёрными списками. Также для удобства добавлен сервисный код *40 для добавления номера во все три чёрных списка.

Приведение номера звонящего к общему виду

Для эффективного использования чёрных списков (и просто для удобства ваших пользователей) рекомендуется привести номер звонящего к общему виду. Делается это для того, чтобы Вам не пришлось добавлять в чёрные списки один номер со всеми префиксами, с которыми его могут передать различные провайдеры (например, один провайдер передаёт А-номер 81112223333, другой провайдер передаёт 71112223333, третий провайдер передаёт +71112223333). Для приведения А-номера к общему виду можно использовать следующий контекст (он приведёт все три номера к виду 81112223333):

[sub-fix-cid]
exten => s,1,GotoIf($[${REGEX("^[78]?[2-9][0-9]{9}$" ${CALLERID(num)})} | ${REGEX("^\\+?7[2-9][0-9]{9}$" ${CALLERID(num)})}]?fix_cid:end)
same => n(fix_cid),Set(CALLERID(num)=8${CALLERID(num):-10})
same => n,Set(CALLERID(ANI-num)=${CALLERID(num)})
same => n(end),Return()

В примере выше для приведения номера звонящего к общему виду, нужно добавить Gosub в контекст sub-fix-cid до Gosub в контекст sub-blacklist-check.

asterisk, Провайдеры, коды, callerid