Tunnel SSH

Qu'est-ce que SSH ?

SSH est l'abréviation de Secure SHell.

  • Secure est pour sécurisé; et qu'est-ce qui est sécurisé avec SSH ? La connexion à un ordinateur distant. Car SSH est un protocole de communication qui va chiffrer dès le départ la connexion entre les deux ordinateurs.
  • un SHell est une interface utilisateur<ref>Souvent une console, un interpréteur de lignes de commandes (CLI, Command Line Interface), mais ce peut être une interface graphique (GUI, Graphical User Interface). Command.com, interpréteur de commandes MS-DOS est un shell de type CLI. Explorer sous Windows est un shell de type GUI</ref>

SSH va donc nous permettre de nous connecter à un autre ordinateur en toute sécurité, c-à-d que toutes les informations (y compris les informations d'authentification<ref>Authentification veut dire que la machine B sur laquelle se connecte A doit être certaine que A est bien A, et que A doit aussi être sûr qu'il est bien chez B. Autrement dit, A et B s'assurent que ni l'un ni l'autre ne sont des usurpateurs.</ref>) Les données qui vont circuler entre les 2 ordinateurs vont être chiffrées <ref>Rendues illisibles pour un éventuel pirate à l'écoute</ref>

Connexion SSH

Fig. 1

Qu'est-ce qu'un tunnel SSH ?

On vient de voir que l'on pouvait se connecter de manière sécurisée<ref>A l'abri des regards indiscrets</ref> à un serveur<ref>Notez bien qu'il faut pour cela que l'administrateur du serveur vous y autorise (vous crée un compte), notez également qu'il y a différentes manières de se connecter (compte unix, clé DSA, ...), on suppose ici que l'administrateur vous a donné les instructions adéquates. Si vous voulez en apprendre plus, voyez la documentation référencée dans les liens externes.</ref>.

Mais vous pouvez aussi utiliser une connexion sécurisée SSH, pour créer un tunnel dans lequel circuleront les différentes données que vous envoyez et recevez avec des services Internet autorisés. Service Internet, ça veut dire tout ce qui est web (http), mail (imap, pop3), ftp, ... en fait tout ce qui est TCP. Attention !, autorisé veut dire ici que, non seulement, vous avez l'autorisation d'accéder à ces services, mais que également l'Administrateur du serveur vous a autorisé à avoir un accès SSH à son serveur.

Il y a plusieurs manières de créer un tunnel ssh (v. le point Comment créer un tunnel SSH ?), on prendra ci-dessous, l'exemple d'un transfert de port local vers un serveur distant. La figure ci-dessous représente le schéma de la connexion d'un navigateur local à un site Internet distant, à travers un tunnel sécurisé SSH.

Tunnel local SSH


Fig. 2

Les ports informatiques

La notion de port

On a pu remarquer dans le dessin ci-dessus, des nombres en rouge gras italiques, labelisés "N° de ports". Un port en informatique, c'est exactement comme une porte. Ils sont ouverts (laissent passer les données) ou fermés (ou pas). Ils y en a 2^16 = 65.536 sur un ordinateur. Comme les informaticiens sont des gens bizarres, les ports sont numérotés de 0 à 65535 (et pas de 1 à 65536, comme l'aurait fait toute personne sensée ;).

Les ports sont aussi le seul moyen pour le pauvre ordinateur de savoir avec quelle application il fait une causette. Il y a des conventions. Par convention, si on s'adresse à lui sur le port 80, l'ordinateur renverra la demande vers le serveur web. Parce que c'est comme ça ;)! Les 1024 premiers ports sont, par convention réservés aux services biens connus, 80 pour http, 21 pour ftp, 22 pour notre ami le SSH, etc. Ces ports numérotés de 0 à 1023, en plus, exigeront pour s'ouvrir, des droits de root. La liste est ici. D'autres ports sont suggérés pour réservation à d'autres services moins fréquents, s'ils ne sont pas utilisés, vous pouvez vous servir de ces ports. Pour mon exemple, j'utilise le port 2080, si vous utilisez Autocad, il vaudra peut-être mieux en choisir un autre.

Qu'est-ce qui fait qu'un port est ouvert ou fermé ?

