artem
18.11.2016
3983

Реализация независимых чёрных списков в 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.

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование


ближайшие курсы

ближайшие Вебинары

ONLINE

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

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

Гибкий в настройке.

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

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

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

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.