SSH et les tunnels


Il m’arrive souvent d’avoir besoin de faire des tunnels SSH. Par exemple quand j’ai besoin de visualiser l’écran de ma machine à la maison alors que je suis dans un cybercafé.

Le réseau à la maison

Derrière le modem ADSL j’ai mis un vieux MacMini. Son adresse IP est 192.168.1.10. J’ai également un MacPro dont l’adresse IP est 192.168.1.20. Enfin mon adresse IP publique (celle fournie par mon fournisseur d’accès) est 198.51.100.25 1

SSH fonctionne également sur ces deux machines 2.

Sur les deux Macs, l’accès au partage d’écran est activé.

Le problème

J’ai besoin de faire quelque chose avec le Finder sur le MacMini. Je vais donc utiliser la fonctionnalité de partage d’écran. Problème, le Firewall de l’endroit où je me trouve interdit l’utilisation du port 5900 (il s’agit du port utilisé par VNC).

En revanche, le port 22 (SSH) est ouvert. Et c’est par là que nous allons passer, en faisant un tunnel SSH.

Le principe est le suivant :
Nous allons rediriger le port 5901 local vers le port 5900 en passant par une connexion SSH vers la machine distante.

1
% ssh -N -L 5901:127.0.0.1:5900 jacques@198.51.100.25

Explication : -L création du tunnel entre les ports 5901 et 5900, -N sans ouverture de Shell sur la machine distante.

Ensuite, il suffit de lancer Screen Sharing ou un client VNC et de se connecter sur le port 5901 de localhost :127.0.0.1:5901

Corsons le problème

Imaginons maintenant que je veuille accéder au Finder du MacPro. Cette fois-ci problème réside dans le fait que le modem de mon FAI redirige le flux SSH vers le MacMini et pas du tout vers le MacPro. Une fois de plus SSH a la solution. Nous allons légèrement modifier notre tunnel pour accéder à la machine de notre choix.

1
% ssh -N -L 5901:192.168.1.20:5900 jacques@198.51.100.25

Ensuite, il suffit d’utiliser Screen Sharing ou VNC de la même façon que précédemment. Cette fois-ci nous arrivons sur le MacPro.

Échange de clefs

Pour simplifier les connexions SSH (et les sécuriser quelque peu), on évite de passer par des mots de passe, il est préférable d’utiliser les paires clefs publique et privée.

Retour sur des notions connues

Dans votre répertoire Départ, vous devriez trouver un répertoire .ssh qui doit contenir au moins une paire de clefs. La clef privée (id_dsa ou id_rsa) et la clef publique qui lui est associée (id_dsa.pub ou id_rsa.pub).

La clef privée doit rester à tout jamais privée. La clef publique elle est déposée dans le répertoire $HOME/.ssh des machines sur lesquels vous désirez vous connecter, sous la forme d’un fichier authorized_keys2. Ce fichier peut comporter plusieurs clefs publiques.

