SSH mit iptables absichern
Praktische iptables-Rezepte zur Absicherung des SSH-Zugriffs.
iptables ist ein Kommandozeilen-Dienstprogramm und die Standardschnittstelle zur Verwaltung der im Linux-Kernel integrierten Netfilter-Firewall. Damit lassen sich Regeln erstellen und ändern, die steuern, wie Netzwerkpakete gefiltert und weitergeleitet werden. Die Arbeit mit iptables erfordert Root-Rechte.
Grundlegende Konzepte
Eine Regel besteht aus einem Übereinstimmungskriterium, einer Zielaktion und einem Paketzähler. Erfüllt ein eingehendes Paket das Kriterium, wird die Aktion angewendet und der Zähler erhöht. Regeln werden der Reihe nach ausgewertet — die Reihenfolge ist entscheidend.
- Kriterium — ein logischer Ausdruck, der Paket- und Verbindungseigenschaften prüft, um zu entscheiden, ob eine Regel greift. Mehrere Kriterien werden mit einem logischen UND verknüpft.
- Aktion (Ziel) — was mit einem Paket geschehen soll, wenn es übereinstimmt: akzeptieren, verwerfen, an eine andere Chain weiterleiten usw.
- Zähler — erfasst, wie viele Pakete der Regel entsprachen, und deren Gesamtgröße in Bytes.
Eine Chain ist eine geordnete Liste von Regeln. Es gibt zwei Arten:
- Eingebaute Chains — werden automatisch bei der Initialisierung einer Tabelle angelegt. Jede hat eine Standardrichtlinie, die auf Pakete angewendet wird, die von keiner anderen Regel erfasst werden. Namen eingebauter Chains sind immer in Großbuchstaben:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING. - Benutzerdefinierte Chains — werden manuell erstellt und sind auf ihre eigene Tabelle beschränkt. Verwenden Sie Kleinbuchstaben, um Verwechslungen mit eingebauten Chains und Zielen zu vermeiden.
Eine Tabelle ist eine nach Zweck gruppierte Sammlung von Chains. Tabellennamen werden kleingeschrieben. Die Tabelle wird mit dem Flag -t tabellenname angegeben — wird sie weggelassen, verwendet iptables standardmäßig filter.
1. Verbindungsrate begrenzen (Brute-Force-Schutz)
Um sich gegen das Durchprobieren von Passwörtern zu schützen, können Sie die Anzahl neuer SSH-Verbindungen von einer einzelnen IP begrenzen — z. B. auf 2 Versuche pro Minute — und alles darüber hinaus verwerfen.
## Chain sshguard erstellen
/sbin/iptables -N sshguard
# Optional: blockierte Versuche protokollieren
#/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --rcheck --seconds 60 --hitcount 2 -j LOG --log-prefix "SSH-shield: "
# Verbindungen verwerfen, die das Ratelimit überschreiten
/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --update --seconds 60 --hitcount 2 -j DROP
# IP akzeptieren und registrieren, wenn unter dem Limit
/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --set -j ACCEPT
/sbin/iptables -A sshguard -j ACCEPT
## Gesamten SSH-Verkehr durch sshguard leiten
/sbin/iptables -A INPUT -p tcp --dport 22 -j sshguard
Diese Regeln basieren auf dem Kernelmodul recent, das dynamische Listen von IP-Adressen verwaltet. Das bedeuten die einzelnen Optionen:
--name name— Name der zu verwendenden IP-Liste (Standard:DEFAULT)--rcheck— prüft, ob die IP des Absenders in der Liste enthalten ist; gibtfalsezurück, wenn nicht gefunden--update— wie--rcheck, aktualisiert aber zusätzlich den Zeitstempel, wenn die IP gefunden wird--hitcount hits— gibttruezurück, wenn die Paketanzahl von einer bestimmten IP den angegebenen Wert erreicht oder überschreitet; wird mit--rcheckoder--updateverwendet--seconds seconds— legt fest, wie lange eine IP nach dem Hinzufügen in der Liste verbleibt--set— fügt die IP des Absenders zur Liste hinzu oder aktualisiert den Eintrag, falls bereits vorhanden--remove— entfernt eine IP aus der Liste; gibtfalsezurück, wenn nicht gefunden
Wichtig
Die Verwendung von --update statt --rcheck bewirkt, dass jeder neue Verbindungsversuch den Timer zurücksetzt. Wer es ohne Pause immer wieder versucht, startet den 60-Sekunden-Countdown jedes Mal von vorn.
2. SSH-Port dynamisch öffnen und schließen (Port Knocking)
Statt SSH rund um die Uhr erreichbar zu lassen, können Sie es hinter einer Klopfsequenz verstecken. Der Port öffnet sich nur für die IP, die die richtige Sequenz sendet — und lässt sich auf Anforderung wieder schließen.
Um den SSH-Zugang zu öffnen, tippen Sie zunächst auf Port 1500 — per Telnet:
telnet myserver 1500
oder direkt im Browser:
http://192.168.0.100:1500
Um ihn wieder zu schließen, klopfen Sie an Port 1499.
iptables -N sshguard
# Verbindung erlauben, wenn die IP bereits in der Liste ist
iptables -A sshguard -m state --state NEW -m recent --rcheck --name SSH -j ACCEPT
# Pakete für bereits aufgebaute Verbindungen erlauben
iptables -A sshguard -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A sshguard -j DROP
# Öffnen: IP in die Liste aufnehmen, wenn Port 1500 angesprochen wird
#iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1500 -j LOG --log-prefix "SSH-open: "
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1500 -m recent --name SSH --set -j DROP
# Schließen: IP aus der Liste entfernen, wenn Port 1499 angesprochen wird
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1499 -m recent --name SSH --remove -j DROP
## SSH-Verkehr durch sshguard leiten
iptables -A INPUT -p tcp --dport 22 -j sshguard
Der Zugang wird nur für die IP gewährt, die den Knock ausgeführt hat.
3. SSH-Zugang zeitlich begrenzen
Mit diesem Ansatz können Sie SSH für eine bestimmte IP für ein festes Zeitfenster öffnen — praktisch, wenn Sie vorübergehenden Zugriff benötigen, ohne einen Port dauerhaft zu exponieren.
## Chain sshguard erstellen und leeren
iptables -N sshguard
iptables -F sshguard
# Verbindung erlauben, wenn IP in der Liste und zuletzt innerhalb von 30 Stunden gesehen (108000 Sekunden)
iptables -A sshguard -m state --state NEW -m recent --update --seconds 108000 --name SSH -j ACCEPT
# Pakete für bereits aufgebaute Verbindungen erlauben
iptables -A sshguard -m state --state ESTABLISHED,RELATED -j ACCEPT
# Alles andere verwerfen
iptables -A sshguard -j DROP
## IP registrieren, wenn Port 222 angesprochen wird
iptables -A INPUT -m state --state NEW -p tcp --dport 222 -m recent --name SSH --set
## SSH-Verkehr durch sshguard leiten
iptables -A INPUT -p tcp --dport 22 -j sshguard
Um Zugang zu erhalten, verbinden Sie sich zunächst mit Port 222:
ssh user@server.name -p 222
Danach hat Ihre IP für die angegebene Dauer SSH-Zugang. Jede weitere SSH-Verbindung verlängert den Timer. Wenn Sie das Fenster nicht bei jeder Verbindung verlängern möchten, ersetzen Sie --update --seconds 108000 durch --rcheck.
Der Zugang wird nur für die IP gewährt, die die initiale Verbindung hergestellt hat.
Um zu sehen, welche IPs derzeit SSH-Zugang haben:
cat /proc/net/ipt_recent/SSH
Hilfe
Bei Fragen oder wenn Sie Unterstützung brauchen, erreichen Sie uns jederzeit über das Ticketsystem — wir helfen Ihnen gern weiter!