Diese Anleitung zeigt, wie du SSH mit Port Knocking absicherst. Der Port 22 ist
standardmäßig geblockt und öffnet sich nur kurz für deine IP, nachdem du die
richtige Knock-Sequenz gesendet hast. Laufende SSH-Sessions bleiben dabei immer
aufrecht.
iptables installiertknockd installiert (sudo apt install knockd)Erstelle das Skript:
sudo mkdir -p /etc/iptables
sudo nano /etc/iptables/ssh-rules.sh
Inhalt:
#!/bin/bash
# SSH_RULES Chain anlegen (Fehler ignorieren falls bereits vorhanden)
iptables -N SSH_RULES 2>/dev/null
# Laufende SSH-Sessions immer durchlassen
iptables -C SSH_RULES -m state --state ESTABLISHED,RELATED -j ACCEPT 2>/dev/null || \
iptables -A SSH_RULES -m state --state ESTABLISHED,RELATED -j ACCEPT
# Neue SSH-Verbindungen blockieren (knockd öffnet temporär für die jeweilige IP)
iptables -C SSH_RULES -p tcp --dport 22 -j DROP 2>/dev/null || \
iptables -A SSH_RULES -p tcp --dport 22 -j DROP
# INPUT-Chain auf SSH_RULES weiterleiten
iptables -C INPUT -p tcp --dport 22 -j SSH_RULES 2>/dev/null || \
iptables -A INPUT -p tcp --dport 22 -j SSH_RULES
Skript ausführbar machen:
sudo chmod +x /etc/iptables/ssh-rules.sh
Erstelle den Service:
sudo nano /etc/systemd/system/ssh-firewall.service
Inhalt:
[Unit]
Description=SSH Firewall Rules (knockd-compatible)
After=network.target docker.service
Wants=network.target
[Service]
Type=oneshot
ExecStart=/etc/iptables/ssh-rules.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Hinweis:
After=docker.servicestellt sicher, dass Docker seine Regeln
zuerst setzt und deine SSH-Regeln nicht überschrieben werden. Falls du kein
Docker nutzt, kannst dudocker.serviceweglassen.
Service aktivieren und starten:
sudo systemctl daemon-reload
sudo systemctl enable --now ssh-firewall.service
Status prüfen:
sudo systemctl status ssh-firewall.service
Regeln verifizieren:
sudo iptables -t filter -S SSH_RULES
sudo iptables -t filter -S INPUT | grep SSH_RULES
Erwarteter Output von SSH_RULES:
-N SSH_RULES
-A SSH_RULES -m state --state RELATED,ESTABLISHED -j ACCEPT
-A SSH_RULES -p tcp --dport 22 -j DROP
Netzwerk-Interface herausfinden:
ip -br link show
Beispiel-Output:
lo UNKNOWN
eth0 UP
Konfigurationsdatei bearbeiten:
sudo nano /etc/knockd.conf
Inhalt:
[options]
Interface = eth0 # Dein Interface hier anpassen
logfile = /var/log/knockd.log
pidfile = /var/run/knockd.pid
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 10
tcpflags = syn
start_command = /sbin/iptables -I SSH_RULES 1 -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout = 30
stop_command = /sbin/iptables -D SSH_RULES -s %IP% -p tcp --dport 22 -j ACCEPT
Sequenz ändern: Ersetze
7000,8000,9000durch eigene Ports – je
ungewöhnlicher, desto besser. Vermeide bekannte Ports wie 80, 443, 8080.
cmd_timeout: 30 Sekunden Zeitfenster um SSH aufzubauen. Danach schließt
knockd den Port für neue Verbindungen. Laufende Sessions bleiben offen.
knockd aktivieren und starten:
sudo systemctl enable --now knockd
sudo systemctl status knockd
knock installieren (falls nicht vorhanden):
# Debian/Ubuntu
sudo apt install knockd
# Arch
sudo pacman -S knock
Verbinden:
knock -v dein-server.de 7000 8000 9000
sleep 1
ssh user@dein-server.de
sudo tail -f /var/log/knockd.log
Erwarteter Log-Output nach erfolgreichem Knock:
[2026-03-23 11:00:00] 1.2.3.4: openSSH: Stage 1
[2026-03-23 11:00:00] 1.2.3.4: openSSH: Stage 2
[2026-03-23 11:00:00] 1.2.3.4: openSSH: Stage 3
[2026-03-23 11:00:00] 1.2.3.4: openSSH: OPEN SESAME
[2026-03-23 11:00:30] 1.2.3.4: openSSH: command timeout (stop_command executed)
| Problem | Lösung |
|---|---|
| SSH nach Knock immer noch geblockt | iptables -t filter -S SSH_RULES prüfen, ob Chain korrekt ist |
| knockd startet nicht | Interface in knockd.conf prüfen (ip -br link show) |
| Regeln nach Reboot weg | systemctl status ssh-firewall.service prüfen |
| Docker überschreibt Regeln | After=docker.service im systemd-Service gesetzt? |
| Laufende Session bricht ab | ESTABLISHED,RELATED-Regel fehlt oder steht hinter DROP |