Comment fonctionne le tunnel SSH inversé?

Daprès ce que je comprends, les pare-feu (en supposant les paramètres par défaut) refusent tout trafic entrant qui na pas de trafic sortant antérieur correspondant.

Basé sur Inverser une connexion SSH et Le tunnel SSH en toute simplicité , le tunnel SSH inversé peut être utilisé pour obtenir autour des restrictions de pare-feu embêtantes.

Je voudrais exécuter des commandes shell sur une machine distante. La machine distante possède son propre pare-feu et se trouve derrière un pare-feu supplémentaire (routeur). Il a une adresse IP comme 192.168.1.126 (ou quelque chose de similaire). Je ne suis pas derrière un pare-feu et je connais ladresse IP de la machine distante vue sur Internet (pas ladresse 192.168.1.126). De plus, je peux demander à quelquun dexécuter ssh (something) en tant que root sur la machine distante dabord.

Quelquun pourrait-il mexpliquer, étape par étape, comment fonctionne le tunnel SSH inversé pour contourner les pare-feu (pare-feu des machines locales et distantes et pare-feu supplémentaire entre eux)?

Quel est le rôle des commutateurs (-R, -f, -L, -N)?

Commentaires

Réponse

Jadore expliquer ce genre de chose à travers la visualisation. 🙂

Considérez vos connexions SSH comme des tubes. Gros tubes. Normalement, vous atteindrez ces tubes pour exécuter un shell sur un ordinateur distant. Le shell fonctionne dans un terminal virtuel (tty). Mais vous connaissez déjà cette partie.

Considérez votre tunnel comme un tube dans un tube. Vous avez toujours la grande connexion SSH, mais loption -L ou -R vous permet de configurer un tube plus petit à lintérieur.

Chaque tube a un début et une fin. votre connexion SSH, démarrée avec votre client SSH et aboutissant au serveur SSH auquel vous vous êtes connecté. Tous les tubes plus petits ont les mêmes points de terminaison, sauf que le rôle de « start » ou « end » est déterminé par lutilisation de -L ou -R (respectivement) pour les créer.

(Vous navez pas dit, mais je vais supposer que la machine «distante» que vous avez mentionnée, celle derrière le pare-feu, peut accéder à Internet en utilisant la traduction dadresses réseau (NAT). Cest assez important, veuillez donc corriger cette hypothèse si elle est fausse.)

Lorsque vous créez un tunnel, vous spécifiez une annonce robe et port sur lesquels il répondra, ainsi quune adresse et un port auxquels il sera livré. Loption -L indique au tunnel de répondre du côté local du tunnel (lhôte exécutant votre client). Loption -R indique au tunnel de répondre du côté distant (le serveur SSH).

directions du tunnel ssh

Donc … Pour pouvoir SSH depuis Internet vers une machine derrière un pare-feu, vous avez besoin de la machine en question pour ouvrir une connexion SSH vers le monde extérieur et inclure un -R tunnel dont le point » dentrée « est le côté » distant « de sa connexion.

Parmi les deux modèles ci-dessus, vous voulez celui de droite.

Depuis lhôte pare-feu:

ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com 

Ceci indique à votre client détablir un tunnel avec une entrée emote -R point. Tout ce qui se connecte au port 22222 à lextrémité du tunnel atteindra en fait « localhost port 22 », où « localhost » est du point de vue du point de sortie du tunnel (cest-à-dire votre client ssh).

Les autres options sont:

  • -f dit à ssh de se mettre en arrière-plan après son authentification, vous navez donc pas à vous asseoir en exécutant quelque chose serveur distant pour que le tunnel reste actif.
  • -N dit que vous voulez une connexion SSH, mais que vous ne voulez pas exécuter de commandes à distance. Si vous ne créez quun tunnel, linclusion de cette option permet déconomiser des ressources.
  • -T désactive lallocation de pseudo-tty, ce qui est approprié car vous « nêtes pas essayez de créer un shell interactif.

Il y aura une contestation de mot de passe à moins que vous nayez configuré des clés DSA ou RSA pour une connexion sans mot de passe.

