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

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

Mis à jour le jeudi 10 janvier 2013

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

# 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

# /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

# 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

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

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.

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

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.

déroulement d'un cours

  • 1

    Dès aujourd'hui, vous avez accès au contenu pédagogique et aux exercices du cours.

  • 2

    Vous progressez dans le cours semaine par semaine. Une partie du cours correspond à une semaine de travail de votre part.

  • !

    Les exercices doivent être réalisés en une semaine. La date limite vous sera annoncée au démarrage de chaque nouvelle partie. Les exercices sont indispensables pour obtenir votre certification.

  • 3

    À l'issue du cours, vous recevrez vos résultats par e-mail. Votre certificat de réussite vous sera également transmis si vous êtes membre Premium et que vous avez au moins 70% de bonnes réponses.

L'auteur

Exemple de certificat de réussite
Exemple de certificat de réussite