Aller au menu - Aller au contenu

Icône Mise en place d'un tunnel TCP/IP via SSH

Avatar
Par Avatar ren0
Mise à jour : 28/08/2010
Difficulté : Intermédiaire Intermédiaire
122 visites depuis 7 jours, classé 526/786
Bonjour à tous !

Aujourd'hui, nous allons voir un procédé très puissant qui permet d'encrypter toutes les communications transitant par des ports TCP au moyen du protocole bien connu, le SSH.

On pourra également se servir de ce tunnel pour passer outre certains filtres tels que des firewalls ou des serveurs proxy.

Le fonctionnement du SSH en lui-même ne sera pas explicité dans ce cours, seule la mise en place du tunnel le sera.

Préambule

Avant de passer à la mise en place et à la configuration de notre tunnel, nous allons d'abord voir ce que c'est, pourquoi vous pourriez en avoir besoin et comment installer les outils indispensables. Nous ferons également une brève explication de ce que sont les ports, notion fondamentale pour la suite.

Le principe


Nous allons d'abord expliquer ce qu'est le protocole SSH, pourquoi nous l'utiliserons et ensuite, rapidement ce qu'est un tunnel et surtout pourquoi vous en auriez besoin.

Le SSH


Le SSH, acronyme de l'anglais secure shell, désigne un ensemble de programmes et de protocoles qui permettent de se connecter sur une machine distante de façon sécurisée, en encryptant les communications.
Tout au long de ce cours, nous utiliserons OpenSSH, une implémentation libre du protocole SSH. C'est un ensemble d'outils qui contient, entre autres, ssh (un remplaçant pour rlogin et telnet); scp (un remplaçant pour rcp); sftp (un remplaçant pour ftp) et sshd, le démon SSH.

Nous utiliserons le protocole SSH car les outils tels que telnet, rlogin et ftp transmettent les communications de façon parfaitement claire (en ce compris les mots de passe) à travers l'Internet. Une simple écoute de réseau permet alors à quiconque de s'approprier les données qui transitent. OpenSSH permet de chiffrer les communications et d'encrypter solidement les données, rendant toute écoute réseau caduque.

L'échange des clés de chiffrement au début de la transaction permet de s'assurer que les trames seront chiffrées pendant la connexion. L'utilisation de SSH permet ainsi d'éviter la libre circulation des mots de passe et impose une authentification renforcée de la machine distante, plus seulement basée sur l'adresse IP ou le nom.

Lorsqu'on décortique l'acronyme SSH, on y retrouve les deux notions essentielles : secure, shell. Le SSH fournit donc un shell à distance sécurisé. Un shell est un logiciel fournissant une interface pour utilisateur, le plus souvent en ligne de commande. Il est donc un interpréteur de commandes et offre la possibilité d'interagir avec le serveur à distance.

En conclusion, SSH nous permet d'exécuter des commandes à distance en toute sécurité; d'échanger des fichiers et même de lancer une session graphique. Toutes ces raisons font que SSH est aujourd'hui très utilisé par beaucoup de monde.

Le tunnel


Le principe des tunnels SSH, également appelés ports forwarding, pour redirection de ports en français, est de permettre d'atteindre des machines auxquelles vous n'avez normalement pas accès. On encapsule donc des données d'un protocole réseau au sein d'un autre, situé dans la même couche du modèle en couches, ou dans une couche du niveau supérieur.

Une application directe de ce concept est les firewalls qui bloquent bien souvent certains ports dont vous pourriez avoir besoin.
  • Vous voudriez utiliser votre client de messagerie libre, mais les ports POP et IMAP sont bloqués.
  • Vous voudriez peut-être télécharger l'image .iso de la dernière release de votre distribution préférée par FTP.
  • Vous voudriez enfin discuter avec vos amis via un logiciel de messagerie instantanée.
Toutes ces opérations sont rendues a priori impossibles à cause d'un éventuel firewall mis en place.

Le principe sera donc de faire transiter toutes ces données au travers d'un port autorisé. Le tunnel encapsulera ces informations et les fera transiter sans soucis vers le serveur distant. Vous allez donc pouvoir utiliser votre tunnel comme porte de sortie du firewall et y faire circuler tout ce qui relève du protocole TCP.

Voila un petit schéma qui illustre ces notions

Image utilisateur

Un tunnel utilisant le SSH (réutilisé sous license Image utilisateur) - Attribution ©Wikipedia



Notion de ports


On parle de ports depuis tout à l'heure, mais il est probablement utile de clarifier immédiatement ce qu'on entend par là. Voici ce que dit Wikipedia au sujet de cette notion.