Notez que cest FORTEMENT recommandé dutiliser un compte jetable (pas votre propre identifiant) que vous avez configuré uniquement pour ce tunnel / client / serveur.

Maintenant, depuis votre shell sur yourpublichost , établissez une connexion à lhôte pare-feu via le tunnel:

ssh -p 22222 username@localhost 

Vous « ll obtenez un défi de clé dhôte, car vous navez probablement jamais rencontré cet hôte auparavant. Ensuite, vous « obtiendrez un défi de mot de passe pour le compte username (sauf si vous avez configuré des clés pour une connexion sans mot de passe).

Si vous « allez accéder régulièrement à cet hôte, vous pouvez également simplifier laccès en ajoutant quelques lignes à votre fichier ~/.ssh/config:

host remotehostname User remoteusername Hostname localhost Port 22222 

Ajustez remotehostname et remoteusername en fonction. Le remoteusername le champ doit correspondre à votre nom dutilisateur sur le serveur distant, mais remotehostname peut être nimporte quel nom dhôte qui vous convient, il ne doit pas correspondre à tout ce qui peut être résolu.

Voir aussi:

Commentaires

  • et ssh -D. Veuillez expliquer en utilisant la même méthode.
  • Les proxys SOCKS ne sont pas les mêmes que les tunnels. Si vous avez une question sur leur utilisation, veuillez la poser .
  • I ‘ Jai beaucoup de mal à suivre cette explication en raison de lutilisation imprécise des termes: serveur, client, machine locale, machine distante, hôte, yourpublichost, localhost, remotehostname. Avec tous ces termes vagues et indéfinis, on pourrait supposer que quelquun aurait besoin de 8 ordinateurs pour le configurer. Je déclare cela parce que dans tous les autres aspects, cela semble une très bonne explication. Veuillez réduire et définir les termes.
  • @ Rucent88, je ‘ ne sais pas quelle réduction serait possible. Un client établit une connexion à un serveur. Cest la terminologie courante de ‘ dans le monde des réseaux. Les machines locales et distantes semblent assez évidentes. Si vous ‘ êtes confus à propos de SSH ou de la terminologie générale Unix après avoir lu la documentation, je ‘ suis sûr que vous ‘ Je n’aurai aucun mal à trouver ici des personnes prêtes à répondre à toutes vos questions.
  • @ghoti Cela ‘ est en effet déroutant, car local et les machines distantes sont relatives. Lorsque je suis assis sur le lieu de travail, mon ordinateur personnel est la télécommande, lorsque je suis assis à la maison, lordinateur du travail est distant. Le serveur et le client sont également déroutants quand on parle de tunneling. Par exemple, si je me connecte à la maison depuis mon travail avec ssh -R. Je me connecte à mon travail à partir de lordinateur personnel en connectant localhost. Donc, du point de vue des sockets, le serveur est lui-même lordinateur domestique. Mais logiquement, je me suis connecté à mon ordinateur de travail. Cette ‘ est déroutante.

Réponse

Jai dessiné quelques croquis

La machine sur laquelle la commande tunnel ssh est tapée sappelle »votre hôte« .

tunnel ssh à partir du local


tunnel ssh à partir de la télécommande

Introduction

  1. local: -L Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.

    ssh -L sourcePort:forwardToHost:onPort connectToHost signifie: connectez-vous avec ssh vers connectToHost et transférez toutes les tentatives de connexion vers le local sourcePort vers le port onPort sur la machine appelée forwardToHost, accessible depuis la machine connectToHost.

  2. distante: -R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.

    ssh -R sourcePort:forwardToHost:onPort connectToHost signifie: connectez-vous avec ssh à connectToHost, et transférer toutes les tentatives de connexion vers le distant sourcePort vers le port onPort sur la machine appelée forwardToHost, accessible depuis votre machine locale.

