Скрипта може да работи съвместно с fail2ban защото използва таблицата raw в iptables която приема пакетите преди веригата INPUT от таблицата filter която ползва fail2ban. По този начин имаме заредена твърда Blacklist-a отпред и втора след нея (fail2ban) която следи логовете в системата за евентуални атаки.
Това от една страна вдига сериозно нивото на сигурност още “преди да се е случила случката” но от друга е напълно възможно а и по някой път се случва, клиент да попадне в горенаписаните “блеклисти” без да е спамер. Пример за това ще дам с родните мобилни оператори на които мрежите често попадат в тези листи. В такива случаи трудно бяснявам на клиента защо не може да си достъпи служебната пощенска кутия от телефона а от настолния си компютър може.
Инсталиране на ipset
root@server22:~# apt install ipset
Създавам инициализиращ файл в systemd
root@server22:~# vim /etc/systemd/system/firewall.service
Поставям в него следното съдържание
[Unit] Description=Spam Firewall for Servers DefaultDependencies=no Wants=network-online.target After=network-online.target [Service] Type=oneshot ExecStart=/etc/init.d/firewall start ExecReload=/etc/init.d/firewall restart ExecStop=/etc/init.d/firewall stop RemainAfterExit=yes [Install] WantedBy=multi-user.target |
След което създавам изпълнимия скрипт
root@server22:~# vim /etc/init.d/firewall
#!/bin/bash ### BEGIN INIT INFO # Provides: iptables firewall # Required-Start: $all # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: Spam Firewall for Servers ### END INIT INFO # # Author: Samuil Arsov <support@itservice-bg.net> # start() { echo "blocklistde" ipset create blocklistde hash:ip hashsize 4096 maxelem 131072 wget -qc https://lists.blocklist.de/lists/all.txt -O /tmp/blocklistde for i in $(cat /tmp/blocklistde | grep -v 2001: | grep -v 93.155.130); do ipset -A blocklistde $i done; rm -rf /tmp/blocklistde iptables -t raw -A PREROUTING -m set --match-set blocklistde src -j DROP echo "spamhaus" ipset create spamhaus hash:net wget -qc www.spamhaus.org/drop/drop.lasso -O /tmp/spamhaus for i in $(cat /tmp/spamhaus | egrep -v '^;' | awk '{ print $1}'); do ipset -A spamhaus $i done; rm -f /tmp/spamhaus iptables -t raw -A PREROUTING -m set --match-set spamhaus src -j DROP } stop() { echo "stop firewall" iptables -F -t raw ipset destroy blocklistde ipset destroy spamhaus } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 esac exit 0 |
И му добавам права за изпълнение
root@server22:~# chmod 755 /etc/init.d/firewall
След което разрешавам, стартирам скрипта и презареждам systemd
root@server22:~# systemctl enable firewall.service root@server22:~# systemctl start firewall.service root@server22:~# systemctl daemon-reload
Проверка дали е изпълнен скрипта.
root@server22:~# systemctl status firewall
Това което би трябвало да се види е банера на самият пост.
echo "spamnets" NETS="cn kr ua ru jp in tr br id vn hk ir mx th" ipset create spamnets hash:net for ZONE in $NETS; do wget -O - http://www.ipdeny.com/ipblocks/data/countries/$ZONE.zone 2>/dev/null >> /tmp/spamnets done; for i in $(cat /tmp/spamnets); do ipset -A spamnets $i done; rm -f /tmp/spamnets iptables -t raw -A PREROUTING -p tcp -m multiport --dports 21,25,110,143,465,587,993,995,8080 -m set --match-set spamnets src -j DROP |
Да, (cn kr ua ru jp in tr br id vn hk ir mx th) това са кодовете на държавите от сайта www.ipdeny.com които не искам да виждат описаните портове.