Einleitung (kurz)
Portknocks sind wie ein akustisches Signal, was eine Geheimtür öffnet: nur wer die richtige Tonfolge kennt, darf eintreten. SPA (Single Packet Authorization) mit fwknop macht das verschlüsselt und zuverlässig. Für mobile Arbeit (wechselnde IPs) kombinieren wir SPA mit WireGuard als Fallback — oder nutzen SPA-Varianten, die nicht an eine feste Client-IP binden (z. B. --resolve-url oder GPG-SPA). nftables ist die Firewall-Engine, mit der wir die Zugriffsregeln sauber und performant verwalten.
Dieses Tutorial ist in zwei Teilen aufgeteilt:
- Teil A Server: nftables-Grundgerüst, fwknop Server-Setup (mit nft-Integration), WireGuard Server-Setup, Backup & Recovery, Router-Portforwarding.
- Teil B Client: SPA (resolve-URL) Variante, GPG-SPA Variante, WireGuard Client-Config, Tipps für mobiles Arbeiten.
Teil A: Server: nftables + fwknop (SPA) + WireGuard (Basis)
Ziel: Server so einrichten, dass SSH standardmäßig versteckt ist (nur per SPA erreichbar) und zusätzlich WireGuard läuft, damit Clients auch bei wechselnder IP zuverlässig verbinden können.
Vor dem Start: Den Notfall-Plan (lesen!)
-
Du brauchst physischen/KVM-Zugang oder eine Admin-IP, die du vorerst freihältst.
-
Lege unbedingt ein Backup von nftables an:
1sudo nft list ruleset > ~/nftables-before-fwknop.conf -
Arbeite am Anfang getestet in einer VM, wenn möglich.
1) Pakete installieren
Da kommen wir leider nicht drumherum, erst einmal die Dinge zu installieren, die wir brauchen:
|
|
Prüfe:
|
|
2) nftables Basisaufbau (Table, Set, Chains)
Wir legen ein Set allowed_ssh an — fwknop fügt Client-IPs dort ein (mit Timeout). So bleibt die Firewall sauber.
|
|
Speichern (Boot-Persistence):
|
|
3) fwknop (Server) konfigurieren — nft integration
- Finde den Pfad zu
nftauf deinem System:
|
|
fwknopdInterface einstellen (fwknop sniffet per pcap): Editiere/etc/fwknop/fwknopd.conf(als root) und setze:
|
|
access.conf(fwknop) anlegen — nft-Befehle als FW_CMD Erstelle die/etc/fwknop/access.confmit folgendem Template (ersetze die Base64-Schlüssel durch die später vom Client erzeugten):
sudo nano /etc/fwknop/access.conf
Als Inhalt:
|
|
Zugriffsrechte setzen:
|
|
fwknopstarten / neu starten:
|
|
Hinweis: Wenn deine nft Version timeout für Set-Elemente nicht unterstützt, verwende
FW_CMDohne timeout undFW_CMD_DELals Cleanup (fwknop kann dasFW_CMD_DELaufrufen), oder nutze ein kleines Timer-Script.
4) WireGuard (Server) — Basis-Setup
WireGuard ist die stabile Lösung für mobile Clients. Wenn WireGuard läuft, kannst du SSH über den Tunnel erreichen, völlig unabhängig von der öffentlichen Client-IP.
4.1 Server Keys & Konfiguration
|
|
Erstelle /etc/wireguard/wg0.conf (Beispiel):
|
|
Hinweis: In PostUp/PostDown kannst du erlauben, dass bestimmte VPN-Peers direkt SSH dürfen (z. B. 10.10.10.2). Alternativ verwaltest du Zugriff rein über die
allowed_sshSet-Einträge für öffentliche IPs — VPN-Tunneled Clients benötigen das nicht.
Aktiviere nun WireGuard:
|
|
4.2 nftables + WireGuard
Wenn SSH über den Tunnel laufen soll, sorge dafür, dass die INPUT-Chain VPN-Traffic zulässt (beispielsweise accept für iifname wg0 oder für das VPN-Subnet):
|
|
5) Port-Forwarding am Router (was muss weitergeleitet werden?)
- WireGuard: UDP Port (Standard 51820) → Server LAN-IP (z. B. 192.168.178.10).
- SPA / fwknop: SPA-Pakete werden an eine Zielport gesendet (je nach Client-Aufruf). Wenn du einen festen Port für SPA nutzt (z. B. UDP 62201), musst du diesen Port ebenfalls zum Server forwarden. fwknop selbst „lauscht“ per pcap, aber NAT/Router muss Pakete an die Server-IP durchlassen/weiterleiten.
Wir behandeln die Router-Konfiguration unten (Fritz!Box & Speedport).
6) Backup / Rollback (nftables + fwknop)
Backup nftables (wichtig):
|
|
Rollback (falls ausgesperrt):
|
|
Rollback-Script (optional):
|
|
7) Kurz Checks (vor Tests)
sudo nft list ruleset— sieht man Table / Set / Rules?which nft— Pfad prüfen und ggf. inaccess.confanpassen.ip addr— Interface prüfen (PCAP_INTF).sudo journalctl -u fwknop-server -f— Logs beobachten.
Teil B: Client: SPA-Varianten & WireGuard-Client
Ziel: zwei Wege, wie du vom Laptop/Smartphone zuverlässig Zugriff bekommst:
- SPA mit resolve-url (praktisch unterwegs), oder
- GPG-SPA (stärker, IP-unabhängig), oder
- WireGuard (empfohlen für Vielnutzer / stabile Verbindung).
A) SPA mit --resolve-url (mobil, einfach)
Konzept: Client ermittelt seine öffentliche IP über eine Web-URL (z. B. https://icanhazip.com oder besser: deine eigene kleine Resolver-URL) und packt diese IP ins SPA-Paket. Server öffnet genau diese IP.
Client Befehl (einfach):
|
|
Vorteile: funktioniert bei wechselnder IP; minimaler Konfig-Aufwand.
Nachteile: Privatsphäre (du fragst externe Dienste nach deiner IP). Ich empfehle, falls möglich, eine eigene kleine resolver-URL zu hosten (z. B. ein kleines CGI mit echo $_SERVER['REMOTE_ADDR']).
Server: keine Änderung nötig, access.conf wie in Teil A verwenden — fwknop setzt %IP% aus dem SPA.
B) GPG SPA (keine Bindung an Source-IP)
Konzept: Client signiert/verschlüsselt SPA mit privatem GPG-Key. Server nutzt Public Key, um Pakete zu prüfen. Server vertraut dem Paketinhalt, nicht der Quelladresse → mobil und sicher.
Schritte (Kurz):
- Client (Erzeuge GPG-Key):
|
|
-
Server (Importiere Client Public Key): Übertrage
gpg --export --armor CLIENT_KEYIDund importiere auf dem Server in/root/.gnupgoder in einem dedizierten gnupg-home für fwknop. -
access.conf(GPG-Konfig):
|
|
- Client erzeugt SPA mit GPG-Optionen: siehe
fwknopmanpage (Optionen wie--use-gpg/--gpg-key— die Flags variieren mit Version).
Vorteile: sehr sicher, keine Source-IP-Problematik. Nachteile: GPG-Keymanagement erforderlich (Passphrase, ggf. Smartcard).
1) Empfehlung (mobil & einfach) — resolve-url
Der Client ermittelt seine öffentliche IP über eine Web-URL (z. B. https://icanhazip.com oder eine eigene Resolver-URL) und sendet ein SPA an den Server. Einfach, robust bei wechselnden IPs.
|
|
Erläuterung / Platzhalter
-A tcp/22→ Zugriff auf SSH (Port 22).-D server.example.com→ Hostname oder IP deines Servers (ersetzen!).--use-hmac→ nutze HMAC (bei symmetrischen Keys).--resolve-url https://icanhazip.com→ Dienst zur Bestimmung der öffentlichen IP; empfehle eigene Resolver-URL für Privatsphäre.--verbose→ Ausgabe zum Debuggen.
Schnell-Check (nach Ausführung):
|
|
Wenn Keys vorhanden sind, kannst du daraus /etc/fwknop/access.conf bauen (Server-Seite), z. B. mit dem AWK-Snippet im Tutorial.
2) Empfehlung (IP-unabhängig & kryptographisch) — GPG-SPA
Wenn du von überall ohne IP-Bindung zugreifen willst und GPG benutzt, signiere/verschlüssele das SPA mit deinem GPG-Key. (Flag-Namen können je nach fwknop-Version leicht variieren — prüfe man fwknop falls nötig.)
Beispiel (konzeptionell — ersetze CLIENT_KEYID und server.example.com):
|
|
Wichtige Hinweise
--use-gpg/--gpg-identitysind exemplarische Flags — die genaue Option kann je nach fwknop-Version leicht heißen –gpg-key / –gpg-id. Prüfe man fwknop oder fwknop –help.- Auf dem Server musst du den zugehörigen Public-Key importieren (z. B. in
/root/.gnupg) und access.conf so konfigurieren, dassGPG_REMOTE_ID/GPG_HOME_DIRgesetzt sind.
Kurz-Check auf dem Client (GPG):
|
|
3) (Optional) Einzeiler, um nach Key-Erzeugung eine access.conf vorzubauen
Wenn du nach dem --key-gen die ~/.fwknoprc hast, kannst du lokal schnell eine access.conf erzeugen (auf dem Client) und dann per scp auf den Server kopieren:
|
|
Danach scp + sudo mv wie im Tutorial beschrieben, oder nutze das Einzeiler-Deploy aus dem Artikel.
C) WireGuard Client (empfohlen für dauerhafte Mobil-Nutzung)
- Client Key erzeugen:
|
|
- Client-Config (Beispiel wg0-client.conf):
|
|
-
Auf dem Server füge den Peer (öffentliche Schlüssel + AllowedIPs) zur wg0 Konfiguration hinzu (oder verwalte per wg set).
-
Firewall: erlaube wg0 traffic (siehe Teil A).
Vorteile: stabil, unabhängig von Client-IP, performant. Nachteile: initialer Setupaufwand, Peers verwalten.
Router: Port-Forwarding für Fritz!Box & Speedport (Allgemeine Anleitung)
Hinweis: Menübezeichnungen / Firmwarevarianten weichen leicht ab. Wenn die einzelnen Menüs nicht exakt passen, suche nach Begriffen wie „Internet“,
„Freigaben“, „Portfreigabe“, „NAT“ oder „Portweiterleitung“. Lies im Zweifelsfall das Handbuch deines Modells.
1) Fritz!Box (AVM)
- Öffne die Weboberfläche: http://fritz.box
- Melde dich als Admin an.
- Menü: Internet → Freigaben (oder «Portfreigaben» / «Freigaben»).
- „Neue Freigabe“ / „Gerät für Freigaben hinzufügen“ — wähle deinen Server (LAN-IP) aus.
- Lege eine Portfreigabe an:
- Anwendungsname: WireGuard (oder fwknop-SPA)
- Protokoll: UDP
- Port extern: 51820 (WireGuard) bzw. z. B. 62201 (SPA), sofern du SPA über UDP auf einem bestimmten Port senden willst
- Port intern: gleich wie extern
Speichern. Teste von außen (z. B. Handy über Mobilfunk) mit nc / wg / fwknop Aufruf.
2) Speedport (Deutsche Telekom) — typischer Ablauf
- Öffne Webinterface: http://192.168.2.1 (oder speedport.ip)
- Login als Admin.
- Menü: Internet / Freigaben / Portweiterleitung (genaue Bezeichnung variiert).
- „Neue Regel anlegen“: fülle aus wie bei FritzBox:
- Zielgerät / IP: Server LAN-IP
- Port extern / intern: 51820 UDP (WireGuard) und optional SPA-Port
- Protokoll: UDP
Speichern und testen.
Test (von außen)
Für WireGuard: versuche mit wg/wg-quick die Verbindung vom Mobilgerät.
Für SPA: teste fwknop Client-Befehl mit --resolve-url vom Mobilnetz.
Zum Abschluss
Zum Abschluss liefere ich noch 3 mögliche Konfigurationsvarianten für die Mobile Verbindung.
Variante A — Resolve-URL (praktisch, mobil-freundlich)
Konzept kurz: Client ermittelt seine öffentliche IP via HTTP(S) (z. B. https://icanhazip.com oder besser: deine eigene kleine resolver-URL) und packt diese IP ins SPA. Server fügt diese IP ins nft-Set ein.
Server — access.conf (nft-Integration)
Füge in /etc/fwknop/access.conf (ersetze Base64-Keys):
|
|
Achte auf den korrekten
nft-Pfad (which nft) und dassallowed_sshexistiert.
Client Einzeiler (mobil)
|
|
(Empfehlung: ersetze https://icanhazip.com durch eine eigene Resolver-URL, wenn dir Privatsphäre wichtig ist.)
Kurzcheck
- Nach Ausführung: auf dem Server
sudo nft list set inet filter allowed_ssh→ die IP sollte erscheinen. - Dann
ssh -i ~/.ssh/id_rsa user@server.example.com.
Vor-/Nachteile
- Einfach einzurichten, funktioniert bei wechselnden IPs.
- − Abhängigkeit von einem externen IP-Service (oder Aufwand, selbst einen Mini-Resolver zu hosten).
- Sicherheit: weiterhin Verschlüsselung durch SPA; kurzlebiger Zugriff (Timeout).
Variante B: GPG-SPA (IP-unabhängig, kryptographisch stark)
Konzept kurz: Client signiert/verschlüsselt das SPA mit seinem privaten GPG-Key; Server überprüft/entschlüsselt mit dem zugehörigen Public Key. Server braucht nicht die Client-Source-IP zu binden (oder kann zusätzlich %IP% verwenden).