Comment configurer le tunnel ssh pour transférer ssh?

13

J'ai un ordinateur avec Ubuntu derrière le routeur que je ne peux pas configurer. Cependant, je veux avoir un accès ssh à cet ordinateur. Je pense que c'est possible avec le tunneling ssh, mais je ne sais pas comment le faire. J'ai un autre serveur sur lequel j'aimerais configurer le tunneling. Comment faire? Ou peut-être avez-vous une autre idée sur la façon de résoudre ce problème?

J'ai essayé:

ssh -N user@my_server -L 22/localhost/8090

mais ça dit:

bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 22
Could not request local forwarding.
klew
la source

Réponses:

18

Vous lui demandez d'écouter sur votre port local 22 et de transmettre les connexions au port 8090 d'un système distant. Vous ne pouvez pas le faire, car votre port local 22 est déjà pris par votre serveur SSH local.

Je pense que ce que vous recherchez est un transfert à distance. Le remplacement -L 22:localhost:8090par -R 8090:localhost:22indique à l'hôte distant d'écouter sur le port 8090 et de transmettre les demandes à votre serveur SSH.

Si vous laissez la connexion en cours pour pouvoir vous connecter ultérieurement à partir d'un site distant, vous voudrez vous assurer que la connexion n'expire pas en raison de l'inactivité en ajoutant les options pertinentes ( -o TCPKeepAlive=yesou -o ServerAliveInterval=30)

Vous vous retrouverez donc avec quelque chose comme:

ssh -N user@my_server -R 8090:localhost:22 -o ServerAliveInterval=30

De plus, si l'un des sauts de réseau entre vous et le serveur est interrompu à un moment donné, la connexion sera interrompue malgré toutes les options KeepAlive que vous spécifiez, de sorte que vous souhaiterez peut-être ajouter cette commande à inittab, ou consulter le package daemontools ou votre distribution. équivalent, de sorte qu'il démarre toujours au démarrage et redémarre lorsqu'il se termine pour une raison autre que l'arrêt du système (ou vous pouvez l'exécuter à partir d'un script shell qui boucle indéfiniment, mais init ou daemontools sont des solutions plus propres).

David Spillett
la source
Cela fonctionne presque. Je peux me connecter à mon ordinateur, mais je ne peux le faire que lorsque je suis connecté au serveur. Je voudrais me connecter via ce port de partout.
klew
3
Si vous ajoutez l'adresse publique du serveur ou un caractère générique à la définition de redirection de port (-R 111.222.333.444:8090:localhost:22 ou -R *: 8090: localhost: 22), cela peut fonctionner, bien que ce genre de chose peut être désactivé sur le serveur. Si le serveur est celui que vous contrôlez, assurez-vous que l'option GatewayPorts est activée dans sshd_config.
David Spillett
J'ai écrit un script qui m'aide à faire des tunnels ssh, vous pouvez le vérifier sur: github.com/gdbtek/ssh-tunneling
Nam Nguyen
L'ajout GatewayPorts Yesà mon sshd_config m'a aidé à ouvrir le port au public.
Adam F
8

La raison pour laquelle vous ne pouvez pas le faire est que vous essayez de transférer le port 22 de l'ordinateur local vers le port 8090 sur le serveur distant et que quelque chose est déjà en cours d'exécution sur le port 22 sur le serveur local. Vous avez probablement un serveur SSH en cours d'exécution. Vous pouvez résoudre ce problème en remplaçant le 22 par une valeur différente. Vous pouvez vérifier si un port est libre en exécutant:

# netstat -lep --tcp

Cela répertorie toutes les sockets d'écoute, donc si le port n'est pas répertorié, alors c'est gratuit.

David Pashley
la source
3

J'utilise la commande lsof -i: PortNumber pour vérifier si le port est libre:

# lsof -i :2272

si le port est libre, vous ne verrez rien en sortie.

Taras
la source