Zu Hause hängt an meiner DSL-Leitung ein kleiner Server. Per DynDNS ist die Kiste immer da. Es ist einfach praktisch, sein Zeug immer in der Nähe zu wissen, sobald man online ist. Und Backups nicht mit einem Stick, sondern per SSH heimwärts zu senden, möchte ich einfach nicht mehr vermissen.

Ich weiß nicht genau, was gerade umgeht. Jedenfalls verzeichne ich das letzte halbe Jahr mehrmals die Woche Wörterbuchattacken gegen meinen Server. Das auth.log schwillt an durch Versuche, einen gültigen SSH-Account ohne Passwort zu finden. Die Gegner sind da auch nicht zimperlich, mehrere Anfragen pro Sekunde hämmern auf den sshd ein.

Auf der Suche nach Abhilfe kam mir eine naheliegende Idee: Wenn zu viele Verbindungen innerhalb einer bestimmten Zeit von einer IP aufgebaut werden, wird die IP gesperrt. Da muss sich doch was mit iptables machen lassen! Faul bin ich auch, Fabian hat es nämlich schon gelöst, danke. Er hat das “recent”-Modul von iptables eingespannt.

Die Regeln sorgen dafür, das iptables sich zu jeder neuen Verbindung zu SSH die IP merkt. Ab der vierten neuen Verbindung innerhalb von 60 Sekunden werden alle weiteren Pakete von dieser IP weggeworfen. Es wird dann ein Eintrag im Syslog erzeugt. In die Whitelist kann man IPs eintragen, bei denen der Mechanismus nicht greifen soll.


iptables -N SSH_WHITELIST
iptables -A SSH_WHITELIST -s $GUTE_IP -m recent --remove --name SSH -j sperre

iptables -A exlog -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A exlog -p tcp --dport 22 -m state --state NEW -j SSH_WHITELIST
iptables -A exlog -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j LOG --log-prefix SSH_brute_force_
iptables -A exlog -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

Hier ist mein komplettes Firewall-Script: firewall.sh

Jetzt herrscht weitestgehend Ruhe im Karton! Aber schon interessant, womit es so diese Nacht probiert wurde:

Jun 14 18:56:21 localhost sshd[688]: Invalid user deutch from 62.103.159.236
Jun 14 18:56:23 localhost sshd[690]: Invalid user german from 62.103.159.236
Jun 14 18:56:24 localhost sshd[692]: Invalid user hitler from 62.103.159.236
Jun 15 04:26:13 localhost sshd[2437]: Invalid user deutch from 62.103.159.236
Jun 15 04:26:17 localhost sshd[2439]: Invalid user german from 62.103.159.236

(swg)