ipset-blacklist – най бързата и ефективна блеклиста в Debian/Ubuntu

Скрипт, блокирващ огромен брой IP адреси от публични “блеклисти”

ipset-blacklist е скрипт написан на Bash shell от Trick77, който използва ipset и iptables, за да блокира голям брой IP адреси, публикувани в публичните достъпни черни списъци в Интернет blacklist’s – блеклисти. ipset използва hashtable за извличане на IP адреси като в този метод търсенето е много по-бързо от хиляди последователно анализирани правила за блокиране в iptables

Нужен софтуер в Debian/Ubuntu.

sudo apt-get install ipset curl

Изтегляне на скрипта.

sudo wget -O /usr/local/sbin/update-blacklist.sh https://raw.githubusercontent.com/trick77/ipset-blacklist/master/update-blacklist.sh

Скрипта трябва да стане е изпълним.

sudo chmod +x /usr/local/sbin/update-blacklist.sh

Създаване на директория за съхранение на конфигурационните файлове.

sudo mkdir -p /etc/ipset-blacklist

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

sudo wget -O /etc/ipset-blacklist/ipset-blacklist.conf https://raw.githubusercontent.com/trick77/ipset-blacklist/master/ipset-blacklist.conf

Редактиране на конфигурационния файл ако има нужда от това.

sudo vim /etc/ipset-blacklist/ipset-blacklist.conf

Както е видно от картинката, конфигурацията основно се състои в това, да се коментират(изключват) наличните блеклисти във файла.

До тук добре, сега ни остана следващата стъпка да активираме правилата в защитната стена. Ръчно ще генериране на блеклиста и активиране на правилата в iptables/ipset.

sudo /usr/local/sbin/update-blacklist.sh /etc/ipset-blacklist/ipset-blacklist.conf

Как да проверим дали са активни правилата в нашата защитна стена.

sudo iptables -nvL

За да актуализирам автоматично блеклистата, трябва да копирам следния код в /etc/cron.d/update-blacklist. Съветвам ви да не актуализирайте списъка си твърде често или някои доставчици на блеклисти ще блокират вашия IP адрес. Добра практика е актуализацията да става веднъж дневно, ето моя пример:

Отваряме конфигурациония файл на crond.

sudo vim /etc/crontab

И поставяме следния ред.

33 23 * * *      root /usr/local/sbin/update-blacklist.sh /etc/ipset-blacklist/ipset-blacklist.conf

След което рестартираме демона

sudo systemctl restart cron.service

След рестарт на машината обаче, правилата няма да влязат в сила докато не дойде време демона crond да активира скрипта. За да активираме правилата можен да изпълним следните два реда.

sudo ipset restore < /etc/ipset-blacklist/ip-blacklist.restore
sudo iptables -I INPUT 1 -m set --match-set blacklist src -j DROP

Тъй като iptables прочита правилата последователно от горе-надолу, ipset-blacklist е най-ефективен, ако е първото правило във веригата INPUT. Обаче ако имате fail2ban на сървъра си и го рестартирате той ще промени номерата на правилата и ще се премести преди ipset-blacklist. Тази ситуация всъщност става много тъпа защото fail2ban анализира IP адреси които би трябвало да бъдат блокирани от ipset-blacklist преди това. За да се избегне този неприятен ефект, трябва да се конфигурира fail2ban да изпълнява правилата си от 2-ра позиция. Тъй като действието iptables-multiport е действие по подразбиране на забрана, трябва да добавим файл към /etc/fail2ban/action.d по този начин.

sudo vim /etc/fail2ban/action.d/iptables-multiport.local

И в него да добавям правилата.

[Definition]
actionstart = <iptables> -N f2b-<name>
              <iptables> -A f2b-<name> -j <returntype>
              <iptables> -I <chain> 2 -p <protocol> -m multiport --dports <port> -j f2b-<name>

След което естествено fail2ban трябва да се рестартира.

sudo systemctl restart fail2ban.service

За да проверя дали найстина са се подредили правилата ще изпълня командата.

sudo iptables -nvL --line-number

Където в червения ред е първото правило на ipset-blacklist а в зеления второто на faul2ban.

Може би ще има случай в който ще искате да “логнете” този трафик за да го анализирате по някакъв начин. Това лесно може да се случи като изпълните.

sudo iptables -I INPUT -m set --match-set blacklist src -j LOG --log-prefix 'BLACKLIST '

Опцията -I INPUT ще вмъкне правилото на първа позиция като блокиращото ще остане под него а fail2ban ако съще ствува ще стане трето. Това е така защото за да улавя този трафик и да го записва в syslog-a “логващото” трябва да е винаги преди “блокиращото” в противен случай опцията LOG на iptables няма как да улавя трафик който вече е блокиран. Можем да следим в реално време лога на iptables ако изпълним в терминала.

sudo tail -f /var/log/syslog | grep --color -P "BLACKLIST|DPT|SRC|PROTO"

И, ужас, някакви гадняри ми пращат мръсни пакетчета … 🙂

За да спрем лога просто трябва да изпълним правилото.

iptables -D INPUT -m set --match-set blacklist src -j LOG --log-prefix 'BLACKLIST '

С опцията -D INPUT, правилата ще се пренаредят както са си били преди това, тоест blacklist пак ще е първа а fail2ban втори поред номер.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

This Post Has 2 Comments

  1. Milly

    Ръководството за черен списък работи перфектно на моя debian 10 LAMP.

    Съжалявам за въпроса, който знаете как безопасно да инсталирате nextcloud с помощта на ISPConfig, във форума -ho ***** rge- не мога да намеря отговор.

    – LAMP debian, apache, mariadb, php

    Много ви благодаря

  2. hrishticha

    Отдавна търсех нещо подобно което да допълва fail2ban, благодаря 🙂