On comprendra aisément, par analogie avec sa maison, qu'un port ouvert ou fermé est une question de sécurité. Un port sera en général ouvert ou fermé:

  • Côté client (ici c'est vous), par votre firewall local ou par votre routeur local.
  • Côté serveur, par le firewall du serveur.

Comment créer un tunnel SSH ?

Il existe 3 approches:

  1. -L locale pour rediriger un port distant vers une destination (machine) locale
  2. -R distante (remote) pour rediriger un port local vers une destination (machine) distante
  3. -D dynamique pour un transfert de port dynamique basé sur SOCKS (qui va faciliter la gestion des services d'un firewall pour les applications clients serveurs, voir, pour application concrète, le point Configuration du navigateur internet dans l'explication sur putty, ou la configuration du serveur mandataire avec GNOME

Note: La page http://projects.tynsoe.org/fr/stm/doc.php, reprise dans les liens externes donne un bon aperçu de 2 des types de redirections SSH, la locale et la distante.

Sous GNU/Linux

Pour notre exemple sous GNU/Linux, nous allons utiliser l'approche locale, c-à-d, rediriger nos requêtes vers un port choisi sur notre ordinateur (2080 dans la Fig. 2), vers le port web (80 par défaut, et comme dans la Fig. 2 toujours) sur une machine distante.

Dans la Fig. 2, notre ordinateur s'appelle localhost. <ref>Tous les ordinateurs ont une adresse locale 127.0.0.1 correspondant au nom localhost</ref> et l'ordinateur distant porte le nom, ici exemple arbitraire, de serveurweb.org.

Pour les commandlinophiles

En ligne de commande, ouvrir un tunnel se fait avec la commande
ssh -L [port d'entrée du tunnel]:[adresse_client]:[port de sortie du tunnel] [utilisateur@adresse_du_serveur]
Note: -L est pour le type de redirection: locale

Donc, en suivant toujours notre exemple de la Fig. 2:

  1. dans une console entrez la commande
    ssh -L 2080:localhost:80 utilisateur@serveurweb.org
    où utilisateur est le nom de votre compte ssh sur serveurweb.org.
  2. dans votre navigateur Internet, entrez l'adresse http://localhost:2080 qui vous conduira à travers le tunnel SSH créé en 1. vers le port 80 de serveurweb.org, ce qui affichera la page desservie par la requête http://localhost cette fois sur serveurweb.org. Et maintenant votre navigation est chiffrée (et donc sécurisée) dans le tunnel SSH.
  3. Lorsque vous avez fini de naviguer, n'oubliez pas de fermer le tunnel, en entrant exit dans la console à partir de laquelle vous aviez créé le tunnel.

Astuce: Si vous ne voulez pas avoir à retaper l'ensemble de la commande de création du tunnel à chaque fois, vous pouvez en faire un alias avec la commande du même nom, par exemple :
alias tunnel='ssh -L 2080:localhost:80 utilisateur@serveurweb.org'
La prochaine fois, il vous suffira d'entrer tunnel dans la console pour créer le tunnel.
Attention toutefois ; il sera toujours nécessaire de fermer le tunnel avec exit en final !

Pour les commandlinophobes

Il existe aussi des applications graphiques pour créer des tunnels ssh sous linux, par exemple:

  • Putty est un couteau suisse libre pour SSH, telnet et login​ (Voir le point Sous windows). Il existe aussi KiTTY qui est un fork de Putty avec plus de fonctionnalités.
  • Gstm est une interface graphique pour gérer des tunnels SSH sous Gnome
  • Gnome-sshman est un gestionnaire de connexions SSH pour GNOME et Nautilus (le gestionnaire de fichiers de Gnome). Il permet de monter (et conserver) des connexions sftp (connexions ftp dans un tunnel ssh). Attention il y a 2 SFTP: SSH File Transfer Protocol et Secure File Transfer Protocol.

Configuration du serveur mandataire avec GNOME

Pour que toutes les requêtes effectuées à partir de l’ordinateur et vers Internet passent par le tunnel SSH avec transfert un port dynamique (option -D), il faut configurer le serveur mandataire (gnome-network-properties).

On va dans le menu Système / Préférences / Serveur mandataire à partir du tableau de bord :

Fenêtre des préférences de serveur mandataire

Là, on peux créer un nouvel emplacement pour conserver la configuration actuelle comme celle par défaut, et pour nommer la configuration que l’on va utiliser. Pour faire cela on clique sur Nouvel emplacement… dans le menu déroulant Emplacement et on indique un nom, comme par exemple : Derrière un pare-feu.

Ensuite, il suffit de sélectionner Configuration manuelle du serveur mandataire et de saisir l’adresse IP loopback de la machine (127.0.0.1 ou localhost) dans le champ Hôte Socks et le port choisi pour le tunnel dans le champ Port.

Fenêtre des préférences de serveur mandataire pour l’emplacement : Derrière un pare-feu

Si l’on est administrateur de la machine, on peux Appliquer à l’ensemble du système… cette configuration. Cela permet d’utiliser le tunnel SSH pour toutes les requêtes vers Internet faites par le système.

Enfin il faut fermer la fenêtre pour valider la configuration.

Sous Mac OS X

En ligne de commande

Vous pouvez très aisément appliquer la même démarche que pour GNU/Linux dans l'application terminal se trouvant dans le dossier Applications/Utilitaires, je vous conseille donc d'aller voir la partie "Pour les commandlinophiles"

À l'aide d'une application

Pour MacOSX, il existe plusieurs applications graphiques pour créer des tunnels SSH.

SSH Tunnel était la plus remarquable d'entre elles pour son élégance et toute les fonctionnalités, mais le développement autour de SSH Tunnel s'est grandement ralenti, et l'on peut noter certains dysfontionnements avec les dernières versions de MacOSX [10.8].
Le projet initialement hébergé sur Google Code "SSHTunnel a.k.a. cocoa-sshtunnel " a migré vers GitHUB "SSHTunnel sur GitHUB". Vous pouvez consulter ici, le manuel d'utilisation de SSH Tunnel.

Fenêtre principale de l'application SSHTunnel

Coccinellida
Offre une interface simple accessible à partir de la barre des menus, ce qui rend l'application toujours disponible… Vous pouvez la télécharger à partir du site "Coccinellida sur Sourceforge".

menu de Coccinellida

Préférences de Coccinellida

Préférences de Coccinellida

Sous Windows

Note : normalement, il ne devrait pas y avoir trop de fautes :)

Pour réaliser un tunnel SSH sous Windows (XP, Vista, Seven), il nous faut tout d'abord (avec l'accent de Maïté) un client SSH ainsi qu'un serveur ssh sur lequel nous allons nous connecter.

Concernant le client SSH, vous pouvez utiliser le très connu et non moins excellent PuTTY (simple et léger que demande le peuple...).

Dans le cas présent, nous allons utiliser le tunnel ssh pour surfer tranquillement sur Mozilla Firefox :-)

