[[..:start|zurück]] ====== SSH Bastion ProxyJump ====== Eine Bastion-Host-Lösung erlaubt es, interne Systeme mit privaten IP-Adressen sicher von außen zu erreichen, ohne dass diese direkt im Internet exponiert werden. Der Zugriff erfolgt über einen einzigen öffentlich erreichbaren Server ("Bastion"), der als Proxy für alle internen Verbindungen dient. ===== Architektur ===== * **Bastion-Host**: öffentlich über DNS/Domain erreichbar (z. B. bastion.example.org) * **Interne Systeme**: haben private IP-Adressen (z. B. 192.168.x.x) * **Client**: verbindet sich von außen über den Bastion-Host, ohne VPN notwendig * Verbindung erfolgt über die SSH-Funktion ''ProxyJump'' oder per ''-J'' Parameter < a2s > Diagram Beispielaufbau .----------. .-----------------------. .---------------. |[computer]| |[cloud] | |[computer] | | client |<--ssh-->| bastion.example.org |<--ssh-->| interner Host | | | | | | | | | | | | | '----------' '-----------------------' '---------------' [computer]: {"a2s:type":"computer","fill":"lightgreen","a2s:delref":true} [cloud]: {"a2s:type":"cloud","fill":"lightgray","a2s:delref":true} ---- ===== Einrichtung auf dem Bastion-Host ===== * SSH-Server installiert (z. B. OpenSSH) * Nur Public-Key-Authentifizierung erlaubt * TCP-Forwarding aktiviert * Keine unnötigen Funktionen (z. B. TTY, X11) aktiv **Beispiel ‘’/etc/ssh/sshd_config’’:** Port 58222 PasswordAuthentication no PermitRootLogin no UseDNS no AllowTcpForwarding yes PermitOpen any GatewayPorts no PermitTTY no X11Forwarding no ClientAliveInterval 300 ClientAliveCountMax 2 **Nach Änderungen:** systemctl restart ssh ---- ===== Einrichtung auf dem Client ===== **Datei: ‘’~/.ssh/config’’** Host bastion HostName bastion.example.org Port 58222 User proxyuser IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 30 TCPKeepAlive yes ControlMaster auto ControlPath ~/.ssh/cm-%r@%h:%p ControlPersist 10m # Beispiel für internen Host via Bastion Host server-intern HostName 192.168.100.10 User admin ProxyJump bastion IdentityFile ~/.ssh/id_ed25519 **Aufruf:** ssh server-intern ---- ==== Alternative: Temporärer Tunnel ==== **Falls ProxyJump nicht möglich ist:** ssh -i ~/.ssh/id_ed25519 -p 58222 -L 2222:192.168.100.10:22 proxyuser@bastion.example.org ssh -p 2222 admin@localhost ---- ===== Erweiterung: Alle internen Hosts automatisch via Bastion ===== **Wildcard in ‘’~/.ssh/config’’:** Host 192.168.* User admin ProxyJump bastion IdentityFile ~/.ssh/id_ed25519 → alle 192.168er-Hosts gehen automatisch über den Bastion-Host. ---- ===== Typische Fehlerquellen und Behebung ===== * **Fehler: “Permission denied (publickey)”** * Public-Key fehlt oder falscher Benutzername * Lösung: Key korrekt in ‘’~/.ssh/authorized_keys’’ auf Bastion hinterlegen * **Fehler: “Connection refused”** * Bastion lauscht nicht auf Port (z. B. 58222) * Lösung: Firewall prüfen, ‘‘sshd’’ neu starten * **Fehler: “channel 0: open failed: administratively prohibited”** * TCP-Forwarding auf Bastion nicht erlaubt * Lösung: in ‘‘sshd_config’’ ‘‘AllowTcpForwarding yes’’ setzen * **Problem: Nach dem Login lande ich auf Bastion, nicht auf dem internen Host** * ProxyJump in ‘’~/.ssh/config’’ fehlt * Lösung: Host-Eintrag prüfen, ‘‘ProxyJump bastion’’ hinzufügen * **Problem: Verbindung funktioniert nur im LAN / über VPN** * Externe DNS oder Portweiterleitung nicht korrekt * Lösung: Prüfen, ob ‘‘bastion.example.org:58222’’ von außen erreichbar ist ---- ===== Sicherheitshinweise ===== * Bastion sollte gehärtet sein (keine Passwörter, keine Root-Logins). * Fail2Ban oder CrowdSec sinnvoll. * Logs regelmäßig prüfen. * Schlüsselverwaltung (evtl. mit SSH-Agent oder Vaultwarden) nutzen. ---- ===== Fazit ===== Mit einem SSH-Bastion-Host und ‘‘ProxyJump’’ lassen sich interne Systeme sicher und einfach von außen erreichen, ohne diese direkt ins Internet zu exponieren. Die Konfiguration ist robust, erweiterbar und erspart den Aufbau zusätzlicher VPNs, wenn nur SSH-Zugriff benötigt wird. ---- {{avatar>lars|Lars.Weiss@gmail.com?l|Lars Weiß}} //[[Lars.Weiss@gmail.com|Lars Weiß]] 19.08.2025 14:36//