Comment configurer une connexion SSH inverse à l'ordinateur qui se connecte?


20

Je vais déployer un certain nombre de machines dans un avenir proche qui seront derrière des routeurs. Il ne sera pas possible de configurer un DNS dynamique sur chaque routeur et transfert de port, donc y a-t-il un moyen de configurer ces machines pour établir une connexion TCP avec mon ordinateur, puis demander à mon ordinateur d'établir une connexion SSH avec l'ordinateur distant via cette connexion?

C'EST À DIRE:

COMPUTER A OPENS TCP CONNECTION TO COMPUTER B
COMPUTER B OPENS SSH CONNECTION OVER THE EXISTING TCP CONNECTION TO COMPUTER A
COMPUTER B NOW HAS SSH CONNECTION TO COMPUTER A

Est-ce possible, et si oui, comment puis-je le faire?


Réponses:


21

Dans le jeu /etc/ssh/sshdde l' ordinateur B :

AllowTcpForwarding yes
TCPKeepAlive yes

Depuis l' ordinateur A :

$ ssh -R 2222:localhost:22 ip.of.computer.b

Depuis l' ordinateur B :

$ ssh localhost -p 2222

Notez que 2222 est un numéro arbitraire de port élevé que j'ai choisi. Ce port sur l'ordinateur B sera ensuite retransmis via la connexion SSH initialisée sur l'ordinateur A vers le port 22. Si vous avez plusieurs machines, vous devez utiliser un port différent pour chaque machine.

Pour votre cas d'utilisation, vous voudrez probablement l'exécuter à partir d'un script afin de pouvoir en faire un démon et essayer régulièrement de vous reconnecter si le lien est supprimé. Vous voudrez probablement un compte spécial avec un shell uniquement /bin/truesur l' ordinateur B pour gérer les connexions entrantes. Vous pouvez ensuite configurer soit une seule touche, soit plusieurs touches pour chaque machine qui sont autorisées à "appeler à la maison".

Sur l' ordinateur A vous pourriez trouver -n, -Net -Toptions utiles pour le déconnecter de l' entrée locale (il peut fonctionner en arrière - plan), essayez de ne pas exécuter une commande à distance, il suffit d' ouvrir le tunnel, et ne pas créer un téléscripteur.

La plupart des méthodes normales de création d'un démon ne fonctionnent pas très bien avec la configuration d'un tunnel réseau comme celui-ci. Un problème de connectivité réseau l'obligerait à abattre le mur pour passer. Une simple boucle avec un sommeil à attendre devrait faire l'affaire. Dix minutes est un bon chiffre car cela n'inonde pas le réseau et les fichiers journaux avec des tentatives s'il y a un problème (comme l' ordinateur B hors ligne), mais cela vous permet de revenir assez rapidement si la connexion est interrompue.

#/bin/sh
while true; do
    sleep $((60*10))
    ssh -nNT -R 2222:localhost:22 ip.of.computer.b
done

Un script comme celui-ci peut être exécuté lancé au démarrage /etc/rc.local. Votre premier changement de se connecter à la machine commencera après environ dix minutes après l' ordinateur A bottes.


1
Agréable. Donc, je voudrais que chaque machine distante tunnelise le port SSH local vers un port de la machine locale? Il peut être judicieux que chaque machine ne tunnelise la connexion qu'à la demande. Je pourrais peut-être faire en sorte que chaque machine ouvre une connexion HTTP permanente et envoie des données XML lorsque je souhaite qu'elle tente une connexion inverse, afin de faciliter la gestion (et de ne pas obstruer tous mes ports;]). Merci!
Naftuli Kay

@TKKocheran: Il y a pas mal de ports parmi lesquels choisir ... en particulier plus que vous n'aurez de kiosques. En quoi le fait de garder un tunnel SSH ouvert est-il pire que de maintenir une connexion http ouverte?
Caleb

Je suppose que vous avez raison, je pourrais simplement le faire, mais je devrais ensuite mapper les ports aux machines et me rappeler lequel est lequel, tandis que l'autre route serait instanciée paresseusement, c'est-à-dire créer uniquement un tunnel SSH lorsqu'on lui demandera.
Naftuli Kay

1
@TKKocheran: Vous devriez faire le mappage de toute façon, sinon même votre instanciation paresseuse se heurterait à des situations où ils essaient de s'encombrer.
Caleb

1
Je ne sais pas si cela est généralement applicable, mais ma configuration sshd est maintenant /etc/ssh/sshd_config
activée
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.