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.
|
|
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.
|
|
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.
|
|
|
|
Ensuite, pour l’utiliser, rien de plus simple, il faut sélectionner l’identité que nous voulons copier et indiquer la machine cible.
|
|
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
|
|
Ainsi % ssh macmini
va ouvrir une connexion vers 198.51.100.25
avec l’utilisateur jacques
.
La commande serait celle-ci :
|
|
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
:
|
|
La commande serait celle-ci :
|
|
Et si je veux X11 ?
Rien de plus simple, ajoutons la directive ForwardX11
|
|
La commande serait celle-ci :
|
|
Et pour utiliser une autre clef ?
Nous allons ajouter cette fois-ci la directive Identityfile
:
|
|
La commande serait celle-ci :
|
|
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
:
|
|
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 :
|
|
Si nous voulons la même chose pour le tunnel vers le MacPro, il suffit de mettre les bonnes options dans le fichier config :
|
|
Et la ligne de commande pour ouvrir le tunnel sera :
|
|
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 :
|
|
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.
-
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. ↩︎
-
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. ↩︎