Archive

Kategorien

ipset Blocklisten verteilen

Hier ein kleines Helferlein, um Blocklisten (ipset) an Server zu verteilen. Dabei können die Blocklisten von beliebigen Programmen z.B. fail2ban erstellt werden. Das verwendete Programm muss die Blocks einfach in eine ipset Liste eintragen, welche dann vom Script an die Server verteilt wird.

Im folgenden soll es also nicht um die Einrichtung des Blockprograms gehen, sondern ausschliesslich um das Script, welches die Daten verteilt. Dieses besteht aus zwei Komponenten (bash Scripte). Einerseits das Serverscript, welches auf dem Server mit dem Blockprogram läuft und andererseits um das Clientsscript, welches die Listen dann auf den jeweiligen Servern einträgt.

Das Serverscript erwartet zwei ipset Listen: OFFENDERS und OFFENDERS_NET. Wobei erstere nur IPs und letztere nur Netze enthält. Erstellen kann man solche Listen

1
2
ipset -N OFFENDERS hash:ip timeout $(( 28*86400 ))
ipset -N OFFENDERS_NET hash:net timeout $(( 28*86400 ))

Der Timeout Wert gibt an wie lange die IPs/Netze in den Tabelle vorhanden sind. Wenn der Timer abläuft werden diese automatisch gelöscht d.h. man muss nicht mittels Script alte Werte rausputzen

Dann kommt das Script und zieht diese Listen. Wenn Unterschiede zum letzten Durchlauf vorhanden sind, werden die Listen an die Server gepushed.
In den Zeilen 4-15 holt sich das Script zusätzlich noch Blocks von einem pfSense System und zwar aus den Tabellen snort2c, MY_BLACK_HOST und MY_BLACK_NET. Wenn man dies nicht hat (oder wünscht) einfach diese Zeilen auskommentieren.
Falls man beim Erstellen der Tabellen andere Timeout Werte gewählt hat, dann sollte man diese im Script in Zeile 12 ebenfalls anpassen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash

[ ! -e /tmp/sharedBlockedIPs.pid ] || exit 0
echo "gathering block information from pfsense"
touch /tmp/sharedBlockedIPs.pid
FORCE=''
FORCE="$1"
for table in snort2c MY_BLACK_HOST MY_BLACK_NET ; do
 tbl='OFFENDERS'
 [ "$table" = 'MY_BLACK_NET' ] && tbl='OFFENDERS_NET'
 for ip in $(ssh root@10.66.99.129 "pfctl -t $table -T show") ; do
  /sbin/ipset -! -A $tbl $ip timeout $(( 28*86400 ))
 done
done
echo "set ipset from pfctl"
[ -e /tmp/export ] || mkdir /tmp/export
/sbin/ipset -S OFFENDERS >/tmp/export/offenders.block
/sbin/ipset -S OFFENDERS_NET >/tmp/export/offenders_net.block
/sbin/ipset -L OFFENDERS|awk '{print $1}'|sort -n >/tmp/export/offenders.ips
/sbin/ipset -L OFFENDERS_NET|awk '{print $1}'|sort -n >>/tmp/export/offenders.ips
echo "ipset dumped"
#echo "ip list created"
[[ -e /tmp/offenders.md5 && "x$FORCE" = 'x' ]] && [ "$(/usr/bin/md5sum /tmp/export/offenders.ips | awk '{print $1}')" = "$(cat /tmp/offenders.md5)" ] && rm /tmp/export/* && rm -f /tmp/sharedBlockedIPs.pid && echo "ipset did not change. So no distribution to the servers needed. Use -f to enforce" && exit 0
/usr/bin/md5sum /tmp/export/offenders.ips | awk '{print $1}' > /tmp/offenders.md5
echo "Copy iplist to /var/www/block.txt for clients to fetch via http"
cp -f /tmp/export/offenders.ips /var/www/html/block.txt >/dev/null
/sbin/ipset -S >/root/ipset.rules
echo "distribute block lists to servers"
for host in host{1,2,3,4,5}.mydomain.tld ; do
 echo "sync blocklist"
 /usr/bin/rsync -a -e ssh /tmp/export/* root@$host:/root/
 echo "Reload blocklist on $host"
 ssh root@$host "bash /root/addOffenders.sh"
# echo -n "."
done
echo ""
rm /tmp/export/*
rm /tmp/sharedBlockedIPs.pid
echo "Distribution of iplists sucessfull" && exit 0

In Zeile 33 triggert dieses Script dann das Laden der verteilten Listen auf dem jeweiligen Host. Dazu muss auf dem ensprechenden Host folgendes Script vorhanden sein

1
2
3
4
5
6
7
8
9
10
11
 || exit 0
[ -e /root/offenders_net.block ] || exit 0
sed -i 's/OFFENDERS/TMP/g' offenders.block
sed -i 's/OFFENDERS_NET/TMP_NET/g' offenders_net.block
/usr/sbin/ipset -R </root/offenders.block
/usr/sbin/ipset -R </root/offenders_net.block
/usr/sbin/ipset -W TMP OFFENDERS
/usr/sbin/ipset -X TMP
/usr/sbin/ipset -W TMP_NET OFFENDERS_NET
/usr/sbin/ipset -X TMP_NET
rm /root/offenders*

Das Script ersetzt die ipset Tabellen ohne jeglichen Unterbruch, indem die neuen Tabellen erst in temporäre Tabellen geschrieben werden. Dann werden die produktiven Tabellen mit diesen temporären Tabellen ersetzt ipset -W TMP PROD
Das ist sehr performant und sorgt dafür, dass zu jedem Zeitpunkt die gefüllten Tabellen existieren. Dieser Weg ist auch viel schneller als jeden Eintrag mittels ipset -! -A TABELLE IP_ADRESSE einzufügen. Gerade bei mehreren tausend Einträgen ist der Unterschied massiv.

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

  

  

  

two × 5 =

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