Citation : Wikipedia
Correspondant à la couche de transport du modèle OSI, la notion de port logiciel permet, sur un ordinateur donné, de distinguer différents interlocuteurs. Ces interlocuteurs sont des programmes informatiques qui, selon les cas, écoutent ou émettent des informations sur ces ports. Un port est distingué par son numéro.

En clair, un port est l'adresse d'une application sur une machine. Si vous décidez par exemple d'uploader des fichiers sur votre serveur web, pour mettre votre site à jour, au moyen d'un client FTP, ce dernier va interroger le port FTP du serveur distant, le port 21, qui constitue l'adresse de l'application FTP.

Une analogie qui vaut ce qu'elle vaut est de considérer les ports comme des portes d'entrée vers une machine. Comme toute porte d'entrée, un port peut être ouvert ou fermé. Un des principes d'un firewall est justement de fermer certains ports, jugés inutiles d'être laissés ouverts.

Il y a cependant des conventions à respecter. Ainsi, si on s'adresse à une machine via le port 80, elle renverra la demande vers le serveur web. Si on fait une requête via le port 110, la machine comprendra qu'il s'agit d'une requête du type POP3. Voici la liste des adresses/numéros attribués conventionnellement aux différents ports.

Notre tunnel nous permettra d'emprunter d'autres ports qui auront été laissés ouverts. Vous comprenez à présent pourquoi on appelle cette technique de la "redirection de ports".

Des approches différentes


Il existe différentes façons de faire fonctionner ce procédé de ports forwarding. Bien que le concept soit le même, il est utile de différencier ces approches.

Approche locale


Dans ce cas-ci, nous allons rediriger un port distant vers une destination locale. Ce type de redirection permet donc joindre des hôtes derriere un firewall, sur un réseau privé en encapsulant des informations dans une connexion SSH vers un serveur (ce dernier doit avoir la possibilité de joindre l'hôte final).

Image utilisateur

Approche locale (réutilisé sous license Image utilisateur) - Attribution ©think-underground


Le SSH local permet de transmettre les demandes locales (sur le port "port-local" de localhost) vers le serveur-ssh qui les envoie sur le port "port" de l'adresse "adresse" (l'adresse "adresse" doit donc être accessible par serveur-ssh).

Approche distante


Nous allons rediriger un port local vers une machine distante. Imaginons que vous souhaitiez montrer à un de vos amis votre nouveau site web qui est hébergé sur votre serveur de test qui fait partie de votre réseau local.
Tout ce que vous avez à faire est d'ouvrir un tunnel d'une machine qui peut joindre votre serveur ainsi que le serveur public vers lequel votre ami va se connecter.

Image utilisateur

Approche distante (réutilisé sous license Image utilisateur) - Attribution ©think-underground


Le SSH distant permet de transmettre les demandes distantes (sur le port "port-distant" de serveur-ssh) vers localhost qui les envoie sur le port "port" de l'adresse "adresse" (l'adresse "adresse" doit donc être accessible par localhost).

Installation


On va maintenant détailler l'installation des outils indispensables, aussi bien du côté du serveur que du côté du client.

Côté serveur


On suppose que vous disposez d'un serveur dédié. Installez donc le paquet openssh-server sur votre serveur, au moyen de votre gestionnaire de paquets préféré. On lancera par exemple, sous Debian

Code : Console
# aptitude install openssh-server


Assurez-vous ensuite qu'il sera lancé à chaque boot de votre machine (même si vous ne devriez pas avoir à booter votre serveur très souvent, étant donné que par définition, il doit être allumé en permanence).

Si on veut démarre le démon SSH, sshd, on fera

Code : Console
# /etc/init.d/sshd start


Côté client


En principe, le client SSH est installé par défaut sur toutes les systèmes GNU/Linux. Il n'y a donc rien à faire.
Si pour une raison ou une autre, ce n'était pas le cas, installez donc le paquet openssh. Ainsi, sous Debian, on fera

Code : Console
# aptitude install openssh

Vous êtes maintenant prêts à passer à la pratique.

Mise en place

Gardons à l'esprit que notre but est de contourner un pare-feu. Dans cette optique, nous allons exploiter l'approche locale. Nous voulons donc rediriger des requêtes transitant via des ports a priori fermés vers un port qui ne le serait pas.

Notre but pourrait se schématiser comme suit

Image utilisateur

Notre objectif (réutilisé sous license Image utilisateur) - Attribution ©feedelite

On va donc faire passer le tunnel par notre serveur, qui ira collecter les informations demandées. Ces dernières prendront notre tunnel dans le sens inverse.

