Задача: в последнее время, что-то зачастил наш внешний IP адрес попадать в блок листы на том основании что наш почтовый сервер является связующим звеном с некоторым ботнетом. Проверив на наличие заражения сам почтовый сервер посредством утилит rkhunter & clamav — проблем не обнаружено
sudo apt-get install clamav clamav-daemon clamav-freshclam clamfs -y
Удаляю все вирусы в почтовых сообщениях на всем сервере у всех:
sudo clamscan /opt/zimbra/store/ --remove -ri --log=/home/aollo/log_scan.txt
sudo dpkg-reconfigure rkhunter
sudo rkhunter --versioncheck
sudo rkhunter --update
sudo rkhunter -c --enable all --disable none
Проверяю, а не занесен ли наш внешний IP адрес в блок листы через ссылку: https://2ip.ru/spam/ и обнаруживаю, что да — spamhaus.org занес его и пока я не удалю его как временная мера в ручном режиме из списков SBL,PBL,XBL почта до некоторых адресатов ходить не будет. Отписка владельцам доменов с просьбой добавить наш адрес в доверенные зоны хоть и может принести положительный эффект не всегда воспринимается системными администраторами как правильная мера учитывая то, что IP адрес значится в распространителях spam‘а, раньше об этом нужно было думать.
А до этого я вроде как нашел скрипт посредством которого можно по многим сервисам в задачи которых входит ведение и определение кто является распространителем spam рассылок проводить проверку. Ниже все действия по скрипту и с чем мне пришлось столкнуться дабы больше с моего внешнего IP адреса через который у меня ходит почта не производилась так называемая SPAM рассылка да и на будущее использование все ниже указанное как нельзя кстати подходит.
Итак в данной заметке участвуют Mikrotik CCR1009-8G-1S-1S+ (все обновления на момент написания данной заметки) и моя рабочая система Ubuntu 12.04.5 Desktop amd64 (Gnome Classic) . Скачиваю RBL список серверов:
ekzorchik@srv-mon:~$ wget http://blog.penumbra.be/files/zabbix/rbl_list.txt
ekzorchik@srv-mon:~$ nano checkhosts
#!/bin/bash
date
# считать содержимое текстового файла
cat /home/ekzorchik/rbl_list.txt | while read output
do
ping -c 1 "$output" > /dev/null
# если $? равен 0 тогда хост доступен в противном случае хост недоступен
if [ $? -eq 0 ]; then
echo "host $output is up"
else
echo "host $output is down"
fi
done
ekzorchik@srv-mon:~$ chmod +x checkhosts
ekzorchik@srv-mon:~$ ./checkhosts
Mon Jun 13 08:33:51 MSK 2016
ping: unknown host b.barracudacentral.org
host b.barracudacentral.org is down
ping: unknown host blackholes.five-ten-sg.com
host blackholes.five-ten-sg.com is down
host blacklist.woody.ch is up
host spamhaus.org is up
ping: unknown host bl.deadbeef.com
host bl.deadbeef.com is down
ping: unknown host bl.emailbasura.org
host bl.emailbasura.org is down
host bl.spamcannibal.org is up
Вот то что мне и нужно было.
ekzorchik@srv-mon:~$ ./checkhosts > hosts.txt
Отсортировать содержимое файла в котором не встречается строки совпадения с шаблоном ‘is down’:
ekzorchik@srv-mon:~$ cat hosts.txt | grep -v 'is down'
Mon Jun 13 09:17:05 MSK 2016
host blacklist.woody.ch is up
host bl.spamcannibal.org is up
host bl.spamcop.net is up
host dnsbl.inps.de is up
host dnsbl.sorbs.net is up
host rbl.interserver.net is up
host rbl.spamlab.com is up
host spamrbl.imp.ch is up
host torserver.tor.dnsbl.sectoor.de is up
host virbl.bit.nl is up
host wormrbl.imp.ch is up
host spamhaus.org is up
Конечная выборка с удаление первой строки (указана текущая дата) и приведение списка только хостов:
ekzorchik@srv-mon:~$ cat hosts.txt | sed -e '1d' | grep -v 'is down' | awk '{print $2}' > rbl_list1.txt
ekzorchik@srv-mon:~$ cat rbl_list1.txt
blacklist.woody.ch
bl.spamcannibal.org
bl.spamcop.net
dnsbl.inps.de
dnsbl.sorbs.net
rbl.interserver.net
rbl.spamlab.com
spamrbl.imp.ch
torserver.tor.dnsbl.sectoor.de
virbl.bit.nl
wormrbl.imp.ch
spamhaus.org
ekzorchik@srv-mon:~$ cat rbl_list1.txt > rbl_list.txt
Ну хоть так проверил. Проще всего так как умеешь и видишь, а не как видится кому-то.
ekzorchik@srv-mon:~$ nano black
#!/bin/bash
RBL="`cat rbl_list.txt`"
W=$( echo ${1} | cut -d. -f1 )
X=$( echo ${1} | cut -d. -f2 )
Y=$( echo ${1} | cut -d. -f3 )
Z=$( echo ${1} | cut -d. -f4 )
STATUS=0
for i in $RBL
do
RESULT=$( host -t a $Z.$Y.$X.$W.$i 2>&1 )
if [ $? -eq 0 ]
then
echo “The IP ADDRESS ${1} is listed at $i:\n$RESULT”
let "STATUS += 1"
fi
echo $RESULT
done
if [ $STATUS -lt 1 ]
then
echo 0
else
echo $STATUS
fi
ekzorchik@srv-mon:~$ chmod +x black
Любое значение выше нуля означает что мой IP адрес (почтаря) в списке:
ekzorchik@srv-mon:~$ ./black
host: ‘….blacklist.woody.ch’ is not a legal name (empty label)
host: ‘….bl.spamcannibal.org’ is not a legal name (empty label)
host: ‘….bl.spamcop.net’ is not a legal name (empty label)
host: ‘….dnsbl.inps.de’ is not a legal name (empty label)
host: ‘….dnsbl.sorbs.net’ is not a legal name (empty label)
host: ‘….rbl.interserver.net’ is not a legal name (empty label)
host: ‘….rbl.spamlab.com’ is not a legal name (empty label)
host: ‘….spamrbl.imp.ch’ is not a legal name (empty label)
host: ‘….torserver.tor.dnsbl.sectoor.de’ is not a legal name (empty label)
host: ‘….virbl.bit.nl’ is not a legal name (empty label)
host: ‘….wormrbl.imp.ch’ is not a legal name (empty label)
host: ‘….spamhaus.org’ is not a legal name (empty label)
host: ‘….spamcop.net’ is not a legal name (empty label)
0
ekzorchik@srv-mon:~$ ./black <EXTERNEL_IP_ADDRESS>
Host <EXTERNEL_IP_ADDRESS>.blacklist.woody.ch not found: 3(NXDOMAIN)
Host <EXTERNEL_IP_ADDRESS>.bl.spamcannibal.org not found: 3(NXDOMAIN)
Host <EXTERNEL_IP_ADDRESS>.bl.spamcop.net not found: 3(NXDOMAIN)
Host <EXTERNEL_IP_ADDRESS>.dnsbl.inps.de not found: 3(NXDOMAIN)
Host <EXTERNEL_IP_ADDRESS>.dnsbl.sorbs.net not found: 3(NXDOMAIN)
Host <EXTERNEL_IP_ADDRESS>.rbl.interserver.net not found: 3(NXDOMAIN)
Host <EXTERNEL_IP_ADDRESS>.rbl.spamlab.com not found: 3(NXDOMAIN)
Host <EXTERNEL_IP_ADDRESS>.spamrbl.imp.ch not found: 3(NXDOMAIN)
Host <EXTERNEL_IP_ADDRESS>.torserver.tor.dnsbl.sectoor.de not found: 3(NXDOMAIN)
Host <EXTERNEL_IP_ADDRESS>.virbl.bit.nl not found: 3(NXDOMAIN)
Host <EXTERNEL_IP_ADDRESS>.wormrbl.imp.ch not found: 3(NXDOMAIN)
“The IP ADDRESS <EXTERNEL_IP_ADDRESS> is listed at spamhaus.org:n<EXTERNEL_IP_ADDRESS>.spamhaus.org is an alias for blocklist.address.is.wrong.spamhaus.org. blocklist.address.is.wrong.spamhaus.org has address 127.0.0.2”
<EXTERNEL_IP_ADDRESS>.spamhaus.org is an alias for blocklist.address.is.wrong.spamhaus.org. blocklist.address.is.wrong.spamhaus.org has address 127.0.0.2
Host <EXTERNEL_IP_ADDRESS>.spamcop.net not found: 3(NXDOMAIN)
1
, где
- 127.0.0.1 — это открытые релеи
- 127.0.0.2 — это источники portscan
якобы я в списке у хоста, проверил по https://www.spamhaus.org/lookup/ да действительно наш внешний адрес почтовика в списке:
Ранее я не сталкивался со spamhaus, а тут немного копнув по найденной информации составил для себя небольшое объяснение. SpamHaus — это в первую очередь некоммерческая организация, которая занимается борьбой со спамом и фишингом. SpamHaus строится на следующих базах данных таких как SBL, XBL, PBL. Содержимое этих баз представляет из себя информацию об IP адресах, доменном имени, задействованных подсетях и email адресах с которых идет спам-рассылка или же была ранее.
- SBL (The Spamhaus Block List) – включает в себя список спамеров и их сервисов. В основе базы лежат IP адреса серверов известных спамеров.
- XBL (The Exploits Block List) – содержит список анонимных прокси-серверов, вирусов, червей, используемых в спам-рассылках и других средств, которые спамеры могут использовать в своих целях.
- PBL (The Policy Block List) – список динамических IP адресов, которым не позволено делать отправку писем напрямую.
Судя по описанию когда вытаскивал свой почтовый сервер из блокировки
мы засветились 13.06.2016 в 08.00 GMT (+/- 30 минут)
This was detected by a TCP/IP connection from <EXTERNEL_IP_ADDRESS> on port 44628 going to IP address 192.42.116.41 (the sinkhole) on port 80.
Получается, что с моего почтового сервера (да и внешнего IP адреса) идет подключение к удаленному хосту образующему botnet сеть.
Начав проверку подконтрольной инфраструктуры ничего примечательно я не нашел, а потому дабы не повторялось последующее приключение в вызволении своего IP адреса из SPAM базы решил на самом Mikrotik сделать правило блокирующее любой контакт с удаленным IP адресом вызывающим подозрительность на хостах следящих за нежелательным/паразитирующим трафиком в интернете.
На Mikrotik — создал правило и пододвинул его в самый верх правил:
winbox — Mikrotik (IP&MAC) — login&pass — IP — Firewall — Add
General:
Chain: forward
Advanced:
Src. Address List: BOTNET
Action:
Action: drop
, где BOTNET это просто будет список всех адресов во вне которые нужно будет блокировать:
winbox — Mkrotik (IP&MAC) — login&pass — IP — Firewall — Address Lists — Add
по такому принципу добавляем и последующие IP адреса, подсети которые нужно блокировать:
[admin@Router] >> ip firewall filter print
2 ;;; Drop all botnet ip address incoming
chain=forward action=drop src-address-list=BOTNET log=no log-prefix=””
Теперь никакие запросы от нас не пройдут до этого адреса:
aollo@mail:~$ 240 → это у меня настроенный алиас на подключение к почтовому серверу по коротком имени.
Проверяю с почтового сервера возможность достучаться до ресурса обнаруженного в отчете почему меня заблокировали в SPAMHAUS
aollo@mail:~$ ping 192.42.116.41
PING 192.42.116.41 (192.42.116.41) 56(84) bytes of data.
^C
— 192.42.116.41 ping statistics —
14 packets transmitted, 0 received, 100% packet loss, time 13102ms
aollo@mail:~$ telnet 192.42.116.41 80
Trying 192.42.116.41…
Connected to 192.42.116.41.
Escape character is ‘^]’.
]
Connection closed by foreign host.
Из вывода понятно, что пакеты не проходят это мне и нужно было. Теперь если вдруг какой-либо IP адрес засветиться, как ресурс пытающихся блокировать мою работу он попадет в список BOTNET да и все исходящие соединение не пройдут на этот адрес. Вот так вот, начиная казалось бы с одной задачи по отслеживанию наличия себя в SPAM-базах, а в итоге на основе отчета сделал обычное правило для блокировки нежелательного подключения. Что мне и требовалось. На этом я прощаюсь и до новых заметок, с уважением автор блога — ekzorchik.