Options supplémentaires

  • -f indique à ssh de se mettre en arrière-plan après son authentification, vous navez donc pas à vous asseoir en exécutant quelque chose sur le serveur distant pour rester en vie.
  • -N dit que vous voulez une connexion SSH, mais que vous ne voulez pas exécuter de commandes à distance. Si vous ne créez quun tunnel, linclusion de cette option économise des ressources.
  • -T désactive lallocation pseudo-tty, ce qui est approprié car vous nêtes pas essayer de créer un shell interactif.

Votre exemple

La troisième image représente ce tunnel. Mais lordinateur bleu appelé »votre hôte« représente lordinateur sur lequel quelquun démarre le tunnel ssh, dans ce cas, la machine protégée par un pare-feu.

Alors, demandez à quelquun de démarrer une connexion tunnel ssh vers votre machine. La commande devrait ressembler essentiellement à

ssh -R 12345:localhost:22 YOURIP 

Le tunnel est maintenant ouvert.Vous pouvez maintenant vous connecter via ssh à la machine pare-feu via le tunnel avec la commande

ssh -p 12345 localhost 

qui se connectera à votre propre localhost (votre machine) sur le port 12345, mais le port 12345 est redirigé via le tunnel vers le port 22 de lhôte local du pare-feu ordinateur (cest-à-dire lordinateur pare-feu lui-même).

Commentaires

  • @erik, Comment avez-vous dessiné ces images?
  • I utilisé loutil de dessin vectoriel open source appelé Inkscape et mes souris (en fait, cest un trackball: Marble FX de Logitech).
  • @ghoti: Par défaut, la socket découte sur le serveur (dans mon image -R lhôte distant jaune) sera liée uniquement à l interface de bouclage. Cela peut être remplacé en spécifiant une adresse bind_address. Une adresse bind_address vide ou l’adresse «*» indique que le socket distant doit écouter sur toutes les interfaces. – Alors essayez-le: sur un ordinateur bleu, démarrez ssh -R 1234:localhost:8000 yellowcomputer. Et aussi sur la machine bleue démarrer python -m SimpleHTTPServer (un simple serveur web sur le port 8000). Ensuite, dans un navigateur Web sur la machine jaune, ouvrez lURL http://localhost:1234 et vous verrez que cela fonctionne.
  • @erik, ah, la partie déroutante est que mes yeux sont mauvais – Je nai ‘ pas vu lespace avant remotehost dans vos commandes. En y regardant de plus près, je vois que vos schémas ne traitent pas du tout de la fonction bind_address facultative. Désolé pour la confusion.
  • @briankip Oui, bien sûr. Au moins si vous souhaitez établir une connexion ssh avec lordinateur derrière le pare-feu (via le tunnel ou directement, si le pare-feu le permet). Par exemple: La commande ssh que vous écrivez sur lordinateur pare-feu ouvre uniquement un tunnel, mais ne démarre pas ou ne fonctionne pas comme un ssh-daemon / -server. Votre prochaine question devrait être: comment démarrer un sshd sans privilèges root (si tel est votre problème). 🙂

Réponse

Le tunneling ssh fonctionne en utilisant la connexion ssh déjà établie pour envoyer du trafic supplémentaire.

Lorsque vous vous connectez à un serveur distant, vous navez généralement quun seul canal pour linteraction utilisateur normale (ou 3 canaux si vous considérez STDIN / STDOUT / STDERR séparément). A tout moment, le processus ssh local ou distant peut ouvrir des canaux supplémentaires sur la connexion existante. Ces canaux envoient / reçoivent ensuite le trafic du tunnel. Lors de lenvoi ou de la réception de trafic, le processus ssh dit simplement « ce trafic est destiné au canal foobar ».

Cela fonctionne essentiellement comme ceci:

  1. Vous dites à ssh de commencer à écouter sur le port XXXX et que tout trafic reçu doit être tunnelé, puis défini sur YYYY sur le port ZZZZ.
  2. Le ssh local commence à écouter sur le port XXXX (généralement sur 127.0.0.1, mais peut être modifié).
  3. Certaines applications ouvrent une connexion au port XXXX sur la machine locale.
  4. Le ssh local ouvre un canal vers le ssh distant et dit « tout trafic sur ce canal va à YYYY: ZZZZ
  5. Le ssh distant se connecte à YYYY: ZZZZ et renvoie le « OK, le canal est ouvert »
  6. Maintenant tout trafic envoyé le long de la connexion au port XXXX sur la machine locale est mandaté par ssh vers YYYY: ZZZZ.

