Woher weiß ich, ob mein SSH-Tunnel erfolgreich erstellt wurde?

21

Ich verlasse mich auf das folgende Skript, tunnel.shdas von anderen geschrieben wurde, um einen SSH-Tunnel am Leben zu erhalten:

#!/bin/bash
export SSH_HOST=tim@server 

if [ ! -f /tmp/.tunnel ] 
then
echo "Creat SSH tunnel"
ssh -f -D 9999 $SSH_HOST "if [ -f ~/.tunnel ]; then rm ~/.tunnel; fi; while [ ! -f ~/.tunnel ]; do echo > /dev/null; done" & 
touch /tmp/.tunnel 
else
echo "Close SSH tunnel"
ssh $SSH_HOST "touch ~/.tunnel" 
rm /tmp/.tunnel 
fi
exit

Um einen persistenten SSH-Tunnel zu erstellen, stelle ich nur eine Frage tunnel.sh. Der Tunnel wird nicht geschlossen, bis ich tunnel.shwieder erteile .

Ich habe mich gefragt, wie ich überprüfen kann, ob der SSH-Tunnel tatsächlich erfolgreich erstellt wurde.

Der Tunnel wird hauptsächlich zum Drucken von Dokumenten auf einigen Druckern im selben LAN wie der Server verwendet. Auf die Drucker kann nur über das LAN zugegriffen werden. Nach dem Erstellen eines Tunnels gibt es beim Drucken keine Probleme. Da ich jedoch physisch nicht anwesend bin, kann ich nicht überprüfen, ob die Dokumente tatsächlich gedruckt wurden.

Ich dachte, da ich jetzt dank des Tunnels im LAN bin, sollte meine externe IP die gleiche sein wie die des Servers. Aber eigentlich sind sie nicht dasselbe (ich habe sie durch herausgefunden wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'). Ich wundere mich warum? Wenn ich mit dem Tunnel eine Verbindung zu einer Website im Internet herstelle, ist der Server aufgrund des Tunnels zwischen mir und dem Server nicht der Mittelpunkt zwischen mir und der Internet-Website in der Verbindung?

Tim
quelle

Antworten:

25

Das ist viel komplizierter als es sein muss :-)

Starte den Tunnel:

ssh -f -N -D 9999 -M -S /tmp/ssh_tunnel_%h.sock -o ExitOnForwardFailure=yes $SSH_HOST && \
echo "ssh tunnel started successfully" || \
echo "ssh tunnel failed to start"

Stoppen Sie den Tunnel:

ssh -S /tmp/ssh_tunnel_%h.sock -O exit $SSH_HOST

.

Das ist alles was Sie tun müssen. Wenn Sie die Details wünschen, überspringen Sie unten.

Für deine zweite Frage die IP. Nein, deine IP ändert sich nicht. Sie haben lediglich einen SOCKS-Proxy über den Remote-Host erstellt. Ihr System verwendet diesen Proxy nicht automatisch, es sei denn, Sie teilen dies mit.

SSH-Erklärung
Gründe für das Starten des Tunnels::
-fSagt ssh, dass es sich im Hintergrund befinden soll. Es wird sich nur im Hintergrund abspielen, wenn es erfolgreich gestartet wird (kooperiert mit dem -ounten stehenden Argument).
-o ExitOnForwardFailure=yes: Dies weist ssh an, zu beenden, wenn der SOCKS-Proxy nicht eingerichtet werden kann.
-N: Führen Sie keinen Befehl aus. Wir möchten nur tunneln und nichts auf dem Remote-Host tun.
-D 9999: Ihr SOCKS-Proxy.
-M: Dies ist erforderlich, damit das -S-Argument hier funktioniert.
-S /tmp/ssh_tunnel_%h.sock: Dies weist es an, /tmp/ssh_tunnel_HOSTNAME.sock für seinen Kontrollsocket zu verwenden. Die -MOption teilt mit, dass ssh diesen Socket einrichten muss und keine Befehle an einen anderen ssh absetzen darf, der den Socket bereits abhört. Sie können diesen Socket verwenden, um zusätzliche Tunnel einzurichten, nachdem ssh bereits ausgeführt wurde. Das%h Verwendet den Hostnamen des Remote-Hosts als Teil des Dateinamens.