Changement de port SSH du serveur distant


Si vous avez lu le fichier détaillant la convention des adresses des ports, vous avez du remarqué que le port 22 est attribué au protocole SSH. Il y a beaucoup de chances pour que le pare-feu bloque ce port, rendant dès lors la création de notre tunnel impossible.

Sommes-nous pour autant dans l'impossibilité de réagir ? Non !

Nous allons tout simplement modifier l'adresse du port SSH. Pour ce faire, ouvrez donc le fichier de configuration du démon ssh. Son emplacement est le suivant : /etc/ssh/sshd_config
Repérez la ligne port 22, ajoutez une ligne port 443 à la suite. Redémarrez ensuite le démon SSH.

Si vous lisez la convention d'adressage des ports, vous remarquerez que le port 443 est réservé par défaut au HTTPs, ce port sera forcément ouvert. De plus, HTTPs et SSH présentent des similitudes (la couche SSL) et donc utiliser le port 443 a l’avantage d’être discret.
Si votre firewall le tolère, vous pouvez aussi faire une redirection du port 443 vers le 22 en ne laissant que la ligne « Port 22 » dans sshd_config.

Ouverture du port approprié au niveau de votre firewall


N'oubliez pas d'ouvrir le port que vous souhaitez utiliser au niveau de votre firewall, soit le port 22 ou 443.

Dans le cas où votre IP est dynamique, soit vous la récupérez et vous priez pour que le serveur DHCP ne soit pas relancé, ou bien vous associez votre IP à un nom de domaine.

On y va


On va donc supposer que vous avez installé tout ce qu'il faut, que vous disposez d'un compte sur votre serveur et qu'il est prêt à vous recevoir. On va donc s'y connecter et initialiser le tunnel TCP/IP, ce qui se fait au moyen de la commande suivante

Code : Console
ssh -L port-local:HOSTNAME:port-distant nomutilisateur@nomhôte


Exemple : navigation sur l'Internet


Supposons qu'on veuille se connecter à un site web (requête HTTP) mais qu'il soit bloqué. On va simple transiter via le tunnel pour atteindre notre serveur qui ira chercher l'information et nous la renverra, comme illustré sur ce schéma

Image utilisateur

Requête HTTP transitant par notre tunnel (réutilisé sous license Image utilisateur) - Attribution ©korben


Nous utiliserons dès lors la commande ssh de cette façon

Code : Console
ssh -L 2080:localhost:80 utilisateur@serveurweb.org


Maintenant que notre tunnel HTTP utilisant SSH est initialisé, on va voir comment indiquer à notre navigateur de l'emprunter. Dans la barre de navigation, entrez l'adresse http://localhost:2080 qui vous conduira à travers le tunnel vers le port 80 de serveurweb.org, ce qui affichera la page désservie par la requête http://localhost cette fois sur serveurweb.org.

Votre navigation est dès lors sécurisée et cryptée.
N'oubliez pas, lorsque vous avez terminé votre navigation, de fermer votre tunnel en tapant simplement exit.

Cet exemple, pour simple qu'il soit, permet de montrer la simplicité de la création d'un tunnel. Une fois que le tunnel TCP/IP est créé, il suffit de rediriger les clients utilisés pour qu'ils utilisent le port local redirigé et non plus le port distant avec une transmission en clair.

Notons que pour chaque type de transaction différent (exemple : navigation internet, connexion à un serveur de messagerie, envoi de fichier par FTP, etc.) il faudra ouvrir un nouveau tunnel. Cela se comprend facilement car les ports utilisés sur la machine hôte sont différents.

Automatisation des tâches


Remarquons que la saisie des commandes ci-dessus peut devenir réellement fastidieuse et contraignante à la longue. Je vous propose donc de créer des aliases et de les inscrire dans votre .bashrc pour ne pas devoir retenir ces commandes.

Voici un exemple pour la commande de création du tunnel HTTP utilisé ci-dessus.

Code : Console
alias tunnelhttp='ssh -L 2080:localhost:80 utilisateur@serveurweb.org'


Rajoutez donc les aliases que vous avez créés dans la section appropriée du fichier .bashrc, afin de ne pas devoir retenir ces commandes.

Introduction aux tunnels dynamiques

Limitations de la redirection de ports


Le procédé que nous venons de voir, bien qu'il soit très utile et très puissant, montre cependant rapidement quelles sont ses limites.

Le problème de cette technique est qu'il faut définir absolument toutes les connexions dont vous avez besoin, ce qui peut s'avérer extrêmement lourd si vous en avez beaucoup. Certains services, tels ICQ, rendent cette technique impossible. Pour cause, les ports y sont alloués de façon dynamique, vous ne sauriez donc pas utiliser ce service dans ces conditions, vu que votre tunnel est statique.

