Борьба с сусликами-партизанами тяжелыми средствами. Mikrotik, Asterisk и fail2ban..БАБАХ!!!!

Суслики-партизаны засевшие на просторах интернета, усиливают диверсии на VoIP коммуникации. Один из менеджеров компании МТС, в ответе на вопрос клиента - «что делать ? У нас на 400 килорублей наговорили», ответил - «Всего-то? Это маленькая сумма...». Поэтому не теряйте бдительности товарищи! Партизаны не дремлют!  Спасибо нашему фанату-эксперту по Микротикам Виталию, прислал мне интересную ссылку на сайт микротика со статьей про связку Микротик-fail2ban. Статья на английском, я как мог ее попытался понять, перевести и применить в качестве тяжелой артиллерии. Кроме того что кое-что не дописано, похоже в оригинал вкралась ошибка, потому что блокировать надо исходный адрес, а не адрес назначения. Привожу строку:
mikrotik ":ip firewall filter add action=drop chain=forward dst-address=<ip> comment=AutoFail2ban-<ip>"

Получается, что при форварде пакетов с адреса суслика на адрес вашего астера, допустим 192.168.1.10, не будет генерироваться правило на проход к Астериску. Будут баниться форварды от Астериска к суслику. Мне кажется не правильным такое правило :

chain=forward action=drop dst-address=95.138.162.150

Должно быть как-то так :

chain=forward action=drop src-address=95.138.162.150

Поэтому в файлике я подправил :

mikrotik ":ip firewall filter add action=drop chain=forward src-address=<ip> comment=AutoFail2ban-<ip>"

Результат — Суслики попадают в капкан. Штуки по 4 в час.

А теперь на корявом русском языке, мануал (как я его понял :) ) и небольшие исправления и допиливания.

1) Берем линуксовую машину где крутится Астер и Fail2Ban . На ней от имени пользователя под которым запускается Fail2Ban (обычно root) генерируем ключи для ssh.

$ ssh-keygen -t dsa

Generating public/private dsa key pair.

Enter file in which to save the key (/root/.ssh/id_dsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_dsa.

Your public key has been saved in /root/.ssh/id_dsa.pub.

The key fingerprint is:

b8:ea:79:ad:61:c4:e0:1a:66:46:5b:0e:70:b6:aa:38 Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.

The key's randomart image is:

+--[ DSA 1024]----+

+---------+

В итоге хрум-хрума, готов ключег. Внимание!!!! При генерации не вводите ключевую фразу (Enter passphrase (empty for no passphrase):) !!!!

Публичный ключег переносим на микротик

scp -P 22 (или какой вы ему ssh задали) ~/.ssh/id_dsa.pub Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. .1.1:/

2)На нашем любимом монстре — Микротике, производим действия:

[admin@mikrotik] > user add address=LINUX-SERVER-IP-ADDRESS (типа 192.168.1.10) group=full

[admin@mikrotik]> user ssh-keys import public-key-file=id_dsa.pub user=linux

если не ругнулось — значит всосался ключег. Орудия расчехлили, дрожите суслики!

3)проводим настройку линуксовой машины. Создаем файлик, который будет запихивать правила в Микротик по ssh.

nano /usr/bin/mikrotik вписываем туда:

#!/bin/bash

ssh -l linux -p22 -i /root/.ssh/id_dsa MIKROTIK-IP-ADDRESS "$1"

Соответственно не забываем сделать его исполняемым - chmod 0755 /usr/bin/mikrotik

для fail2ban создаем - nano /etc/fail2ban/action.d/mikrotik.conf и впихиваем туда :

# Fail2Ban configuration file
#
# Author: Ludwig Markosyan
# Release 09/02/2013
#
# $Version: 1.0 BETA $
#

[Definition]

# Option:  actionstart
# Notes.:  command executed once at the start of Fail2Ban.
# Values:  CMD
#
actionstart =


# Option:  actionstop
# Notes.:  command executed once at the end of Fail2Ban
# Values:  CMD
#
actionstop =


# Option:  actioncheck
# Notes.:  command executed once before each actionban command
# Values:  CMD
#
actioncheck =


# Option:  actionban
# Notes.:  command executed when banning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    <ip>  IP address типа сюда попадет адрес Суслика-партизана
#          <failures>  number of failures
#          <time>  unix timestamp of the ban time
# Values:  CMD
# Именно SRC !!!! Банить трафик от сусликов, а не к сусликам !!!
# и еще очень важно !!!! посмотрите номер правила FORWARD к вашему астериску !!!
# Что-бы правила работали, они должны быть ПЕРЕД ним!!!
actionban = mikrotik ":ip firewall filter add action=drop chain=forward src-address=<ip>  place-before=<Вставьте сюда номер форварда перед которым вставлять>  comment=AutoFail2ban-<ip>"


