Найти тему
Олег Тимашевский

Asterisk PBX. Авто чёрный список

Оглавление

..

Сегодня будем делать автоматический чёрный список в Asterisk PBX. Смысл заключается в том чтобы при наборе короткого внутреннего номера последний вызывающий абонентский номер был автоматически добавлен в чёрный список. Как его оттуда убрать будет реализовано отдельно. В чёрный список может быть добавлен как внутренний номер так и внешний, городской или мобильный.

Например, если вам позвонили с рекламного номера и предлагают взять кредит в банке или звонят назойливые операторы с Ростелекома и настойчиво уговаривают подключиться, то после разъединения набором короткого номера "780" это номер автоматически улетает в чёрный список и больше они до вас не дозвонятся, причём на любой внутренний номер. Опция очень удобная и полезная.

Asterisk PBX это современная безплатная программная телефонная станция с открытым исходным кодом малой и средней ёмкости, ориентированная на использование в офисе и в абонентском доступе на периферии. "Asterisk - будущее телефонии". Asterisk PBX устанавливается как служба в Linux в т.ч. Linux Ubuntu и при наличии соответствующего оборудования позволяет организовывать связь как внутри учреждения так и входящую-исходящую связь с "внешним миром", как посредством традиционных двухпроводных абонентских линий и цифровых ISDN линий так и через IP сеть т.е. через интернет.
Большинство настроек подходят под все версии Asterisk PBX. Например, публикуемые здесь настройки и конфигурации подходят как к Asterisk PBX версий 1.6/1.8 так и для всех версий вплоть до 18й, которую я использую, скорее всего подойдёт и для 20й.

Плюсом ко всему номера из чёрного списка будем направлять на виртуальный внутренний номер "779", в котором будут подаваться акустические сигналы контроля посылки вызова, т.е. гудки, так что отбитые абоненты из чёрного списка будут думать что идёт вызов и ни о чём не догадаются.

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

Стоит отменить что входящий вызов заворачивается непосредственно перед началом вызова конкретного внутреннего номера, независимо где он ранее проторчал, в голосовом меню, в очереди вызово или ещё где-либо.

-2

Как изображено на скриншоте выше, в качестве данных в этой базе используются ключи, которые группируются в семейства ключей. В данном случае семейство будет называться "blacklist", в качестве имён ключей будут выступать телефонные номера в формате E.164 в чёрном списке (см. скриншот выше). В качестве значений ключей будет установлен признак присутствия данного номера в чёрном списке: "1" - присутствует, "0" - нет. Это позволит для удаления номера из чёрного списка поменять "1" на "0" без удаления самого ключа и отследить был ли когда-нибудь номер в чёрном списке.

Далее, для реализации автоматического чёрного списка далее будем настраивать только диалплан (номерной план) в файле "/etc/asterisk/extensions.conf", и только его внутренний контекст "loc". Больше ничего трогать не надо.

..

НАСТРОЙКА ДИАЛПЛАНА

..

Для начала добавим два виртуальных внутренних номера затычки "778" и "779". При звонке или при перенаправлении вызова на "778" будут в трубку подаваться сигналы "занято", а при перенаправлении вызова на "779" он будет отвечен и в трубке будут слышны гудки вызова, как будто идёт соединение, - то что надо.

exten => 778,1,Answer()
exten => 778,n,PlayTones(busy)
exten => 778,n,Wait(60)
exten => 778,n,Hangup()

exten => 779,1,Answer()
exten => 779,n,PlayTones(ring)
exten => 779,n,Wait(60)
exten => 779,n,Hangup()

Теперь добавляем внутренний виртуальный номер "780". Здесь приложением "Set" добавляется номер в чёрный список. Он берётся из сохранённого последнего вызывающего, например, из "102/last_clrid".

exten => 780,1,Answer()
exten => 780,n,Playback(/var/lib/asterisk/sounds/en/beep)
exten => 780,n,Set(DB(blacklist/${DB(${CALLERID(num)}/last_clrid)})=1)
exten => 780,n,Hangup()

Если набрать "780", то последний входящий телефонный номер будет добавлен в чёрный список. Для уведомления добавил короткой звуковой сигнал "биппер", соответствующий звуковой файл есть в стандартном наборе Asterisk PBX.