La solution qui a été trouvée pour palier à ces problèmes est la redirection dynamique des ports.

Vous créez un port d'écoute qui se charge de prendre toute trame réseau qui rentre "telle quelle" et de la faire exécuter depuis l'autre bout du tunnel.

Voila un petit schéma qui illustre bien cela

Image utilisateur

Tunnel dynamique (réutilisé sous license Image utilisateur) - Attribution ©michauko

On va maintenant voir comment réaliser cela.

Mise en place


La syntaxe de la commande à utiliser est essentiellement la même. On va commencer par initialiser notre tunnel

Code : Console
ssh -D port-local nomutilisateur@nomhôte


Maintenant que votre tunnel est ouvert, nous allons demander à vos applications de l'emprunter.

Exemple : navigation sur l'Internet


Ouvrez donc votre navigateur. Allez dans éditions -> préférences -> avancé -> réseau -> paramètres de connexion.
Vous arrivez devant un écran tel que celui-ci

Image utilisateur

Configuration de votre navigateur

Ensuite, votre navigateur devrait correctement emprunter votre tunnel et tout devrait se dérouler correctement.
Le cours est désormais terminé !

Vous êtes désormais en mesure de mettre en place un tunnel TCP/IP sécurisé au moyen du SSH.

Pour toute remarque/question, vous pouvez m'envoyer un MP.

Partager

5 commentaires pour "Mise en place d'un tunnel TCP/IP via SSH"
Note moyenne : 3.38 / 4 (13 votes)
Pseudo Commentaire
Hors ligne vince9251 # Posté le 28/08/2010 à 16:25:23
Besoin d'aide ?
Avatar

Avis : Très bon

Ville : Sceaux
Pays : France métropolitaine

C'est un bon tuto, dommage que tu n'explique pas au début ce qu'est le SSH. Peut être devrait tu mettre dans ton introduction que Mateo21 explique dans un mini tuto ce qu'est le SSH, le lien est ici ;)

Citation : Backtrack
The quieter you become, the more you are able to hear...Traduction

Backtrack site officiel
 
Hors ligne ren0 # Posté le 28/08/2010 à 16:28:22
Keep It Simple, Stupid
Avatar

Avis : Très bon

Études : FSA ULG

Salut à toi !

Mon but n'était pas d'expliquer ce qu'est le SSH en détail (on pourrait y passer beaucoup de temps ^^ ) mais bien d'expliquer comment mettre en place d'un tunnel.
Cependant, ta remarque est pertinente et je vais présenter un lien vers le tutoriel de M@teo, en complément d'information, dans un futur proche.

Merci !
 
Hors ligne Canadadry # Posté le 28/08/2010 à 17:19:17
Avatar

Tu aurais pu ajouter que open-ssh esy aussi disponible sur windows via cygwin et qu'un serveur et un client ssh sont intallé de base sur mac os X depuis tiger. Sinon c'est un bon cours, je n'ai pas vu d'erreur. Des schéma peut-être?

Enfin bref c'est déjà très bien :)
Hors ligne g0lluM # Posté le 28/08/2010 à 22:07:18
Avatar

Salut, alors déjà un grand bravo car c'est bien détaillé mais il manque des choses importantes : tu dis que c'est sécurisé, certes mais seulement la connection client => serveur, de plus les requetes DNS ne sont pas sécurisées, pour utiliser le serveur DNS du client il faut faire:

Taper about:config dans la barre d'adresse de firefox, filtre dns et inverser la valeur de network.proxy.socks_remote_dns pour encaspuler les requetes DNS dans le tunnels SSH. Dommage qu'il n'y ait pas de partie pour Windows avec Putty et openSSH pour Windows.

Gollum

Les dépassements de tampon sont souvent dus à une mauvaise utilisation des strings

Image utilisateur
Image utilisateur

L'insanité des installations de logiciels sous Windows
"La vie est amère donc la mort esŧ ta cousine"
 
Hors ligne Death Shadow Dark # Posté le 24/02/2012 à 16:40:38
Avatar

Avis : Bon

Le SSH est un outil/protocole puissant et effectivement sécurisé quand il est bien configuré. Le principe de tunnelisation est très utilisé dans le monde de la sécurité (SSH ou autre protocole).

Juste une remarque, ce qui manque a ton tutoriel c'est un peut de sécurité au tour de OpenSSH car installé openSSH n'est pas suffisant pour avoir une sécurité digne de ce nom.
 

Voir tous les commentaires