# Option:  actionunban
# Notes.:  command executed when unbanning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    <ip>  IP address
#          <failures>  number of failures
#          <time>  unix timestamp of the ban time
# Values:  CMD
#

actionunban =  mikrotik ":ip firewall filter remove [:ip firewall filter find comment=AutoFail2ban-<ip>]"

Повторюсь,очень важно !!!! посмотрите номер правила FORWARD к вашему астериску !!! Что-бы правила работали, они должны быть ПЕРЕД ним!!! Иначе до них просто не дойдет.

Правим nano /etc/fail2ban/jail.conf

Я тут тоже обнаглел и сделал по своему. Учитывая, что подключая сейчас VoIP без защиты, ощущения как в публичном доме без презерватива, я решил подстраховаться.
Защита двойная, на случай сброса или перепрошивки Микротика (список пропадает).

[ASTERISK]
enabled = true
filter = asterisk
### дальше все порты с iax по sip . Одна строка — генерит правила для iptables
#### на линухе, вторая запускает файлик микротик которому автоматом передает
#### адрес суслика и БАНИТ ГАДА в Микротике!!!!
action = iptables-multiport[name=aster-full, port=4000:5090, protocol=udp]  
mikrotik
logpath = /var/log/asterisk/messages.newmail
maxretry = 4
bantime = 260000   ### причем банит НАДОЛГО !!!!
ignoreip = 127.0.0.1  

 

загляните еще в asterisk.conf. У мнея он выглядел вот так :

# Fail2Ban configuration file
#
# Author: Xavier Devlamynck
#
# $Revision$
#


[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf

[Definition]

# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>\S+)
# Values:  TEXT
#
failregex = NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Wrong password
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - No matching peer found
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - No matching peer found
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Username/auth name mismatch
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Device does not match ACL
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Peer is not supposed to register
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - ACL error (permit/deny)
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Device does not match ACL
NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>:.*' - No matching peer found
NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>:.*' - Wrong password
NOTICE.* <HOST> failed to authenticate as '.*'$
NOTICE.* .*: No registration for peer '.*' \(from <HOST>\)
NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
NOTICE.* .*: Failed to authenticate user .*@<HOST>.*
NOTICE.* .*: <HOST> failed to authenticate as '.*'
NOTICE.* .*: <HOST> tried  to authenticate with nonexistent user '.*'
VERBOSE.*SIP/<HOST>-.*Received incoming SIP connection from unknown peer
###        NOTICE.* .*: Sending fake auth rejection for device.* \(<HOST>:.*\)
NOTICE.* .*: Sending fake auth rejection for device .*\<sip:.*\@.*\>;tag=.* \(<HOST>:.*\)



# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =



Вот собственно и все. Далее рестарт fail2ban и вперед.
/etc/init.d/fail2ban restart

Проверить надежность презерватива нашей защиты можно установив утилитку sipsak. Пошлем нашему серверу дурацкий запрос на авторизацию :
sipsak  -U  -s sip:Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. :5060
после это IP вашей машины будет забанен в правилах f2b на сервере Астериска и тут же выскочит дополнительное правило жестоко гасить ваш адрес в файрволе Mikrotika при обращении через него на сервак Астериск.

Ну теперь собственно, орудия заряжены, наведены... По Сусликам-Партизанам... ОГОНЬ!!!!

Маленькие хитрости по просьбам трудящихся :)

Тут есть еще маленькая, но очень полезная хитрость. После того как попробовали и это заработало, нас будут утомлять правила, сотнями генерирующиеся в фильтрах.
Как правильно заметил коллега Владимир - "зачем плодить новые правила? По мне так лучше добавить этот ip в список по имени, который блочится.". Поэтому модернизируем правила в mikrotik.conf :

actionban = mikrotik ":ip firewall address-list add address=<ip> list=AsteriskSuperBanList"
actionunban =  mikrotik ":ip firewall address-list remove  [:ip firewall address-list find address=<ip>]"

в микротике пишем правило в фильтрах
/ip firewall filter
add action=drop chain=input in-interface=<ВАШ WAN> protocol=udp \
    src-address-list=AsteriskSuperBanList

по умолчанию банит на сутки. только очень голодный суслик будет столько ждать. Со списком удобнее работать. Легче найти ошибочный бан. И еще совет перед этим правилом сделайте Белый Лист. Типа такого :

/ip firewall filter
add action=drop chain=input src-address-list=AsteriskSuperBanList

 

add action=add-src-to-address-list address-list=AsteriskBanList chain=input \
    comment="Suslik Block" disabled=no dst-port=4000-5090 in-interface=<WAN-порт>\
    protocol=udp src-address-list=!asterisk-my-enable


add action=drop chain=forward comment="Suslik Block" dst-port=4000-5090 \
    in-interface=<WAN-порт> protocol=udp src-address-list=!asterisk-my-enable

В лист "asterisk-my-enable" вносим провайдеров и прочих сип клиентов которые точно "наши".