Създаване на скрипт в systemd с Firewall против SPAM от Blocklistde и Spamhaus на Debian 9

В този пост ще покажа малък пример как може да се създаде скрипт в systemd Линукс дистрибуция и по специално Debian 9. В случая това е реален и много полезен за мен скрипт извличащ съдържанието на Blocklistde и Spamhausблеклисти” и създаващ правила с iptbales и ipset които спират лошите хора да ми виждат сървъра.

Скрипта може да работи съвместно с 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

Това което би трябвало да се види е банера на самият пост.

Понякога сървърите стават жертва на организирани масови атаки с източници цели държави. В такива случаи можем да добавим долните няколко реда в секцията start в скрипта /etc/init.d/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 които не искам да виждат описаните портове.

Leave a Reply

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