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:

  1. Logfile nach invalid user durchsuchen
  2. IP-Adresse in ipset speichern
  3. 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.