Добавление в чёрный список внутреннего номера "102"
Добавление в чёрный список внутреннего номера "102"

Осталось подправить часть диалплана с вызовами на внутренние номера.

exten => _1XX,1,Set(DB(${EXTEN}/last_clrid)=${CALLERID(num)})
exten => _1XX,n,GotoIf($[${DB(blacklist/${CALLERID(num)})} = 1]?loc,779,1)
exten => _1XX,n,Dial(SIP/${EXTEN},60,tTL(3600000)M(on-answer,${CALLERID(num)},${EXTEN}))
exten => _1XX,n,GotoIf($[${DIALSTATUS} = ANSWER],loc,778,1)
exten => _1XX,n,Hangup()

Здесь вначале сохраняется последний вызывающий телефонный номер, в любом случае, далее проверяется если этот вызывающий номер в чёрном списке, то вызов заворачивается на "779" и "Dial" на внутренний номер не проходит.

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

-4

Полный внутренний контекст получился следующий.

[loc]

exten => _1XX,1,Set(DB(${EXTEN}/last_clrid)=${CALLERID(num)})
exten => _1XX,n,GotoIf($[${DB(blacklist/${CALLERID(num)})} = 1]?loc,779,1)
exten => _1XX,n,Dial(SIP/${EXTEN},60,tTL(3600000)M(on-answer,${CALLERID(num)},${EXTEN}))
exten => _1XX,n,GotoIf($[${DIALSTATUS} = ANSWER],loc,778,1)
exten => _1XX,n,Hangup()

exten => 777,1,Answer()
exten => 777,n,Set(clrid=${CALLERID(num)})
exten => 777,n,Playback(/var/lib/asterisk/moh/mmq_nfg)
exten => 777,n,Hangup()

exten => 778,1,Answer()
exten => 778,n,PlayTones(busy)
exten => 778,n,Wait(60)
exten => 778,n,Hangup()

exten => 779,1,Answer()
exten => 779,n,PlayTones(ring)
exten => 779,n,Wait(60)
exten => 779,n,Hangup()

exten => 780,1,Answer()
exten => 780,n,Playback(/var/lib/asterisk/sounds/en/beep)
exten => 780,n,Set(DB(blacklist/${DB(${CALLERID(num)}/last_clrid)})=1)
exten => 780,n,Hangup()

exten => _8XXXXXXXXXX,1,Answer()
exten => _8XXXXXXXXXX,2(outr),PlayTones(search)
exten => _8XXXXXXXXXX,n,Wait(2)
exten => _8XXXXXXXXXX,n,StopPlayTones()
exten => _8XXXXXXXXXX,n,Dial(SIP/T1/${EXTEN},60,L(3600000))
exten => _8XXXXXXXXXX,n,Set(DS=${DIALSTATUS})
exten => _8XXXXXXXXXX,n,GotoIf($[${DS} = BUSY]?outr)
exten => _8XXXXXXXXXX,n,GotoIf($[${DS} = CONGESTION]?outr)
exten => _8XXXXXXXXXX,n,GotoIf($[${DS} = CHANUNAVAIL]?outr)
exten => _8XXXXXXXXXX,n,PlayTones(busy)
exten => _8XXXXXXXXXX,n,Wait(60)
exten => _8XXXXXXXXXX,n,Hangup()

exten => h,1,NoOp()
exten => h,n,PlayTones(busy)
exten => h,n,Wait(60)
exten => h,n,Hangup()

exten => _X.,1,Hangup()

А Полный рабочий конфиг "extensions.conf" можно скачать по ссылке в скобках (https://disk.yandex.ru/d/Vp_kfckU8yGXbQ).

..

ДОБАВЛЕНИЕ НОМЕРОВ В ЧЁРНЫЙ СПИСОК ВРУЧНУЮ

..

Для этого выполняем команду в консоли.

sudo asterisk -rx "database put blacklist <тел. номер> 1"

Это показано на скриншоте ниже.

-5

Для того чтобы удалить номер из чёрного списка выполняем команду.

sudo asterisk -rx "database put blacklist <тел. номер> 0"

Для полного удаления чёрного списка можно воспользоваться следующей командой.

sudo asterisk -rx "database deltree blacklist"

Тогда наработанный чёрный список будет удалён безвозвратно.

..

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

..

@ Ярошенко О. Ю. 2024