Ce processus est exactement le même pour le tunneling direct et inverse (il suffit déchanger les mots « local » et « distant » dans procédure ci-dessus). Les deux côtés peuvent démarrer le tunnel. nest même pas nécessaire lorsque vous démarrez ssh pour la première fois. Vous pouvez ouvrir des tunnels pendant que ssh est déjà en cours d’exécution (voir ESCAPE CHARACTERS, en particulier ~C).

Pour le rôle de -R, -f, -L et -N, il suffit de consulter la page de manuel, elle vous donne la meilleure explication possible. Mais je « mentionnerai -R et -L.
-R dit le ssh distant pour écouter les connexions, et que le ssh local doit se connecter à la destination réelle. -L dit au ssh local découter les connexions, et que le ssh distant doit se connecter à la destination réelle.

Remarque, ceci est une description très grossière, mais elle devrait vous donner suffisamment dinformations pour savoir ce qui se passe

Réponse

Ceci est expliqué dans le manuel SSH, en particulier les différences entre -L (local) et -R (distant).


-L

-L [bind_address:]port:host:hostport

Spécifie que le port donné sur lhôte local (client) doit être transmis à lhôte donné et port du côté distant .

Cela fonctionne en allouant une socket pour écouter le port du côté local, éventuellement lié à ladresse bind_address spécifiée.

Chaque fois quune connexion est établie avec ce port, la connexion est transférée sur le canal sécurisé et une connexion est établie vers host port hostport de la machine distante .

Lexemple suivant tunnelise une session IRC de la machine cliente 127.0.0.1 (localhost) en utilisant le port 1234 vers le serveur distant server.example.com:

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10 

Remarque: Loption -f background ssh et la commande distante sleep 10 est spécifié pour laisser un certain temps pour démarrer le service qui doit être tunnellisé.

Exemple:

ssh `-N` -L 22000:localhost:11000 remote.server.com 
  • -N Après vous être connecté, accrochez-vous simplement (vous nobtiendrez pas une invite du shell)

    Nexécutez pas de commande à distance.

  • -L 22000 La connexion proviendra du port 22000 de votre personnel, L machine ocale

  • localhost:11000remote.server.com sassurera que lautre extrémité du tunnel est localhost, port 11000

ssh -N -L 22000: 192.168.1.2: 11000 remote.server.com

Source: Un guide illustré, un didacticiel, des instructions sur le tunneling SSH .


-R

-R [bind_address:]port:host:hostport

Spécifie que le port donné sur lhôte distant (serveur) doit être transmis au g iven hôte et port du côté local .

Cela fonctionne en allouant une socket pour écouter port sur le côté distant, et chaque fois quune connexion est établie à ce port, la connexion est transmise via le canal sécurisé et une connexion se fait vers host port hostport à partir de la machine locale .

Exemple:

ssh -N -R 22000:localhost:11000 remote.server.com 
  • -N Après vous être connecté, accrochez-vous simplement (vous nobtiendrez pas dinvite du shell)

    Nexécutez pas de commande à distance.

  • -R 22000 La connexion sera établie sur le port 22000 de lordinateur emote R (dans ce cas, remote.server.com)

  • votre ordinateur personnel local sassurera que lautre extrémité du tunnel est localhost, port 11000

ssh -N -R 22000: localhost: 11000 remote.server.com

Source: Un guide illustré, un didacticiel, des instructions sur le tunneling SSH .

Commentaires

  • loreille et la bouche indiquent clairement qui ‘ parle et qui ‘ écoute!
  • Jadore vos illustrations!

Réponse

La liaison aux interfaces réseau lors de létablissement de tunnels SSH inversés est expliquée dans ce post . Voici un exemple avec 4 ordinateurs résidant dans deux réseaux différents:

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *