Das Tunneln von Daten über SSH ist ziemlich einfach:
ssh -D9999 [email protected]
Richtet Port 9999 auf Ihrem localhost
als Tunnel ein example.com
, aber ich habe einen genaueren Bedarf:
- Ich arbeite vor Ort an
localhost
host1
ist zugänglich fürlocalhost
host2
Akzeptiert nur Verbindungen vonhost1
- Ich muss einen Tunnel von
localhost
bis erstellenhost2
Eigentlich möchte ich einen "Multi-Hop" SSH-Tunnel erstellen. Wie kann ich das machen? Im Idealfall möchte ich dies tun, ohne auf einem der Computer Superuser sein zu müssen .
host2
Weiterleitung verweigertAntworten:
Sie haben grundsätzlich drei Möglichkeiten:
Tunnel von
localhost
bishost1
:Wie oben erwähnt, wird die Verbindung von
host1
bishost2
nicht gesichert.Tunnel von
localhost
nachhost1
und vonhost1
nachhost2
:Dadurch wird ein Tunnel von
localhost
bishost1
und ein weiterer Tunnel vonhost1
bis geöffnethost2
. Doch der Hafen9999
zuhost2:1234
können von jedermann verwendet werdenhost1
. Dies kann ein Problem sein oder auch nicht.Tunnel von
localhost
nachhost1
und vonlocalhost
nachhost2
:Dadurch wird ein Tunnel von
localhost
nach geöffnet ,host1
über den der eingeschaltete SSH-Diensthost2
verwendet werden kann. Dann wird ein zweiter Tunnel vonlocalhost
bishost2
durch den ersten Tunnel geöffnet .Normalerweise würde ich mit der Option gehe 1. Wenn die Verbindung von
host1
zuhost2
Bedürfnissen gesichert wird, gehen mit der Option 2. Option 3 in erster Linie nützlich ist , einen Dienst zuzugreifen auf ,host2
dass nur erreichbar von isthost2
selbst.quelle
-A
Option ssh über die Verbindungen weiterleiten .-f
, wird der Hintergrund sofort lokalssh -f -L 9999:localhost:9999 host1
angezeigt und die Verbindung wird wiederhergestellt, wenn Sie im ersten Fall die Tastenkombination Strg-C gedrückt haben. Oder ergänzen Sie-f
den ursprünglichen Double-SSH-Befehl, wenn Sie ihn zum ersten Mal ausführen und alles sofort im Hintergrund ausführen.Es gibt eine hervorragende Antwort, die die Verwendung der
ProxyCommand
Konfigurationsanweisung für SSH erklärt :Fügen Sie dies zu Ihrer hinzu
~/.ssh/config
(sieheman 5 ssh_config
für Details):Dann
ssh host2
wird automatisch durchtunnelnhost1
(funktioniert auch mit X11 - Forwarding etc.).Dies funktioniert auch für eine ganze Klasse von Hosts, z. B. nach Domain identifiziert:
Aktualisieren
OpenSSH 7.3 führt eine
ProxyJump
Direktive ein, die das erste Beispiel vereinfachtquelle
ssh
, einschließlichgit
,sftp
usw. afaik.ssh -F /path/to/altconfig
. Beachten Sie, dass dies das gesamte System ignoriert/etc/ssh/ssh_config
.OpenSSH v7.3 unterstützt einen
-J
Schalter und eineProxyJump
Option, die einen oder mehrere durch Kommas getrennte Sprung-Hosts zulassen. Sie können dies also jetzt einfach tun:quelle
Wir haben ein SSH-Gateway in unser privates Netzwerk. Wenn ich draußen bin und eine Remote-Shell auf einem Computer im privaten Netzwerk haben möchte, muss ich in das Gateway und von dort auf den privaten Computer ssh.
Um diesen Vorgang zu automatisieren, verwende ich das folgende Skript:
Was ist los:
quelle
Nachdem ich das Obige gelesen und alles zusammengeklebt habe, habe ich das folgende Perl-Skript erstellt (speichere es als mssh in / usr / bin und mache es ausführbar):
Verwendungszweck:
So greifen Sie über HOSTA und HOSTB (gleicher Benutzer) auf HOSTC zu:
So greifen Sie über HOSTA und HOSTB auf HOSTC zu und verwenden nicht standardmäßige SSH-Portnummern und verschiedene Benutzer:
So greifen Sie über HOSTA und HOSTB auf HOSTC zu und verwenden die X-Weiterleitung:
So greifen Sie über HOSTA und HOSTB auf Port 8080 auf HOSTC zu:
quelle
mssh HOSTA HOSTD
Sie tatsächlich bei HOSTB enden (und vielleicht nicht erkennen ..)Diese Antwort ähnelt kynan, da ProxyCommand verwendet wird. Aber es ist bequemer, IMO zu verwenden.
Wenn Sie Netcat auf Ihren Hop-Maschinen installiert haben, können Sie dieses Snippet zu Ihrer ~ / .ssh / config hinzufügen:
Dann
werde tun, was du gefragt hast.
Ich bin auf der Suche nach dem ursprünglichen Ort hierher gekommen, an dem ich diesen Trick gelesen habe. Ich werde einen Link posten, wenn ich ihn finde.
quelle
Ich habe getan, was ich glaube, mit dem du machen wolltest
Ich werde nach beiden Passwörtern gefragt, dann kann ich localhost: 9999 als SOCKS-Proxy für host2 verwenden. Es ist das nächste Beispiel, das ich mir vorstellen kann.
quelle
Mittel binden an localhost: 9999 und alle an localhost: 9999 gesendeten Pakete leiten sie an host2: 80 weiter
Bedeutet, dass jedes von host1: 9999 empfangene Paket an localhost: 9999 weitergeleitet wird
quelle
channel 3: open failed: administratively prohibited: open failed
Fehlermeldung.Sie sollten in der Lage sein, über die Portweiterleitung auf einen Dienst
host2
von zuzugreifenlocalhost
. Ein guter Leitfaden befindet sich hier . Auszug:Ersetzen Sie
localhost
in Ihrer Besetzung im Beispiel mithost2
undhost
mithost1
.quelle
In dieser Antwort werde ich ein konkretes Beispiel durchgehen. Sie müssen nur die Hostnamen, Benutzernamen und Kennwörter der Computer durch Ihre ersetzen.
Problemstellung
Angenommen, wir haben die folgende Netzwerktopologie:
Nehmen wir der Vollständigkeit halber an, wir haben die Hostnamen, Benutzernamen und Passwörter der folgenden Computer:
Ziel: Wir wollen einen SOCKS - Proxy einrichten, die auf Port hört
9991
vonLocalPC
so dass jedes Mal , wenn eine Verbindung aufLocalPC
von Port initiiert wird9991
es durchläuftmit.edu
dannhec.edu
.Anwendungsbeispiel: Verfügt
hec.edu
über einen HTTP-Server, auf den aus Sicherheitsgründen nur unter http://127.0.0.1:8001 zugegriffen werden kann. Wir möchten in der Lage sein, http://127.0.0.1:8001 zu besuchen, indem wir einen Webbrowser auf öffnenLocalPC
.Aufbau
In
LocalPC
, add in~/.ssh/config
:LocalPC
Führen Sie dann im Terminal von Folgendes aus:Es fragt Sie nach dem Passwort von
bob
onmit.edu
(dhdylan123
) und dann nach dem Passwort vonjohn
onhec.edu
(dhdoe456
).Zu diesem Zeitpunkt wird der SOCKS-Proxy nun auf dem Port
9991
von ausgeführtLocalPC
.Wenn Sie beispielsweise eine Webseite
LocalPC
mit dem SOCKS-Proxy besuchen möchten , können Sie in Firefox Folgendes tun:Einige Bemerkungen:
~/.ssh/config
,HEC
ist der Verbindungsname: Sie können ihn in einen beliebigen Namen ändern.-D9991
sagtssh
ein SOCKS4 Proxy auf Port einzurichten9991
.quelle
Wenn Sie SSH auf beiden Computern ausführen können, lesen Sie die ProxyCommand-Direktive von ssh. Auf diese Weise können Sie direkt von localhost zu host2 wechseln (mit einem einfachen Befehl, wenn Sie öffentliche Schlüssel verwenden !!). Dann können Sie mit host2 machen, was Sie wollen.
http://www.statusq.org/archives/2008/07/03/1916/
quelle
Die Option 2 der besten Antwort kann für andere SSH-Benutzer als die aktuelle verwendet werden, auch bekannt als: user @ host
quelle
In meinem Fall habe ich getan
wo
host2:8890
läuft auf einem Jupyter Notebook.Dann habe ich Firefox für die Verwendung
localhost:9999
als SOCKS-Host konfiguriert .Jetzt habe ich das Notebook auf meinem Computer , auf
host2
das Firefoxlocalhost:8890
zugreifen kann.quelle
Die drei in der akzeptierten Antwort genannten Optionen haben bei mir überhaupt nicht funktioniert. Da ich über beide Hosts nicht viel Erlaubnis habe und es so aussieht, als hätte unser DevOps-Team ziemlich strenge Regeln, wenn es um die Authentifizierung und die Durchführung von MFA geht. Irgendwie können die obigen Befehle mit unserer Authentifizierung nicht gut umgehen.
Der Kontext ist jedoch den obigen Antworten sehr ähnlich: Ich kann nicht direkt auf den Produktionsserver zugreifen und muss einen Sprung mit einem Jump-Server machen.
Noch eine andere Lösung - eine naive
Am Ende habe ich es auf sehr naive Weise gemacht: Anstatt zu versuchen, alle Befehle auf meinem Laptop auszuführen, führe ich die folgenden Befehle auf jedem Computer aus :
ssh -v -L 6969:localhost:2222 -N your-protected.dest.server
. Wenn Sie zur Eingabe eines Kennworts aufgefordert werden, geben Sie es ein.ssh -v -L 6969:localhost:6969 -N your-jump-server.host.name
. Dadurch werden alle Ihre Anforderungen an Port 6969 Ihres Laptops an den Jump-Server weitergeleitet. Anschließend leitet der Jump-Server, da wir ihn in unserem vorherigen Schritt konfiguriert haben, Anforderungen von Port 6969 erneut an Port 2222 auf dem geschützten Zielserver weiter.Sie sollten sehen, dass der Befehl dort "hängt", nachdem Sie eine Nachricht gedruckt haben - es bedeutet, dass sie funktionieren! Eine Ausnahme - Sie sollten keine Fehlermeldung sehen
Could not request local forwarding.
, wenn Sie das sehen, dann funktioniert es immer noch nicht :(. Sie können jetzt versuchen, eine Anfrage auf Port 6969 von Ihrem Laptop aus zu starten und zu sehen, ob sie funktioniert.Hoffentlich können Sie dies versuchen, wenn Sie jemand sind, bei dem alle oben genannten Methoden fehlgeschlagen sind.
quelle