Univers Libre

Connexion ssh derrière un proxy

Written on 17 November 2009, 00:00 EST
Tags: corkscrew, ssh.

Peut-être avez vous déjà rencontré ce problème, il n'est pas possible de se connecter en SSH sur un serveur lorsqu'on se trouve derrière un proxy.

Je m'en suis aperçu quelques jours après le début des cours à l'IUT de Nancy lorsque j'ai voulu créer un tunnel SSH (on verra comment par la suite) pour pouvoir accéder à mes mails, les messageries instantanées, etc… Le réseau de l'université se trouve en effet derrière un proxy qui bloque tout et n'importe quoi (en fait seul les ports http et https sont autorisés).
Souvenir du réseau wifi de l'IUT de Marseille où on pouvait télécharger en P2P les films ISO Linux en quelques minutes... :(.

Pour résoudre le problème (du ssh, pas du P2P), il y a deux choses à faire.

Coté serveur

Bien entendu, comme le proxy bloque tout sauf http et https, il n'y a pas de miracles, il faut faire écouter le serveur SSH sur le port https (les transfert sont chiffrés pour https et SSH, le proxy ne peut pas voir la différence). Pour ça, modifiez votre /etc/ssh/sshdconfig_ pour changer la valeur de Port :

Port 443

Redémarrez OpenSSH et assurez vous de changer les ports également dans votre pare feu et votre routeur.

Coté client

À priori, on peut croire que le problème est maintenant résolu, le serveur écoute sur le port https, le proxy laisse passer les données sur le port https, et le client indique de ce connecter par le port https. Et bien non, ce n'est pas aussi simple, et je n'ai eu la réponse qu'aujourd'hui, pendant un cours sur les serveurs web.

En fait, le fait de passer par un proxy interdit de faire une connection direct entre le client et le serveur (un proxy étant fait pour s'intercaler entre les échanges). Il faut donc dire explicitement au proxy d'établir une connection direct entre les deux machines, et de ne plus s'en mêler ensuite. C'est grâce à la commande HTTP CONNECT que c'est possible (vous voyez mieux le rapport avec les serveurs web à présent ;) ).

Pour réaliser ça en pratique, on va utiliser corkscrew. Installez le puis modifiez votre fichier client /etc/ssh/sshconfig_ comme ceci :

Host univers-libre.net-proxy
        Hostname univers-libre.net
        Port 443
        ProxyCommand /usr/bin/corkscrew vivianen.iuta.univ-nancy2.fr 3128 %h %p

Host univers-libre.net
        Port 443

Explications :
on a définit 2 configurations (host, dans le fichier) : une dans le cas normal (univers-libre.net) et une autre avec un proxy (univers-libre.net-proxy).
Ainsi, si vous êtes derrière le proxy, vous devrez taper :

ssh univers-libre.net-proxy

Dans le cas contraire :

ssh univers-libre.net

Dans la configuration avec proxy, on indique que, en fait le vrai nom n'est pas univers-libre.net-proxy mais univers-libre.net (avec la directive hostname). Le port est bien sûr fixé à 443 (https) dans les 2 cas.
Viens la ligne ProxyCommand : on dit à OpenSSH de faire appel à corkscrew en lui passant en paramètre l'adresse du proxy (ici vivianen.iuta.univ-nancy2.fr), le port du proxy (3128 qui est le port par défaut des proxies). %h et %p indiquent respectivement l'hôte à atteindre et son port (univers-libre.net et 443).

Maintenant que vous avez un accès SSH sur votre serveur à vous la liberté :) . Vous pouvez alors créer un tunnel SSH pour certaines applications, en rajoutant une ligne de ce type dans le fichier /etc/ssh/sshconfig_ de votre client :

LocalForward 143 localhost:143

Dans cet exemple je dis de rediriger toutes les demandes de connections qui sont envoyées sur le port 143 (imap), vers le même port et sur le même serveur que le serveur SSH (localhost). Ainsi mon client mail pourra accéder à mon serveur imap, le tout de façon transparente, mais crypté dans le tunnel :-).