SSH Proxy — Beispiele
SSH-Proxy-Durchläufe: Datenbank-Tunnel, Dev-Server exponieren, SOCKS-Proxy, Jump Host, ~/.ssh/config, systemd-Dienst, Windows und Tunnel-Skript.
Zurück zur Übersicht: SSH Proxy · Tool live öffnen: www.jpkc.com/tools/ssh-proxy/
Diese Seite zeigt SSH Proxy an konkreten Durchläufen. Hosts, Benutzer und Ports sind Beispiele — setze deine eigenen Werte ein. Wie die einzelnen Felder und Optionen genau arbeiten, steht im Manual. Denk daran: Das Tool baut nur die Befehle; ausgeführt werden sie in deinem eigenen Terminal.
Beispiel 1: Auf eine entfernte Datenbank zugreifen
Ziel: eine MySQL-Datenbank, die nur lokal auf dem Server lauscht, von deinem Rechner aus erreichen.
- Den Eintrag Local Forward wählen.
- SSH Host =
db-server.example.com, SSH User =deploy, SSH Port =22. - In der Tabelle Port Forwards: Local Bind
127.0.0.1, Local Port3306, Remote Host127.0.0.1, Remote Port3306. - Background und KeepAlive an lassen, Generate klicken.
Ergebnis: ein Bash-Skript (OS = Linux) mit diesem Inhalt:
#!/usr/bin/env bash
# Local port forwarding via SSH (-L local_bind:local_port:remote_host:remote_port)
ssh \
-L 127.0.0.1:3306:127.0.0.1:3306 \
-f \
-N \
-o ExitOnForwardFailure=yes \
-o ServerAliveInterval=60 \
-o ServerAliveCountMax=3 \
deploy@db-server.example.comNach dem Start verbindest du deinen DB-Client einfach mit 127.0.0.1:3306 — als liefe die Datenbank lokal. Die Erklärungs-Tabelle schlüsselt jede Flag auf. Läuft auf dem Port lokal schon etwas (etwa eine eigene MySQL-Instanz), bricht ssh dank ExitOnForwardFailure=yes mit einer Fehlermeldung ab, statt ohne Tunnel weiterzulaufen; wähle dann einen freien lokalen Port, etwa 13306.
Beispiel 2: Den lokalen Dev-Server nach außen geben
Ziel: deinen lokal laufenden Webserver (localhost:3000) für einen entfernten Server erreichbar machen, z. B. für einen Webhook-Test.
- Remote Forward wählen.
- SSH Host =
public.example.com, SSH User =tunnel. - Tabelle: Remote Bind leer lassen, Remote Port
8080, Local Host127.0.0.1, Local Port3000. - Den Schalter Public on the server (GatewayPorts) anhaken (du willst, dass der Port von außen erreichbar ist).
- Generate.
Ergebnis: ein ssh -R 0.0.0.0:8080:127.0.0.1:3000-Aufruf — das Tool setzt 0.0.0.0 selbst ein — plus ein deutlicher Kommentarblock, der daran erinnert, dass der SSH-Server GatewayPorts clientspecified in /etc/ssh/sshd_config braucht und danach neu geladen werden muss (sudo systemctl reload ssh). Ohne diese Server-Einstellung bindet der Tunnel nur an die Loopback-Schnittstelle des Servers. Unter der Ausgabe erinnert ein Warnhinweis daran, dass der Port jetzt auf allen Schnittstellen des Servers offen ist — sichere ihn mit einer Firewall ab.
Reicht es, wenn nur Prozesse auf dem Server selbst deinen Dev-Server erreichen (etwa ein Webhook-Empfänger, der dort lokal weiterleitet), lässt du den Schalter aus: Dann entsteht -R 8080:127.0.0.1:3000, und der Port bleibt auf dem Server privat.
Beispiel 3: SOCKS5-Proxy zum Surfen über einen Server
Ziel: den Browser-Verkehr durch einen entfernten Server leiten.
- Dynamic / SOCKS wählen.
- SSH Host =
gateway.example.com, SSH User =me. - Bind Address
127.0.0.1, SOCKS Port1080. - Compression zusätzlich anhaken (langsame Leitung), Generate.
Ergebnis: ssh -D 127.0.0.1:1080 -f -N -o ExitOnForwardFailure=yes -C … me@gateway.example.com, darunter als Kommentar die Testzeile curl --socks5-hostname 127.0.0.1:1080 https://ifconfig.me — sie sollte die IP-Adresse des Gateways zeigen. Konfiguriere anschließend deine Anwendung auf den SOCKS5-Proxy 127.0.0.1:1080. Bequem geht das über den Proxy Settings-Generator: Proxy Type SOCKS5, Host 127.0.0.1, Port 1080, Abschnitt Shell env vars — die Variablen zeigen dann auf socks5h://127.0.0.1:1080, sodass auch die Namensauflösung durch den Tunnel läuft. Im Browser ist das eine eigene Einstellung: In Firefox setzt du network.proxy.socks_remote_dns = true, sonst lecken DNS-Anfragen am Proxy vorbei.
Beispiel 4: Über einen Bastion-Host ins interne Netz
Ziel: einen internen Server erreichen, der nur über einen Jump-Host zugänglich ist.
- Jump Host wählen, Mode = Modern (-J / ProxyJump).
- In der Tabelle Jump Chain: Host
bastion.example.com, Port22, Userjumpuser. - Final Destination Host =
internal.example.com, Destination User =admin. - Generate.
Ergebnis (KeepAlive ist vorangehakt):
#!/usr/bin/env bash
# Multi-hop SSH via ProxyJump (-J, OpenSSH 7.3+)
ssh \
-J jumpuser@bastion.example.com \
-o ServerAliveInterval=60 \
-o ServerAliveCountMax=3 \
admin@internal.example.comTrägst du zusätzlich ein Identity File ein, etwa ~/.ssh/id_ed25519, steht vor dem Befehl ssh-add ~/.ssh/id_ed25519: Ein -i gilt bei -J nur für das Ziel, der Bastion-Host bekommt den Schlüssel über den SSH-Agent. Brauchst du eine zweite Zwischenstation, klickst du Add Jump und ergänzt die Zeile — -J nimmt mehrere, durch Komma getrennte Hops auf. Auf sehr alten Servern (vor OpenSSH 7.3) wählst du stattdessen Legacy (ProxyCommand); bei mehreren Hops gibt das Tool dann verkettete ~/.ssh/config-Blöcke aus.
Beispiel 5: Einen wiederkehrenden Tunnel in ~/.ssh/config gießen
Ziel: nicht jedes Mal den langen Befehl tippen, sondern ssh meinserver genügen lassen.
- SSH Config wählen.
- Host Alias =
meinserver, HostName =db-server.example.com, User =deploy. - IdentityFile =
~/.ssh/id_ed25519. - Unter Port Forwards auf Add Forward klicken (die Tabelle ist anfangs leer) und die Zeile füllen: Type Local (-L), Bind:Port
127.0.0.1:3306, Target:Port127.0.0.1:3306. - Generate.
Ergebnis: ein fertiger Block zum Anhängen an ~/.ssh/config:
# SSH config entry — append to ~/.ssh/config (Windows: %USERPROFILE%\.ssh\config)
Host meinserver
HostName db-server.example.com
User deploy
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
ServerAliveCountMax 3
ExitOnForwardFailure yes
LocalForward 127.0.0.1:3306 127.0.0.1:3306
# Usage: ssh meinserver — check what ssh makes of it: ssh -G meinserverDanach reicht ssh meinserver, und die Weiterleitung steht automatisch. Mit Copy in die Zwischenablage, dann unten an deine Config anhängen. Ob ssh den Block so liest wie gedacht, zeigt dir ssh -G meinserver: Der Befehl gibt die wirksame Konfiguration für diesen Alias aus, ohne eine Verbindung aufzubauen.
Beispiel 6: Einen Tunnel als systemd-Dienst beim Booten starten
Ziel: einen Datenbank-Tunnel dauerhaft als Dienst laufen lassen, der nach einem Neustart von selbst wieder hochkommt.
- Autostart Setup wählen, Autostart Method = systemd (Linux).
- SSH Host =
db-server.example.com, SSH User =deploy, Identity File =~/.ssh/id_ed25519. - Tunnel Type =
Local (-L), Forward Spec =3306:127.0.0.1:3306. - Service Name =
db-tunnel, Run as User = dein lokaler Benutzername, etwaanna(bleibt das Feld leer, läuft der Dienst als root und sucht Schlüssel in/root/.ssh— das Tool warnt dann). - Generate.
Ergebnis: zwei Tabs. tunnel.sh enthält das Start-Skript; db-tunnel.service enthält eine systemd-Unit, die auf network-online.target wartet, mit User=anna, Restart=always und RestartSec=10, samt eingebauter Installationsanleitung in den Kommentaren (sudo cp …, daemon-reload, enable --now, journalctl -u db-tunnel -f). Die ExecStart-Zeile ruft /usr/bin/ssh mit -o BatchMode=yes auf: Der Dienst fragt nie nach einem Passwort oder einer Bestätigung. Melde dich deshalb vorher einmal als anna von Hand per ssh deploy@db-server.example.com an, um den Host-Key anzunehmen, und nutze einen Schlüssel ohne Passphrase oder einen Agent — darauf weist auch der Hinweis unter der Ausgabe hin.
Den Service-Tab speicherst du per Download (der Dateiname db-tunnel.service passt schon), kopierst ihn nach /etc/systemd/system/ und aktivierst ihn — der Tunnel überlebt dann Neustarts und Abbrüche. Brauchst du mehrere Tunnel zentral verwaltet, ist stattdessen der Management Script-Generator die bessere Wahl (siehe Beispiel 8).
Beispiel 7: Denselben Tunnel unter Windows starten
Ziel: den Datenbank-Tunnel aus Beispiel 1 auf einem Windows-Rechner mit dem eingebauten OpenSSH-Client betreiben.
- Local Forward wählen, OS = Windows (OpenSSH).
- SSH Host =
db-server.example.com, SSH User =deploy, Identity File =C:\Users\anna\.ssh\id_ed25519. - Port-Weiterleitung wie in Beispiel 1, Background und KeepAlive an lassen, Generate.
Ergebnis: ein PowerShell-Skript. Weil Windows-OpenSSH kein -f kennt, startet es ssh versteckt im Hintergrund und nennt dir die Prozess-ID zum Beenden:
# Local port forwarding via SSH (-L local_bind:local_port:remote_host:remote_port)
# PowerShell — Windows 10/11 ships OpenSSH (ssh.exe)
# Windows OpenSSH has no -f: Start-Process runs ssh hidden in the background
$tunnel = Start-Process -WindowStyle Hidden -PassThru -FilePath ssh -ArgumentList @(
'-L',
'127.0.0.1:3306:127.0.0.1:3306',
'-i',
'C:\Users\anna\.ssh\id_ed25519',
'-N',
'-o',
'ExitOnForwardFailure=yes',
'-o',
'ServerAliveInterval=60',
'-o',
'ServerAliveCountMax=3',
'deploy@db-server.example.com'
)
Write-Host "Tunnel running, PID $($tunnel.Id) - stop with: Stop-Process -Id $($tunnel.Id)"Download speichert das Skript als local-forward.ps1. Hakst du zusätzlich Auto-Reconnect an, bleibt es auch mit autossh bei Windows-Bordmitteln: Das Tool erzeugt eine while ($true) { … }-Schleife, die ssh nach jedem Abbruch nach Retry Delay Sekunden neu startet, und erklärt im Hinweis, warum. Soll der Tunnel bei jeder Anmeldung starten, nimm Autostart Setup mit Task Scheduler (Windows) — die XML-Datei importierst du mit schtasks /create /tn "ssh-tunnel" /xml ssh-tunnel.xml.
Beispiel 8: Mehrere Tunnel mit einem Skript verwalten und überwachen
Ziel: zwei Tunnel — die Datenbank und einen SOCKS-Proxy — mit einem Befehl starten, prüfen und bei Ausfall neu starten.
- Management Script wählen, Script Type = Bash, Script Name =
tunnels. - Auto-reconnect und Logging an lassen, Health check anhaken.
- Erste Zeile der Tunnel Definitions: Name
db, Type Local (-L), SSH Hostdb-server.example.com, Userdeploy, Forward3306:127.0.0.1:3306. - Add Tunnel, zweite Zeile: Name
socks, Type Dynamic (-D), SSH Hostgateway.example.com, Userme, Forward1080. - Download — die Datei heißt
tunnels.sh.
Ergebnis: ein Skript, das auch mit der älteren Bash 3.2 auf macOS läuft:
chmod +x tunnels.sh
./tunnels.sh start # beide Tunnel starten
./tunnels.sh status # [up]/[down] je Tunnel
./tunnels.sh health # nimmt Port 3306 bzw. 1080 lokal Verbindungen an?
./tunnels.sh restart db # nur einen Tunnel neu starten
./tunnels.sh watch # alle 30 s prüfen und Ausgefallene neu startenJeder Tunnel läuft mit BatchMode=yes — nimm die Host-Keys also vorher einmal per Hand an. Die Logs landen je Tunnel unter ~/.local/state/ssh-tunnels/<name>.log; startet ein Tunnel nicht, sagt dir start das nach einer Sekunde und verweist auf diese Datei. Für Windows wählst du PowerShell und rufst das Skript als .\tunnels.ps1 start bzw. .\tunnels.ps1 restart -TunnelName db auf; health gibt es dort nicht.
Mehr zu den einzelnen Generatoren steht im Manual, strategische Hinweise und Stolperfallen in den Tipps & Tricks. Direkt loslegen kannst du im Tool.