Скрипт, блокирващ огромен брой 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 втори поред номер.
Ръководството за черен списък работи перфектно на моя debian 10 LAMP.
Съжалявам за въпроса, който знаете как безопасно да инсталирате nextcloud с помощта на ISPConfig, във форума -ho ***** rge- не мога да намеря отговор.
– LAMP debian, apache, mariadb, php
Много ви благодаря
Отдавна търсех нещо подобно което да допълва fail2ban, благодаря 🙂