iptables drop mit ipset
Die ganzen invalid user im auth.log haben nun doch zu sehr genervt. Fail2Ban habe ich schon gehört, gefällt mir nicht. Bei einer kurzen Suche bin ich auf Implementing a Dynamic Blocklist with IPtables gelandet.
Nette Idee, IP-Adressen Liste holen, als ipset speichern und mit iptables Droppen. Nur das ich keine Liste holen will, stattdessen:
- Logfile nach invalid user durchsuchen
- IP-Adresse in ipset speichern
- Von iptables droppen lassen
Meine fehlerhaften SMTP Auth Logins werden schon längere Zeit als Blackhole Route genullt, diese können dann einfach mit rein.
ipset
ipset speichert Listen von IP-Adressen - aber nicht nur IP-Adressen - im Kernel. Diese Liste kann von iptables verwendet werden.
Praktisch das ipset mit timeout schon alles mitbringt um die Liste nicht unendlich wachsen zu lassen. Und mit counter Treffer in der Liste vermerkt.
iptables
Da Docker auf dem Server läuft, bleibe ich bei iptables. nftables hat sowieso eigene Sets und würde mit ipset nicht funktionieren.
Anlegen der Liste
Bevor die Liste in iptables referenziert werden kann, ist diese anzulegen.
ipset create myBlockIPs hash:ip timeout 432000 counters
- hash:ip - Ich speichere IP-Adressen. Dieser Typ kann auch Netze
- timeout - Default Timeout in Sekunden. Ich habe 5 Tage genommen
- counters - Wird eine IP-Adresse “getroffen” wird Paketanzahl und Bytes gespeichert
Nun können Einträge hinzugefügt werden
ipset add myBlockIPs 1.2.3.4
Anlegen der Drop Rule
Nun muss nur noch iptables Treffer droppen.
iptables -A INPUT -m set --match-set myBlockIPs src -j DROP
Füllen vom ipset
Fast schon langweilig.
#!/bin/bash
# SSH Logins
fgrep 'Invalid user' /var/log/auth.log \
| awk '{print $10 }' \
| sort | fgrep -v port \
| uniq | while read ip
do
/sbin/ipset -q add myBlockIPs $ip
done
# Exim
fgrep 'Incorrect authe' /var/log/exim4/mainlog \
| awk '{print $8}' \
| tr -d '[]:()' \
| sort | uniq \
| fgrep -v 127.0.0.1 \
| while read i r; do /sbin/ipset -! add myBlockIPs $i; done
Schauen ob es auch hilft
fgrep 'Invalid user' /var/log/auth.log | awk '{ print $1$2 }' | uniq -c
1775 Feb25
1645 Feb26
162 Feb27
89 Feb28
104 Feb29
318 Mar1
160 Mar2
173 Mar3
Ja, hilft.
Mal sehen, beim nächsten Reboot wird es wohl nicht funktionieren.