Allez à l'url suivante et téléchargez le fichier putty.exe :

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

Ou plus simplement, cliquez sur le lien suivant :

http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe

Une fois téléchargé, voici ce que vous devriez avoir dans votre explorateur de fichiers ou sur votre bureau.

Il existe aussi KittyPortable qui est une sorte de Putty mais en version portable.

Putty min.jpg

Configuration du client SSH

On lance l'exécutable et on obtient l'écran suivant :

Ecran général

Ici, nous allons renseigner l'adresse IP du serveur SSH ainsi que le nom de la session (Saved_sessions) qui permettra de sauvegarder nos différents paramètres.

IP du serveur SSH

Ensuite, on clique sur la rubrique SSH et on va dans la sous rubrique Tunnels.

On indique, l'option Source ainsi que port (par exemple : 7171) et on choisi Dynamic, comme ceci :
Note: Le port 7171 choisi ici est l'équivalent du port 2080 dans la Fig. 2 et le type de redirection est Dynamic.

Configuration Tunnel SSH

Et on clique sur le bouton Add :

Port utilisé

Une fois ceci fait, on revient sur la rubrique Session puis on clique
le bouton Save, voilà, les paramètres sont sauvegardés.

On sauvegarde !

On clique ensuite sur le bouton Open, une nouvelle fenêtre s'ouvre :

Login SSH

Voici l'heure de l'authentification sur la machine... C'est bon, Hop!
La connexion SSH est à présent établie entre notre machine et le serveur SSH.

Passons maintenant à la configuration de notre navigateur pour pouvoir surfer tranquillement.

Configuration du navigateur internet

On lance son navigateur internet, dans le cas présent, il s'agit de Mozilla Firefox.

On va dans le menu Outils / Options :

Ecran Options

Puis, on clique sur le bouton Paramètres.

Là, on clique sur Configuration manuelle du proxy et on définit la valeur de Hôte SOCKS et Port.

Sachant que le Port est celui qu'on avait défini tout à l'heure dans PuTTY, dans le cas présent 7171.

Le Hôte SOCKS correspond à notre machine (localhost ou 127.0.0.1), c'est l'adresse IP loopback de la machine.

Configuration du proxy

Puis on clique sur le bouton OK.

A partir de cet instant, toutes les requêtes web qui seront faites passeront par le tunnel SSH, donc, la connexion est sécurisée de ma machine au serveur SSH et par ailleurs, on utilise l'adresse IP publique du serveur SSH et non notre ip à nous. Pratique n'est-ce pas ??? :-)

Dans le cas présent, j'utilisais un serveur SSH qui est basé sur Paris alors que moi-même je me trouve quelque part en France (bien loin de Paris).

IP Address Location: Paris, Ile-de-France France

Par contre, les requêtes DNS ne passent pas par le tunnel SSH, à cela, une solution, dans la barre d'adresse du navigateur taper : about:config

De là, cliquer sur le bouton : Je ferai attention, promis !

Dans Filtre, taper socks.

Il va falloir modifier la valeur de network.proxy.socks_remote_dns. Pour ce faire un clic droit puis Inverser :

Valeur à False

La valeur passe à True :

Valeur à True

Et voilà, à présent, les requêtes DNS passent également par le tunnel SSH.

NOTE : N'oubliez pas de remettre à False l'option lorsque vous n'utilisez pas votre tunnel.

Dans le cas qui nous a intéressé ci-dessus, on a utilisé le tunnel SSH avec le navigateur internet, mais on aurait pu l'utiliser avec toute autre application dans laquelle on peut renseigner un Proxy SOCKS (version 4 ou 5).

Liens externes

Notes et références

<references/>