date: 17 Nov 2009 title: Connection ssh derrière un proxy - la solution tags: planet-libre, 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 ISOs 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/sshd_config pour changer la valeur de "Port" : Port 443 Redémarrez OpenSSH et assurez vous de changer les ports également dans votre pare feux 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/ssh_config 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/ssh_config 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 :-).