ssh: vérifier si un tunnel est vivant
j'ai écrit un petit script bash qui nécessite un tunnel ssh pour tirer des données à partir d'un serveur distant, de sorte qu'il invite l'utilisateur:
echo "Please open an ssh tunnel using 'ssh -L 6000:localhost:5432 example.com'"
je voudrais vérifier si l'Utilisateur a ouvert ce tunnel, et sortir avec un message d'erreur si aucun tunnel n'existe. Y a-t-il un moyen d'interroger le tunnel ssh
, c'est-à-dire de vérifier si le port 6000 local est vraiment tunnel vers ce serveur?
9 réponses
C'est mon test. J'espère que c'est utile.
# $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 $USER_NAME@$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 $USER_NAME@$REMOTE_HOST netstat -an | egrep "tcp.*:$REMOTE_HTTP_PORT.*LISTEN" \
> /dev/null 2>&1
if [ $? -ne 0 ] ; then
pkill -f -x "$COMMAND"
$COMMAND
fi
Netcat est votre ami:
nc -z localhost 6000 || echo 'no tunnel open'; exit 1
Autossh est la meilleure option de vérification des processus ne fonctionne pas dans tous les cas (par exemple, zombie processus, réseau liées à des problèmes)
exemple:
autossh -M 2323 -c arcfour -f -N -L 8088:localhost:80 host2
c'est plus une question de type serverfault, mais vous pouvez utiliser netstat.
quelque chose comme:
# netstat -lpnt | grep 6000 | grep ssh
cela vous indiquera s'il y a un processus SSH qui écoute sur le port spécifié. il vous indiquera également le PID du processus.
si vous voulez vraiment vérifier que le processus ssh a été démarré avec les bonnes options, vous pouvez alors regarder le processus par PID dans quelque chose comme
# ps aux | grep PID
stunnel est un bon outil pour établir des connexions semi-permanentes entre les hôtes.
#!/bin/bash
# Check do we have tunnel to example.com server
lsof -i tcp@localhost: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 < '
ce sont des étapes plus détaillées pour tester ou dépanner un tunnel SSH. Vous pouvez les utiliser dans un script. J'ajoute cette réponse parce que j'ai dû dépanner le lien entre deux applications après qu'elles aient cessé de fonctionner. Il ne suffisait pas de se réjouir du processus ssh, car il était toujours là. Et je ne pouvais pas utiliser nc -z
parce que cette option n'était pas disponible sur mon incantation de netcat.
commençons par le début. Supposons qu'il y ait une machine, qui s'appellera local avec l'adresse IP 10.0.0.1 et un autre, appelé remote , à 10.0.3.12. Je vais préparer ces noms d'hôtes, aux commandes ci-dessous, donc c'est évident où ils sont exécutés.
le but est de créer un tunnel qui acheminera le trafic TCP de l'adresse de boucle sur la machine distante sur le port 123 à la machine locale sur le port 456. Cela peut être fait avec la commande suivante sur le local machine:
local:~# ssh -N -R 123:127.0.0.1:456 10.0.3.12
pour vérifier que le processus est en cours, nous pouvons faire:
local:~# ps aux | grep ssh
si vous voyez la commande dans la sortie, nous pouvons continuer. Sinon, vérifiez que la clé SSH est installée dans la télécommande. Notez qu'en excluant le nom d'utilisateur avant L'IP distante, ssh utilise le nom d'utilisateur courant.
Ensuite, nous voulons vérifier que le tunnel est ouvert sur la télécommande:
remote:~# netstat | grep 10.0.0.1
nous devrions obtenez une sortie similaire à celle-ci:
tcp 0 0 10.0.3.12:ssh 10.0.0.1:45988 ESTABLISHED
serait bien de réellement voir quelques données allant de la télécommande à l'hôte. C'est ici que netcat entre en jeu. Sur CentOS il peut être installé avec yum install nc
.
d'abord, ouvrez un port d'écoute sur la machine locale:
local:~# nc -l 127.0.0.1:456
puis faire une connexion sur la télécommande:
remote:~# nc 127.0.0.1 123
si vous ouvrez un second terminal à la machine locale, vous pouvez voir la connexion. Quelque chose comme ceci:
local:~# netstat | grep 456
tcp 0 0 localhost.localdom:456 localhost.localdo:33826 ESTABLISHED
tcp 0 0 localhost.localdo:33826 localhost.localdom:456 ESTABLISHED
Mieux encore, allez-y et tapez quelque chose sur la télécommande:
remote:~# nc 127.0.0.1 8888
Hallo?
anyone there?
vous devriez voir cela se refléter sur le terminal local:
local:~# nc -l 127.0.0.1:456
Hallo?
anyone there?
le tunnel fonctionne! Mais que faire si vous avez une application, appelée appname , qui est censée être à l'écoute sur le port 456 de la machine locale? Terminez nc des deux côtés puis lancez votre application. Vous pouvez vérifier qu'il écoute sur le port correct avec ce :
local:~# netstat -tulpn | grep LISTEN | grep appname
tcp 0 0 127.0.0.1:456 0.0.0.0:* LISTEN 2964/appname
soit dit en passant, exécuter la même commande sur la télécommande devrait afficher sshd listening sur le port 127.0.0.1:123.
nous pouvons vérifier en utilisant la commande ps
# ps -aux | grep ssh
montrera tout shh service en cours d'exécution et nous pouvons trouver le service tunnel listée