Боремся со спамом с помощью Asterisk
Сегодня мне на мобильный позвонили очередные спамеры-мошенники и я серьёзно задумался о том, чтобы избавиться от них насовсем, так как их подход становится всё агрессивнее и агрессивнее от месяца к месяцу. К тому же давно хотел получать голосовую почту в telegram и желания совпали с необходимостью. Я пользуюсь Мегафоном, так что я «стёр пыль» с услуги Мультифон, прикупил VPS на Ubuntu и сел писать скрипты для Asterisk. И так, если вам интересно пострить автоотбивку для спамеров а заодно и принимать голосовую почту в telegram, приветствую.
Почему именно Asterisk, ведь есть куча приложений на телефон? Потому что asterisk может поднять трубку и проговорить «Номер абонента больше не используется» или включить что нибудь более особенное спамеру, а это значит что спамер заплатит за этот звонок, а вы нет. Потому что входящие бесплатны. Так же это позволит вообще не подходить к телефону при звонках спамеров, а только читать в ленте сообщений от телеграм бота что были спам звонки.
Я пользуюсь Мегафоном, поэтому SIP шлюз у меня есть как услуга. Тем не менее вы можете использовать нижеописанный метод для любого оператора, предварительно изменив шаги таким образом, что бы они соответствовали вашей ситуации. Я так же не буду описывать покупку VPS так как тут вопрос на усмотрение каждого. Лишь скажу что рекомендую покупать поближе к точке терминации оборудования провайдера. В моём случае это Москва.
ВАЖНО! Нулевым шагом мы настроим iptables. Важно хотя бы примерно понимать что означают те или иные команды. Так же я напоминаю что при первом входе необходимо сменить пароль системного пользователя на максимально сложный, или в идеальном случае сделать вход на сервер только по ключам, так как если злоумышеник получит доступ к серверу телефонии он сможет бесконтрольно звонить с вашего номера.
Шаг 0. «Усиливаем безопасноть».
Этот шаг исходит из того что на сервере нет ничего кроме asterisk. Если есть ещё что-то то вам придётся исправить правила iptables под свой случай. Итак, установим iptables-persistent и fail2ban
apt install iptables-persistent fail2ban
Далее создадим два файла:
/etc/iptables/rules.v4
# Generated by ip6tables-save v1.6.0 on Thu Sep 8 13:29:11 2016
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
#Лучше не блокировать icmp вообще так как получится blackhole, что не очень хорошо, а просто уменьшить доступную пропускную способность для icmp пакетов
-A INPUT -p icmp -m limit --limit 15/sec -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#Multifon SBC
-A INPUT -s 193.201.229.35/32 -p udp -m udp --dport 5060 -j ACCEPT
#Multifon Media Gateway
-A INPUT -s 193.201.229.19/32 -p udp -m udp --dport 10000:10100 -j ACCEPT
#SSH
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT
/etc/iptables/rules.v6
# Generated by iptables-save v1.6.0 on Thu Sep 8 13:29:11 2016
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
#BASE INPUT
-A INPUT -i lo -j ACCEPT
-A INPUT -p ipv6-icmp -m limit --limit 15/sec -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#DROP ALL ANOTHER
-A INPUT -j REJECT --reject-with icmp6-port-unreachable
COMMIT
И настроим fail2ban, а именно проверим что в /etc/fail2ban/jail.d/defaults-debian.conf включено:
[sshd]
enabled = true
Так же можно увеличить время бана на 24 часа в /etc/fail2ban/jail.conf:
bantime = 24h
Вообще очень рекомендую сделать rsa ключ и ходить только по нему выставив «PasswordAuthentication no» в /etc/ssh/sshd_config, но если такой возможности нет поставьте по настоящему сильный пароль (20 символов со спецзнаками, цифрами, большими и малыми буквами) и лучше не root’у а какому то пользователю с привилегиями sudo а root’а заблокируйте через «passwd -l».
Теперь когда всё готово включим демон fail2ban и загрузим правила iptables:
systemctl enable --now fail2ban
iptables-restore < /etc/iptables/rules.v4
ip6tables-restore < /etc/iptabes/rules.v6
Затем рекомендую отключиться от SSH и подключиться снова что бы проверить что всё работает корректно.
Шаг 1. «Настройка Asterisk»
Теперь когда настройка безопасности завершена поставим asterisk:
apt install asterisk asterisk-config asterisk-core-sounds-en asterisk-core-sounds-en-g722 asterisk-core-sounds-en-gsm asterisk-core-sounds-en-wav asterisk-core-sounds-ru asterisk-core-sounds-ru-g722 asterisk-core-sounds-ru-gsm asterisk-core-sounds-ru-wav asterisk-voicemail
И приступим к его настройке:
cd /etc/asterisk
Далее в asterisk.conf:
defaultlanguage = ru ; Default language
documentation_language = ru_RU ; Set the language you want documentation
Выключим лишние модули в modules.conf:
[modules]
autoload=no
load => chan_sip.so
load => res_rtp_asterisk.so
load => app_dial.so
load => bridge_simple.so
load => app_playback.so
load => app_voicemail.so
load => cdr_csv.so
load => res_musiconhold.so
load => res_adsi.so
load => pbx_config.so
load => codec_a_mu.so
load => codec_adpcm.so
load => codec_alaw.so
load => codec_ulaw.so
load => codec_gsm.so
load => codec_lpc10.so
load => func_shell.so
load => func_callerid.so
load => format_wav.so
load => func_cut.so
load => res_sorcery_config.so
load => res_pjproject.so
[global]
В rtp.conf настроим количество портов для голосового трафика:
rtpstart=10000
rtpend=10100
Не думаю что понадобится больше 100 параллельных вызовов.
Далее перейдём в sip.conf (замените $phone_number и $password на свои)
[general]
context=public
allowguest=no
allowoverlap=no
realm=asterisk.local
udpbindaddr=0.0.0.0
tcpenable=no
transport=udp
[multifon]
username = $phone_number
type = peer
secret = $password
host = sbc.megafon.ru
port = 5060
insecure = invite
trustrpid=yes
callbackextension = $phone_number
fromuser = $phone_number
fromdomain = sbc.megafon.ru
context = from-sip
disallow = all
allow = alaw
nat = no
directmedia = no
dtmfmode = inband
language = ru
Я так же хотел принимать сообщения атвоответчика в telegram, раз уж я всё равно получаю звонки на asterisk, поэтому мне понадобилось установить
apt install dos2unix lame sox
и настроить voicemail.conf (замените $voicemail_password и $tg_client_id на свои):
[general]
#format=wav49|gsm|wav
format=wav
serveremail=asterisk@voice.local
attach=yes
#maxmsg=180
#maxsecs=180
#minsecs=4
#maxlogins=1
emaildateformat=%A, %d %B %Y at %H:%M:%S
emailbody=XTGMESSAGE_ ${VM_CALLERID} _ ${VM_DATE}
mailcmd=/usr/local/sbin/telegrammp3
sendvoicemail=no
[zonemessages]
eastern=America/New_York|'vm-received' Q 'digits/at' Imp
central=America/Chicago|'vm-received' Q 'digits/at' Imp
central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours'
military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p'
european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM
[voicemail]
1 => $voicemail_password,homegroup,$tg_client_id,delete=yes
А теперь перейдём к диалплану extensions.conf (все $phone_number надо заменить на свой номер телефона):
[incoming]
exten => $(phone_number)1,1,Playback(/usr/share/asterisk/sounds/ru_RU/ss-noservice)
same => n,Hangup()
exten => $phone_number,1,ringing
same => n,wait(30)
same => n,Voicemail(1@voicemail,u)
same => n,Hangup()
exten => $(phone_number)0,1,ringing
same => n,wait(30)
same => n,Voicemail(1@voicemail,u)
same => n,Hangup()
[curlblacklist]
exten => _X.,1,Goto(incoming,${EXTEN}${SHELL(/usr/local/sbin/spamn.sh ${CALLERID(num)} ${EXTEN} | tr -d "\n")},1)
same => n,Hangup()
[from-sip]
exten => $phone_number,1,Goto(curlblacklist,${CUT(CUT(SIP_HEADER(To),@,1),:,2)},1)
same => n,Hangup()
При желании можно завести своих родственников на тот же самый Asterisk, для этого надо сделать запись по аналогии с [multifon] в sip.conf и продублировать все записи с $phone_number в extensions.conf.
Шаг 2. «Распаковка скриптов»
Нам понадоится установить curl и git
apt install curl git
Затем скачаем скрипты:
git clone https://github.com/lifespirit/asterisk-scripts.git
и переместим их в рабочую папку:
cp asterisk-scripts/spamn.sh /usr/local/sbin/
cp asterisk-scripts/telegrammp3 /usr/local/sbin/
chmod +x /usr/local/sbin/spamn.sh
chmod +x /usr/local/sbin/stelegrammp3
Далее необходимо ввести данные своего телеграм бота если вы хотите получать уведомления о звонках и голосовую почту в телеграм. Инструкции как создать телеграм бота можно найти в документации telegram и тут я это пропущу. В обоих скриптах нужно порпавить две переменных:
botid=bot111222333
botkey=AAssddffgghhjjkkllqqwwweerrttyyuuiioozxc
а также в скрипте spamn.sh нужно заменить
chatid="444555666"
на id своего аккаунта или чат группы.
Осталось только переключить роутинг услуги Мультифон на sip+gsm режим, что бы если это спам или телефон долго не отвечает трубку снимал asterisk, а если всё нормально трубку можно было снять с мобильного телефона. Сделать это можно например с помощью API:
curl -s 'https://sm.megafon.ru/sm/client/routing?login=71112223344&password=mysecret&routing=2'
На этом настройка завершена. Приятного использования.