Pour déposer la clef publique sur un serveur distant, on peut la copier (avec scp et l’inclure (avec cat) dans le fichier authorized_keys2.

Il est aussi possible de faire un copier/coller de la clef, après tout, nous sommes sur Mac non ?

Il existe une solution beaucoup plus simple qui consiste à utiliser une commande qui fait ça pour nous. Cette commande, c’est : ssh-copy-id.

Mais… elle est absente d’OSX. À quoi pensent les ingénieurs d’Apple ? À rien sans doute.

Heureusement, celle commande n’est qu’un script qu’il va nous être facile d’installer et d’utiliser.

1
2
% sudo curl https://raw.github.com/beautifulcode/ssh-copy-id-for-OSX/master/ssh-copy-id.sh -o /usr/local/bin/ssh-copy-id
% sudo chmod +x /usr/local/bin/ssh-copy-id
1
2
% sudo curl https://raw.github.com/beautifulcode/ssh-copy-id-for-OSX/master/ssh-copy-id.sh -o /usr/local/bin/ssh-copy-id
% sudo chmod +x /usr/local/bin/ssh-copy-id

Ensuite, pour l’utiliser, rien de plus simple, il faut sélectionner l’identité que nous voulons copier et indiquer la machine cible.

1
% ssh-copy-id -i .ssh/id-dsa.pub jacques@macmini

Et comment se souvenir de tout cela

Justement ce n’est pas aisé. C’est pourquoi il existe le fichier ~/.ssh/config qui va nous permettre de simplifier tout cela en écrivant moins de commandes.

Description du fichier ~/.ssh/config

Ce fichier va décrire, pour chacune des machines cibles, les caractéristiques de la connexion. Voyez un exemple simple pour le MacMini

1
2
3
Host macmini
  Hostname 198.51.100.25
  user jacques

Ainsi % ssh macmini va ouvrir une connexion vers 198.51.100.25 avec l’utilisateur jacques.
La commande serait celle-ci :

1
% ssh jacques@198.51.100.25

Corsons l’affaire

Si le démon SSH de la machine Mac Mini n’écoute pas sur le port 22, mais sur le port 2222, il suffit d’ajouter la directive port :

1
2
3
4
Host macmini
  Hostname 198.51.100.25
  user jacques
  port 2222

La commande serait celle-ci :

1
% ssh -p 2222 jacques@198.51.100.25

Et si je veux X11 ?

Rien de plus simple, ajoutons la directive ForwardX11

1
2
3
4
5
Host macmini
    Hostname 198.51.100.25
    user jacques
    port 2222
    ForwardX11 yes

La commande serait celle-ci :

1
% ssh -X -p 2222 jacques@198.51.100.25

Et pour utiliser une autre clef ?

Nous allons ajouter cette fois-ci la directive Identityfile :

1
2
3
4
5
6
Host macmini
  Hostname 198.51.100.25
  user jacques
  port 2222
  ForwardX11 yes
  Identityfile ~/.ssh/uneautreclefprivee

La commande serait celle-ci :

1
% ssh -X -i ~/.ssh/uneautreclefprivee -p 2222 jacques@198.51.100.25

Et nos tunnels ?

Justement, c’est le but de ce billet (ce fut long n’est-ce pas ?).

Ajoutons dans la définition de MacMini la création du tunnel entre les ports 5901 et 5900 :

1
2
3
4
5
6
7
Host macmini
  Hostname 198.51.100.25
  user jacques
  port 2222
  ForwardX11 yes
  Identityfile ~/.ssh/uneautreclefprivee
  LocalForward 5901 127.0.0.1:5900

Je vous fais grâce de ce que serait la ligne de commande. En revanche je vous donne la ligne de commande qui va activer le tunnel :

1
% ssh -N macmini

Si nous voulons la même chose pour le tunnel vers le MacPro, il suffit de mettre les bonnes options dans le fichier config :

1
2
3
4
5
6
7
Host macpro
  Hostname 198.51.100.25
  user jacques
  port 2222
  ForwardX11 yes
  Identityfile ~/.ssh/uneautreclefprivee
  LocalForward 5901 192.168.1.20:5900

Et la ligne de commande pour ouvrir le tunnel sera :

1
% ssh -N macpro

Magique non ?

Options globales

Il est possible, dans le fichier ~/.ssh/config de définir des options qui s’appliquent à toutes les entrées. Par exemple on peut imaginer que ForwardX11 s’applique à toutes les connexions. Il suffit de définir une entrée Host *. Mettez là en début de fichier :

1
2
Host *
  ForwardX11 yes

One more thing…

Il existe de très nombreuses autres options à ssh et au démon qui lui correspond. Les quelques commandes que nous venons de voir sont les plus courantes et les plus simples à utiliser. Prenez le temps d’explorer le reste.


  1. Ces adresses ne sont pas celles que j’utilise vraiment. En particulier l’adresse IP publique fait partie d’une classe spécialement dédiée à la documentation. ↩︎

  2. Nous allons supposer que mon SSH écoute sur le port convenu, c’est à dire le port 22. Cela n’est pas du tout une bonne idée pour sécuriser les machines. ↩︎

powered by FreeBSD