histoire de tunnels 2

Gazette Linux n° 177 - Août 2010

par Henry Grebler (Copyright © 20110)

traduction par Sofiane REFES(tous droits réservés) sofiane.refes CHEZ gmail POINT com

relecture Gaël Montreuil g43l CHEZ yahoo POINT fr


Dans l'article précédent, Histoire de tunnels 1 J'ai Décrit comment utiliser des tunnels SSH et une troisième machine pour fournir L'accès au réseau d'une machine à une deuxième machine qui n'était pas directement accessible. Le scénario d'aujourd'hui est tout à fait Différent.

Nous voulons l'accès commode à une machine qui peut seulement être atteinte par la navigation d'une chaîne de machines intermédiaires.

Tandis que la tâche précédente pourrait être accomplie avec une seule commande, la tâche actuelle est beaucoup plus formidable et exige une magie plus puissante.

Cet article supposera que vous êtes très familiers de SSH. Je ne répèterai pas les points que j'ai faits dans l'article précédent.

Mots-clés: SSH tunnels, expect

Le Scénario

Les réseaux entrent dans toutes les formes et tailles .Je suis sûr que le réseau original a été conçu.Je suppose que, au fil du temps, une machine a été ajoutée ici, un autre a été enlevé là - beaucoup comme un costume bien aimé pourrait être modifié comme les âges de ses propriétaire et change de forme.

Au moment où je suis arrivé, le réseau semblait tout à fait complexe. Cela Était assez facile d'obtenir des machines plus récentes. Mais quelques anciennes machines ont exigé quelques claquettes sérieuses avant qu'elles ne puissent être Atteintes.

Diagram 1
target	la machine sur la quelle je veux travailler
jump1	une  machine intermédiaire
jump2	une autre machine intermédiaire machine
laptop	mon ordinateur portable

Si j'avais besoin de se rendre à la machine cible une ou deux fois ,je voudrais juste ssh depuis mon ordinateur vers jump1; puis de nouveau à partir de là vers jump2; et finalement à partir de là vers la machine cible

Mais je savais que je visiterais target plusieurs fois au cours de la semaine ou des deux semaines prochaines. Et plus loin, et plus intéressant, j'aurais besoin de transférer des fichiers entre mon ordinateur portable et l'ordinateur cible.

Encore une fois, pour le transfert de fichiers, la plupart des gens vous suggère dans l'exaspération de simplement les transférer d'une machine à l'autre jusqu'à ce qu'ils atteignent la destination requise.

Analyse De la Tâche

Cette tâche fournit un "compare and contrast " educatif avec la tâche De l'article précédent.

La première étape

J'exécute la commande suivante sur mon ordinateur portable :

	ssh -L 9922:localhost:9822 jump1

La commande dit d'établir une connexion vers SSH jump1. "Pendant que vous y êtes, je veux que vous écoutiez sur un port numéroté 9922 sur localhost (ie ordinateur portable).Si quelqu'un fait une connexion à ce port, connecter l'appel par le biais du port 9822 sur jump1."

Pourquoi 9922? Le numéro de port est arbitraire, mais j'utilise la forme XX22pour me rappeler que cela se rapporte à SSH.

Pourquoi 9822? Il semble que ce numéro de port est aussi arbitraire que 9922, mais ce n'est pas entièrement vrai. Nous allons examiner un peu plus tard.

Jusqu'à présent, nous n'avons pas obtenu grand-chose.

La deuxième étape

La commande précédente a atterri sur moi jump1,où j'exécute la commande suivante:
	ssh -L 9822:localhost:9722 jump2

Vous devriez pouvoir mettre au point ce que cette commande fait. Bien sûr cette fois, localhost signifie jump1.

Le numéro de port sur ​​la gauche (dans ce cas 9822) doit être le même que celui sur le droit de la commande précédente.

Avant d'expliquer plus, je vais juste ajouter une commande.

Toutes les trois étapes

À ce moment là, la dernière étape devrait être évidente. Pour rendre l'analyse ultérieure plus facile à suivre, je vais énumérer toutes les trois commandes, puis on en discutera.

	ssh -L 9922:local	host:9822 jump1
	ssh -L 9822:localhost:9722 jump2
	ssh -L 9722:localhost:22 target

Diagram 2

Les trois commandes m'aideront à trouver la machine cible, où je peux faire tout le travail que je dois faire. C'est un effet. L'effet de bord est plus intéressant.

