it-swarm.com.de

ssh: Überprüfen Sie, ob ein Tunnel aktiv ist

Ich habe ein kleines Bash-Skript geschrieben, das einen SSH-Tunnel benötigt, um Daten von einem Remote-Server zu zeichnen, und fordert den Benutzer auf:

echo "Please open an ssh tunnel using 'ssh -L 6000:localhost:5432 example.com'"

Ich möchte prüfen, ob der Benutzer diesen Tunnel geöffnet hat, und mit einer Fehlermeldung beenden, wenn kein Tunnel vorhanden ist. Gibt es eine Möglichkeit, den ssh-Tunnel abzufragen, d. H. Zu prüfen, ob der lokale Port 6000 wirklich zu diesem Server getunnelt ist?

30
Adam Matan

Das ist mein Test. Ich hoffe es ist nützlich.

# $COMMAND is the command used to create the reverse ssh tunnel
COMMAND="ssh -p $SSH_PORT -q -N -R $REMOTE_Host:$REMOTE_HTTP_PORT:localhost:80 [email protected]$REMOTE_Host"

# Is the tunnel up? Perform two tests:

# 1. Check for relevant process ($COMMAND)
pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMAND

# 2. Test tunnel by looking at "netstat" output on $REMOTE_Host
ssh -p $SSH_PORT [email protected]$REMOTE_Host netstat -an | egrep "tcp.*:$REMOTE_HTTP_PORT.*LISTEN" \
   > /dev/null 2>&1
if [ $? -ne 0 ] ; then
   pkill -f -x "$COMMAND"
   $COMMAND
fi
27
Tommy

Netcat ist dein Freund:

nc -z localhost 6000 || echo 'no tunnel open'; exit 1
40
rwilhelm

Autossh ist die beste Option - der Überprüfungsprozess funktioniert nicht in allen Fällen (z. B. Zombie-Prozess, Netzwerkprobleme)

beispiel:

autossh -M 2323 -c arcfour -f -N -L 8088:localhost:80 Host2
17
Jeff

Dies ist eigentlich eher eine Frage des Serverfault-Typs, aber Sie können netstat verwenden.

so etwas wie:

 # netstat -lpnt | grep 6000 | grep ssh

Dadurch erfahren Sie, ob ein ssh-Prozess den angegebenen Port überwacht. Sie erhalten auch die PID des Prozesses. 

Wenn Sie wirklich prüfen möchten, ob der SSH-Prozess mit den richtigen Optionen gestartet wurde, können Sie den Prozess über PID in etwa wie nachschlagen 

# ps aux | grep PID
9
Igor Serebryany

Verwenden Sie autossh . Es ist das Werkzeug, das zur Überwachung der SSH-Verbindung gedacht ist.

6
plaes

stunnel ist ein gutes Werkzeug, um semipermanente Verbindungen zwischen Hosts herzustellen.

http://www.stunnel.org/

Dies sind detailliertere Schritte zum Testen eines SSH-Tunnels oder zur Fehlerbehebung. Sie können einige davon in einem Skript verwenden. Ich füge diese Antwort hinzu, weil ich die Verbindung zwischen zwei Anwendungen beheben musste, nachdem sie nicht mehr funktionierten. Nur nach dem ssh-Prozess zu greifen, war nicht genug, da er immer noch da war. Und ich konnte nc -z Nicht verwenden, da diese Option bei meiner Beschwörung von Netcat nicht verfügbar war.

Fangen wir von vorne an. Angenommen, es gibt eine Maschine, die als lokal mit der IP-Adresse 10.0.0.1 und eine andere als remote , am 10.0.3.12. Ich werde diese Hostnamen den Befehlen voranstellen, damit klar ist, wo sie ausgeführt werden.

Ziel ist es, einen Tunnel zu erstellen, der TCP) - Datenverkehr von der Loopback-Adresse auf dem Remotecomputer an Port 123 an den lokalen Computer an Port 456 weiterleitet die lokale Maschine:

local:~# ssh -N -R 123:127.0.0.1:456 10.0.3.12

Um zu überprüfen, ob der Prozess ausgeführt wird, können wir Folgendes tun:

local:~# ps aux | grep ssh

Wenn Sie den Befehl in der Ausgabe sehen, können wir fortfahren. Überprüfen Sie andernfalls, ob der SSH-Schlüssel auf der Fernbedienung installiert ist. Beachten Sie, dass ssh unter Ausschluss des Benutzernamens vor der Remote-IP den aktuellen Benutzernamen verwendet.

Als nächstes wollen wir überprüfen, ob der Tunnel auf der Fernbedienung geöffnet ist:

remote:~# netstat | grep 10.0.0.1

Wir sollten eine Ausgabe ähnlich der folgenden erhalten:

tcp  0  0  10.0.3.12:ssh  10.0.0.1:45988  ESTABLISHED

Es wäre schön, tatsächlich einige Daten zu sehen , die von der Fernbedienung zum Host übertragen werden. Hier kommt netcat ins Spiel. Unter CentOS kann es mit yum install nc Installiert werden.

Öffnen Sie zunächst einen Überwachungsport auf dem lokalen Computer:

local:~# nc -l 127.0.0.1:456

Stellen Sie dann auf der Fernbedienung eine Verbindung her:

remote:~# nc 127.0.0.1 123

Wenn Sie ein zweites Terminal für den lokalen Computer öffnen, wird die Verbindung angezeigt. Etwas wie das:

local:~# netstat | grep 456
tcp  0  0 localhost.localdom:456 localhost.localdo:33826 ESTABLISHED
tcp  0  0 localhost.localdo:33826 localhost.localdom:456 ESTABLISHED

Noch besser, geben Sie etwas auf der Fernbedienung ein:

remote:~# nc 127.0.0.1 8888
Hallo?
anyone there?

Sie sollten dies auf dem lokalen Terminal gespiegelt sehen:

local:~# nc -l 127.0.0.1:456
Hallo?
anyone there?

Der Tunnel funktioniert! Aber was ist, wenn Sie eine Anwendung namens appname haben, die Port 456 auf dem lokalen Computer überwachen soll? Beenden Sie nc auf beiden Seiten und führen Sie dann Ihre Anwendung aus. Sie können überprüfen, ob es den korrekten Port abhört, indem Sie this :

local:~# netstat -tulpn | grep LISTEN | grep appname
tcp  0  0  127.0.0.1:456  0.0.0.0:* LISTEN  2964/appname

Wenn Sie denselben Befehl auf der Fernbedienung ausführen, sollte übrigens sshd an Port 127.0.0.1:123 angezeigt werden.

1
Nagev

Wir können mit dem Befehl ps überprüfen

# ps -aux | grep ssh

Zeigt alle laufenden Shh-Dienste an und wir können den aufgeführten Tunneldienst finden 

0
Javeed Shakeel

Wenn Sie ssh im Hintergrund verwenden, verwenden Sie Folgendes:

Sudo lsof -i -n | egrep '\<ssh\>'
0
Alex Montoya
#!/bin/bash

# Check do we have tunnel to example.com server
lsof -i [email protected]:6000 > /dev/null

# If exit code wasn't 0 then tunnel doesn't exist.
if [ $? -eq 1 ]
then
  echo ' > You missing ssh tunnel. Creating one..'
  ssh -L 6000:localhost:5432 example.com
fi

echo ' > DO YOUR STUFF < '
0
sobi3ch