Zum Inhalt springen

SSH/Tunnel: Unterschied zwischen den Versionen

Aus Foxwiki
K Textersetzung - „==== Links ====“ durch „=== Links ===“
DanielZorin (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
 
(7 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
'''topic''' - Kurzbeschreibung
'''{{BASEPAGENAME}}'''
== Beschreibung ==
== Beschreibung ==
== Installation ==
''ssh'' unterstützt TCP-Portweiterleitungen (Tunneling) über eine SSH-Verbindung.
 
* Die Verschlüsselung gilt zwischen lokalem System und SSH-Server (''user@server'')
* Der erste ''port'' ist der Listen-Port (Einstieg in die Weiterleitung), der zweite ''port'' ist der Ziel-Port auf ''host''
 
== Aufruf ==
== Aufruf ==
ssh -L [bind_address:]port:host:port user@server
<syntaxhighlight lang="bash" highlight="1" line copy>
ssh -L [bind_address:]listen_port:target_host:target_port user@server
</syntaxhighlight>
 
<syntaxhighlight lang="bash" highlight="1" line copy>
ssh -R [bind_address:]listen_port:target_host:target_port user@server
</syntaxhighlight>
{| class="wikitable options big"
!
! -L (Local)
! -R (Remote)
|-
| Bind-Adresse des Listening-Sockets
| Lokaler Host (SSH-Client)
| Remote-Host (SSH-Server)
|-
| Initiator der TCP-Verbindung zum exponierten Port
| Lokale Clients
| Clients auf dem Remote-Host oder dessen Netzwerk
|-
| Logische Verkehrsrichtung
| Lokal -> Remote
| Remote -> Lokal
|-
| Datenpfad
| Client (lokal) -> SSH-Client -> SSH-Tunnel (verschlüsselt) -> SSH-Server -> Zielservice
| Client (remote) -> SSH-Server -> SSH-Tunnel (verschlüsselt) -> SSH-Client -> Zielservice
|-
| Typischer Use-Case
| Zugriff auf interne Dienste im Remote-Netz (z. B. Datenbank, Webservice)
| Exponieren eines lokalen Dienstes über einen Remote-Host (z. B. bei NAT/Firewall-Restriktionen)
|}
 
Bei der Ausführung auf einem PC:
<syntaxhighlight lang="bash" highlight="" line copy>
ssh -p22 -N -L 55080:webserver.example.com:80 user@proxy.example.com
</syntaxhighlight>
 
* Der TCP-Connect zu webserver.example.com:80 wird vom SSH-Server (proxy.example.com) initiiert
----
<syntaxhighlight lang="bash" highlight="" line copy>
ssh -p22 -N -R 55080:webserver.example.com:80 user@proxy.example.com
</syntaxhighlight>
 
* Der TCP-Connect zu webserver.example.com:80 wird jetzt vom SSH-Client auf PC initiiert


ssh -R [bind_address:]port:host:port user@server


=== Optionen ===
=== Optionen ===
{| class="wikitable options big"
|-
! Option !! Beschreibung
|-
| -L [bind_address:]listen_port:target_host:target_port || Lokale Portweiterleitung einrichten.
|-
| -R [bind_address:]listen_port:target_host:target_port || Remote-Portweiterleitung einrichten.
|-
| -N || Keine Remote-Shell starten
|-
| -f || Nach erfolgreicher Authentifizierung in den Hintergrund gehen
|-
| -4 / -6 || IPv4 bzw. IPv6 erzwingen
|-
| -p port || SSH-Port des Servers festlegen
|-
| -o ExitOnForwardFailure=yes || Fehler melden, wenn Forwarding nicht eingerichtet werden kann
|-
| -g || Bei -L, lokale Listen-Sockets auch auf Nicht-Loopback binden
|}
=== Argumente ===
=== Argumente ===
{| class="wikitable options big"
|-
! Argument !! Bedeutung
|-
| user@server || SSH-Ziel (Tunnel-Endpunkt)
|-
| listen_port || Port, auf dem lokal (''-L'') oder remote (''-R'') gelauscht wird
|-
| host || Zielhost aus Sicht des Systems, das die Verbindung zu ''host:target_port'' herstellt
|-
| target_port || Zielport auf ''host''
|-
| bind_address || Adresse (Interface), an das der Listen-Socket gebunden wird
|}
=== Umgebung ===
=== Umgebung ===
=== Rückgabewert ===
=== Rückgabewert ===
Zeile 37: Zeile 120:


=== localhost:8000 auf server:80 weiterleiten ===
=== localhost:8000 auf server:80 weiterleiten ===
$ ssh -L 8000:localhost:80 server -N &
<syntaxhighlight lang="console" line>
$ ssh -L 8000:localhost:80 server -N &


$ netstat -anp --inet | egrep '(^Proto|8000)'  
$ netstat -anp --inet | egrep '(^Proto|8000)'  
Proto Recv-Q Send-Q Local Address          Foreign Address        State      PID/Program name
Proto Recv-Q Send-Q Local Address          Foreign Address        State      PID/Program name
tcp        0      0 127.0.0.1:8000          0.0.0.0:*              LISTEN    10843/ssh
tcp        0      0 127.0.0.1:8000          0.0.0.0:*              LISTEN    10843/ssh


$ fg  
$ fg  
ssh -L 8000:localhost:80 server -N
ssh -L 8000:localhost:80 server -N
[Strg-C]
[Strg-C]
Killed by signal 2.
Killed by signal 2.
</syntaxhighlight>


=== Alle Schnittstellen weiterleiten ===
=== Alle Schnittstellen weiterleiten ===
* Option <tt>GatewayPorts</tt> in der Server-Konfiguration entsprechend setzen (siehe Manpage)
* Option <tt>GatewayPorts</tt> in der Server-Konfiguration entsprechend setzen (siehe Manpage)
* Man wähle diese Option mit Bedacht
* Man wähle diese Option mit Bedacht
$ ssh -L *:8000:localhost:80 server -N -4 &
<syntaxhighlight lang="console" line>
$ ssh -L *:8000:localhost:80 server -N -4 &


$ netstat -anp --inet | egrep '(^Proto|8000)'  
$ netstat -anp --inet | egrep '(^Proto|8000)'  
Proto Recv-Q Send-Q Local Address          Foreign Address        State      PID/Program name
Proto Recv-Q Send-Q Local Address          Foreign Address        State      PID/Program name
tcp        0      0 0.0.0.0:8000            0.0.0.0:*              LISTEN    10906/ssh
tcp        0      0 0.0.0.0:8000            0.0.0.0:*              LISTEN    10906/ssh
</syntaxhighlight>


=== Umgekehrte Richtung ===
=== Umgekehrte Richtung ===
Benutzern auf ''server'' wird ermöglicht, über ''localhost:3306'' auf den MySQL-Server auf ''client'' zuzugreifen:
Benutzern auf ''server'' wird ermöglicht, über ''localhost:3306'' auf den MySQL-Server auf ''client'' zuzugreifen:
$ ssh -R 3306:localhost:3306 server  
<syntaxhighlight lang="console" line>
Last login: Sat Mar 11 23:24:20 2006 from 192.168.4.56
$ ssh -R 3306:localhost:3306 server  
Last login: Sat Mar 11 23:24:20 2006 from 192.168.4.56


$ netstat -an --inet | egrep '(^Proto|3306)'
$ netstat -an --inet | egrep '(^Proto|3306)'
Proto Recv-Q Send-Q Local Address          Foreign Address        State
Proto Recv-Q Send-Q Local Address          Foreign Address        State
tcp        0      0 127.0.0.1:3306          0.0.0.0:*              LISTEN
tcp        0      0 127.0.0.1:3306          0.0.0.0:*              LISTEN


exit
exit
logout
logout
Connection to server closed.
Connection to server closed.
</syntaxhighlight>


=== Doppelter SSH-Tunnel über zwei Konsolen ===
=== Doppelter SSH-Tunnel über zwei Konsolen ===
supportpc$ ssh -L 54321:localhost:54321 zwischennutzer@zwischen
<syntaxhighlight lang="console" line>
supportpc$ ssh -L 54321:localhost:54321 zwischennutzer@zwischen


zwischen$ ssh -L 54321:localhost:8080 zielnutzer@ziel  
zwischen$ ssh -L 54321:localhost:8080 zielnutzer@ziel  
</syntaxhighlight>


=== SSH-Tunnel über Zwischenrechner mit Zielrechner verbinden ===
=== SSH-Tunnel über Zwischenrechner mit Zielrechner verbinden ===
supportpc$ ssh -L 54322:ziel:22 zwischennutzer@zwischen
<syntaxhighlight lang="console" line>
supportpc$ ssh -L 54322:ziel:22 zwischennutzer@zwischen
</syntaxhighlight>


=== Problembehebung ===
=== Problembehebung ===
Zeile 88: Zeile 181:
{{Special:PrefixIndex/{{BASEPAGENAME}}/}}
{{Special:PrefixIndex/{{BASEPAGENAME}}/}}
==== Sicherheit ====
==== Sicherheit ====
==== Dokumentation ====
=== Dokumentation ===
===== RFC =====
===== RFC =====
{| class="wikitable sortable options"
{| class="wikitable sortable options"
Zeile 101: Zeile 194:


=== Links ===
=== Links ===
===== Projekt =====
==== Projekt ====
===== Weblinks =====
==== Weblinks ====


[[Kategorie:Netzwerk/Tunnel]]
[[Kategorie:SSH/Tunnel]]
[[Kategorie:SSH/Tunnel]]
</noinclude>
</noinclude>

Aktuelle Version vom 13. Februar 2026, 13:34 Uhr

SSH/Tunnel

Beschreibung

ssh unterstützt TCP-Portweiterleitungen (Tunneling) über eine SSH-Verbindung.

  • Die Verschlüsselung gilt zwischen lokalem System und SSH-Server (user@server)
  • Der erste port ist der Listen-Port (Einstieg in die Weiterleitung), der zweite port ist der Ziel-Port auf host

Aufruf

ssh -L [bind_address:]listen_port:target_host:target_port user@server
ssh -R [bind_address:]listen_port:target_host:target_port user@server
-L (Local) -R (Remote)
Bind-Adresse des Listening-Sockets Lokaler Host (SSH-Client) Remote-Host (SSH-Server)
Initiator der TCP-Verbindung zum exponierten Port Lokale Clients Clients auf dem Remote-Host oder dessen Netzwerk
Logische Verkehrsrichtung Lokal -> Remote Remote -> Lokal
Datenpfad Client (lokal) -> SSH-Client -> SSH-Tunnel (verschlüsselt) -> SSH-Server -> Zielservice Client (remote) -> SSH-Server -> SSH-Tunnel (verschlüsselt) -> SSH-Client -> Zielservice
Typischer Use-Case Zugriff auf interne Dienste im Remote-Netz (z. B. Datenbank, Webservice) Exponieren eines lokalen Dienstes über einen Remote-Host (z. B. bei NAT/Firewall-Restriktionen)

Bei der Ausführung auf einem PC:

ssh -p22 -N -L 55080:webserver.example.com:80 user@proxy.example.com
  • Der TCP-Connect zu webserver.example.com:80 wird vom SSH-Server (proxy.example.com) initiiert

ssh -p22 -N -R 55080:webserver.example.com:80 user@proxy.example.com
  • Der TCP-Connect zu webserver.example.com:80 wird jetzt vom SSH-Client auf PC initiiert


Optionen

Option Beschreibung
-L [bind_address:]listen_port:target_host:target_port Lokale Portweiterleitung einrichten.
-R [bind_address:]listen_port:target_host:target_port Remote-Portweiterleitung einrichten.
-N Keine Remote-Shell starten
-f Nach erfolgreicher Authentifizierung in den Hintergrund gehen
-4 / -6 IPv4 bzw. IPv6 erzwingen
-p port SSH-Port des Servers festlegen
-o ExitOnForwardFailure=yes Fehler melden, wenn Forwarding nicht eingerichtet werden kann
-g Bei -L, lokale Listen-Sockets auch auf Nicht-Loopback binden

Argumente

Argument Bedeutung
user@server SSH-Ziel (Tunnel-Endpunkt)
listen_port Port, auf dem lokal (-L) oder remote (-R) gelauscht wird
host Zielhost aus Sicht des Systems, das die Verbindung zu host:target_port herstellt
target_port Zielport auf host
bind_address Adresse (Interface), an das der Listen-Socket gebunden wird

Umgebung

Rückgabewert

Anwendung

Port-Weiterleitung

Hierbei richtet die Option -L eine lokale, und die Option '-R' eine entfernte (englisch remote) Port-Weiterleitung ein.
  • Der verschlüsselte Tunnel wird dabei immer zwischen dem eigenen Rechner und server hergestellt.
  • Die Verbindung vom Ende des Tunnels zu host läuft dagegen unverschlüsselt ab, und wird aus Sicht des betreffenden Systems angegeben, weswegen man host in den allermeisten Fällen wohl auf "localhost" setzen sollte.
  • Hierbei darf "localhost" nicht mit dem lokalen Rechner verwechselt werden.
  • Es handelt sich um "localhost" von server aus betrachtet, daher um den Server selbst.
Die Option -L oder -R gibt dabei die Richtung an, aus der der Tunnel benutzt werden kann.
  • Bei -L vom eigenen Rechner zum entfernten hin, bei -R in der entgegengesetzten Richtung. (Das merkt man sich am Besten als normaL und Rückwärts.)
Das erste port-Argument bezeichnet dabei den Einstiegsport in die Verbindung.
  • Zu beachten ist hierbei, dass die Öffnung eines privilegierten Ports, also unter 1024, nur dem Superuser root gestattet ist.
  • Man sollte also auf die höheren Ports ausweichen.
Mit dem optionalen Parameter bind_address kann man festlegen, auf welchen Netzwerkschnittstellen die Weiterleitung laufen soll, wobei localhost der Standard ist.
Ein * oder ein leeres bind_address-Argument vor dem Doppelpunkt bedeutet, dass die Weiterleitung an allen Schnittstellen läuft.
  • Möglicherweise funktioniert das nicht auf jedem Ubuntu-System auf Anhieb, da die IPv6-Adresse das irgendwie verhindert, weshalb man den SSH-Tunnel mit dem Argument -4 auf die IPv4-Schnittstellen beschränken muss.

Der zweite port-Parameter gibt schließlich an, auf welchen Port von host die Weiterleitung gehen soll.

Ein weiteres nützliches Argument ist die Option -N, die das Erzeugen einer Terminal-Sitzung auf dem entfernten System unterbindet, wenn man nur die Port-Weiterleitung benutzen möchte.

localhost:8000 auf server:80 weiterleiten

$ ssh -L 8000:localhost:80 server -N &

$ netstat -anp --inet | egrep '(^Proto|8000)' 
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:8000          0.0.0.0:*               LISTEN     10843/ssh

$ fg 
ssh -L 8000:localhost:80 server -N
[Strg-C]
Killed by signal 2.

Alle Schnittstellen weiterleiten

  • Option GatewayPorts in der Server-Konfiguration entsprechend setzen (siehe Manpage)
  • Man wähle diese Option mit Bedacht
$ ssh -L *:8000:localhost:80 server -N -4 &

$ netstat -anp --inet | egrep '(^Proto|8000)' 
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN     10906/ssh

Umgekehrte Richtung

Benutzern auf server wird ermöglicht, über localhost:3306 auf den MySQL-Server auf client zuzugreifen:

$ ssh -R 3306:localhost:3306 server 
Last login: Sat Mar 11 23:24:20 2006 from 192.168.4.56

$ netstat -an --inet | egrep '(^Proto|3306)'
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN

exit
logout
Connection to server closed.

Doppelter SSH-Tunnel über zwei Konsolen

supportpc$ ssh -L 54321:localhost:54321 zwischennutzer@zwischen

zwischen$ ssh -L 54321:localhost:8080 zielnutzer@ziel

SSH-Tunnel über Zwischenrechner mit Zielrechner verbinden

supportpc$ ssh -L 54322:ziel:22 zwischennutzer@zwischen

Problembehebung

Konfiguration

Dateien

Anhang

Siehe auch

Sicherheit

Dokumentation

RFC
RFC Titel
0000
Man-Page
Info-Page

Links

Projekt

Weblinks