Assez souvent, lorsque je visite une machine, je tiens à lancer plusieurs sessions, et pas seulement une seule session. Pour démarrer une deuxième session, J'ai pu j'ai pu utiliser un ensemble similaire de commandes ssh (avec ous sans l'option -L).Ou bien, sur mon portable, je pouvais faire:

	ssh -p 9922 localhost

La référence au port 9922 sur localhost me connecte au port 9822 sur jump1, qui m'a automatiquement connecté au port 22 sur jump2.

Les tunnels individuelles se combinent pour me fournir un «super-tunnel".

Diagram 3

Remarques

Comment y arriver automatiquement

C'est tout ce dont vous avez besoin pour améliorer sensiblement votre vie lorsque vous rencontrez un scénario similaire.

Qu'est-ce que c'est? Vous pensez qu'il ya encore trop de frappe? Vous en voulez plus?

Oh, très bien.

Voici un script attendu et assez long :

#!/usr/local/bin/expect -f
#	ssh_tunnel.exp - ssh vers la machine distante via des machines intermédiaires

set timeout -1

	set HOSTS [list jump1 jump2 target]
	set PORTS [list 9922 9822 9722 9622 9522 9422 9322 9122 9022]

#  Le port de la dernière machine doit être de 22

	set jj [llength  $HOSTS]
	lset  PORTS $jj 22

	set i 0
	foreach HOST $HOSTS {
		puts "HOST= $HOST PORT= [lindex $PORTS $i]"
		set i [expr {$i + 1}]
	}

	send_user "\n"

#----------------------------------------------------------------------#
#	Procédure pour obtenir une machine
#----------------------------------------------------------------------#

proc gotomachine {lport rport host} {
	send_user "Getting on to machine $host ... "
	send -- "ssh -L $lport:localhost:$rport $host\r"
	log_user 0
	expect -exact "Starting .bash_profile"
	expect -exact "Finished .bash_profile"
	expect -exact "-bash"
	send -- "env | grep SSH_CONNECTION\r"
	log_user 1
	send_user "done.\n"
}

#----------------------------------------------------------------------#
match_max 100000

	set dollar "$"
	spawn bash
	log_user 0
	expect -exact "-bash"
	send  -- "unset HISTFILE\r"
	expect -exact "-bash"
	send  -- "unset ignoreeof\r"
	expect -exact "-bash"
	send  -- "PS1='\n vous avez besoin d'un autre exit pour revenir"
	send  -- "vers où vous avez commencé\n utilise ^D. $ '\n"
	expect -exact "started" 
	log_user 1
	set i 0
	foreach HOST $HOSTS {
		set lport [lindex $PORTS $i]
		set i [expr {$i + 1}]
		gotomachine $lport [lindex $PORTS $i] $HOST
	}

	puts "
Houston, ceci est la Base de Tranquillité. L'aigle a atterri. 
Vous devriez maintenant pouvoir obtenir à cette machine ($HOST) 
en utilisant directement :

	ssh -p [lindex $PORTS 0] localhost

Pour déconnecter le tunnel, utilisez la commande suivante à plusieurs reprises:
"
	puts {	[ "$SSH_CONNECTION" = '' ] || exit }
	puts "
Bonne chance!
"
	interagir
	exit

Remarques

Tying up Loose Ends

Quand j'ai développé la solution sur ma machine, j'avais la fausse impression que je n'avais pas d'autre choix que d'utiliser des numéros de ports différents. Comme écrit dans cet article, j'ai dit que les ports ne doivent être uniques sur une seule machine - et puis je me suis corrigé et dit qu'ils doivent être uniques sur une seule interface.

Cela ouvre la possibilité d'une simplification de l'écriture ssh_tunnel.exp - au détriment de la mise en place des interfaces virtuelles sur ma machine unique. Si je faisais cela à partir de zéro maintenant, c'est ce que je ferais.

Il devient constamment très confus de se connecter sur une machine unique. Cela représente le grand nombre de lignes traitant avec la déconnexion du tunnel. J'avais peur, je quitter trop souvent et je m'éloignais de mon xterm .

Risques et Analyses

expect. As usual, I've set up certificates on all relevant machines, so no paswords are necessary.

Conclusion

Vous devriez maintenant avoir les outils pour naviguer commodément à travers toute la chaîne de machines.

Lire l'article précédent, cet article devrait vous avoir donné suffisamment d'informations pour gérer le scénario précédent sans «tricher».

Vous devriez être capable d'extrapoler à partir de ces articles à presque toutes les configurations de machines.


Henry Grebler

Henry a passé ses journées à travailler avec des ordinateurs, la plupart du temps pour des fabricants d'ordinateurs ou les développeurs de logiciels. Son expérience en informatique précoce comprend les reliques telles que des cartes perforées, bandes de papier et rubans magnétique. C'est son sombre secret qu'il aie été payé pour faire le genre de choses qu'il aurait versé de l'argent pour être autorisés à le faire. Il suffit de ne pas dire à l'un de ses employeurs.

Il utilise Linux comme son bureau d'accueil personnelle puisque la famille a obtenu son premier PC en 1996.quand la famille a partagé l'unique PC , c'était un dual-boot Windows / Slackware configuration. Maintenant que chaque membre a son propre ordinateur, Henry survit en quelque sorte dans un monde purement Linux.

Il vit dans une banlieue de Melbourne, en Australie.


Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux

Cet article est publié selon les termes de la Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site http://www.traduc.org/Gazette_Linux

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.