Argumente für das Stoppen des Tunnels::
-S /tmp/ssh_tunnel_%h.sockDies sollte offensichtlich sein. Da wir jedoch kein -M ausgegeben haben, bedeutet dies, dass ssh eine Verbindung zu dem bereits vorhandenen Socket herstellen und ihm mitteilen sollte, was zu tun ist, anstatt selbst etwas zu tun.
-O exit: Dies ist ein Teil der -S. Wir sagen der SSH, die auf der Buchse lauscht, dass sie gehen soll.
Das $SSH_HOSTwird hier noch benötigt. Selbst wenn Sie einen absoluten Socket-Pfad angeben, ohne %hden Dateinamen zu verwenden, möchte ssh dennoch, dass ein Remote-Host angegeben wird. Deshalb habe ich das %hin die Argumente gesteckt . Könnte es auch verwenden, wenn ssh nach dem Host fragt und die Dinge organisiert.

Patrick
quelle
5

Diese Art von Tunnel ändert Ihre IP-Adressinformationen nicht. Ihr Computer muss lediglich Port 9999 öffnen und Verbindungen zu diesem Port über Ihre SSH-Verbindung an den Remote-Computer (tim @ server) weiterleiten. Der einfachste Weg, um zu testen, ob die Verbindung hergestellt wurde, ist das Telnet an den Port, an dem die Weiterleitung erstellt wurde (in Ihrem Beispiel 9999):

$ telnet localhost 9999
Server wird versucht ...
Verbindung zum Server hergestellt.
Escape-Zeichen ist '^]'.

Wenn Sie die Meldung "Verbunden mit Server" erhalten Nachricht, das heißt, Ihr Tunnel ist in Betrieb. Wenn stattdessen Folgendes angezeigt wird: "Verbindung zum Remote-Host nicht möglich: Verbindung abgelehnt", ist Ihr Tunnel nicht aktiv.

Was Ihre zweite Frage betrifft, wird Ihr Browser den Tunnel für Ihren Browser nur verwenden, wenn Sie es ihm mitteilen. In den Netzwerkeinstellungen des Browsers können Sie Proxyeinstellungen konfigurieren und localhost: 9999 als socks5-Proxy angeben. Anschließend sollten Ihre Webverbindungen den ssh-Tunnel verwenden und scheinbar von der IP-Adresse des Servers stammen.

gabe.
quelle
+1 Danke! (1) Wenn ich auf einem Drucker im LAN drucke, woher weiß er, dass er zu Port 9999 wechselt, dh den Tunnel verwendet? Sonst nichts? (2) Gibt es Arten von Tunneln, die meine IP-Adressinformationen ändern?
Tim
@ Wahrscheinlich wurde dieser bestimmte Drucker so konfiguriert, dass er an eine bestimmte IP-Adresse und einen bestimmten Port druckt. Dies hängt davon ab, wie Ihr Drucker eingerichtet ist. Normalerweise können Sie bei der Definition eines Druckers beides angeben. Ja, es gibt Arten von Tunneln, denen eigene IP-Informationen zugeordnet sind. Generell gilt für diese Sie eine separate tun / tap erstellen en.wikipedia.org/wiki/TUN/TAP - Schnittstelle , die eine eigene IP - Adresse an sie hat, und die gesamten Verkehr, der von dieser Adresse erlischt erscheint aus einem anderen Netz kommen .
gabe.
Vielen Dank! In den Einstellungen meines Firefox wähle ich unter Erweitert -> Verbindung -> Einstellungen die manuelle Proxy-Konfiguration und tippe "localhost" für HTTP-Proxy und "9999" für dessen Port ein. Danach kann ich keine Verbindung zu einer Website in Firefox herstellen. Ich wundere mich warum?
Tim
@ Tim es ist ein wenig verwirrend ... das Richtige zu setzen ist: SOCKS Host, und nicht HTTP Proxy. Ich hatte das gleiche Problem, als ich es zum ersten Mal versuchte.
gabe.
1

In meinem Fall (Google Chrome unter Ubuntu 14.10) ändert sich meine externe Adresse zumindest im Browser. Google einfach "Was ist meine IP-Adresse?" mit und ohne Proxy-Verbindung.

Versuchen Sie außerdem, den Tunnel zu zerstören, nachdem Sie den Proxy eingerichtet haben, und prüfen Sie, ob Sie weiterhin Datenverkehr erhalten. Wenn ich das tue, gibt Chrome den Fehler "Verbindung zum Proxy-Server nicht möglich" zurück.

Eine andere Möglichkeit: Erstellen Sie nach dem Tunneling zum Remote-Host eine neue SSH-Sitzung und führen Sie sie aus tcpdump -A dst port 80. Navigieren Sie dann zu einer Seite, und Sie sollten den entsprechenden Datenverkehr im Terminal sehen.

onlyanegg
quelle