[Accueil] - [Plan du site] - [Rechercher] - [ C O L R T S P ]  

 
Tunnel SSH, proxy HTTP
Outrepasser un proxy trop restrictif pour accéder à n’importe-quel serveur 

par nojhan le 3 septembre 2008

Quand on utilise des applications réseaux, il peut arriver que l’on soit bloqué par des administrateurs systèmes tatillons (et compétents, donc), qui vont bloquer tous les ports, sauf ceux du web, et faire passer le traffic dans un proxy HTTP.

Dans cet article, je détaille une des (nombreuses) méthodes possible permettant de contourner ce genre de restriction : le tunnel SSH.

Configuration

Le détail des commandes est donné ici pour Linux, mais la méthode en elle-même, une fois comprise, peut fonctionner pour n’importe-quelle combinaison d’OS.

Imaginons que vous êtes sur un réseau local, derrière un proxy HTTP, et que vous ne pouvez théoriquement accéder à l’internet que sur les ports associés au web : 80 (HTTP) et 443 (HTTPS). C’est le cas dans l’écrasante majorité des cybercafés, par exemple.

À partir du moment où vous avez accès à une machine en dehors de ce réseau, vous pouvez théoriquement accéder à ce que vous voulez sur l’internet. Si vous êtes suffisamment informés pour comprendre ce que je dis, la probabilité pour que vous disposiez d’une machine à votre domicile, accompagnée d’une connexion ADSL permanente, est plus élevée que la moyenne. Cela suffira.

Le principe du tunnel

Le principe du tunnel est simple : on redirige le trafic réseau depuis la machine locale vers le serveur demandé, en passant par la machine à la maison. Par exemple, on configure X-Chat pour utiliser le serveur « localhost » sur le port 6666, le trafic réseau étant ensuite dirigée vers la maison, via une connexion SSH sur le port 443, arrivée là-bas, on redirige le trafic vers irc.freenode.org sur le port 6667.

OpenSSH permet de faire ça très facilement, le trafic passe dans les deux sens, mais vous ne pouvez initier le tunnel que de l’intérieur vers l’extérieur (généralement, sur les réseaux protégés, un pare-feu empêche de le faire dans l’autre sens).

Serveur SSH, port 443

La première étape du montage consiste à installer un serveur SSH sur votre machine « maison », serveur qui utilisera le port 443, en lieu et place du port 22. Le port est important, car c’est un des deux seuls accessibles. Notez que cette configuration vous empêche par ailleurs d’utiliser un serveur HTTPS, pensez à désactiver un éventuel serveur web qui tournerait déjà.

Dans le fichier /etc/ssh/sshd_config, vérifiez la ligne :


Port 443

Si vous avez plusieurs ordinateur sur un réseau local, et que donc votre machin-box est configurée en routeur, penser à faire suivre le port 443 vers la machine où tourne le serveur SSH. Si vous utilisez un seul ordinateur directement connecté à un modem, ne changez rien. Dans les deux cas, vérifiez également que votre pare-feu ne bloque pas le trafic sur ce même port.

Tunnel SSH via proxy HTTP

Pour ouvrir un tunnel SSH, il suffit, en théorie, d’utiliser une commande du genre :


ssh -N -f -p 443 -l nojhan maison -L6667:irc.freenode.org:6667

Celle-ci va ouvrir un tunnel crypté entre la machine locale (-L) et la machine maison, sur le port 6667, servant à faire passer un trafic en direction de irc.freenode.org. Pour information, le flag -N indique qu’on ne démarre pas de shell et -f qu’on lance en arrière plan.

Oui, mais, me direz-vous (et vous aurez raison, sémillant lecteur), le proxy HTTP va bloquer ce trafic, qui n’est pas du HTTPS ! Certes. Aussi allons-nous utiliser un logiciel permettant de faire passer le trafic SSH à travers le proxy. Sous linux, il existe corkscrew.

Une fois celui-ci installé, il faut configurer le client SSH local pour qu’il l’utilise, il suffit d’éditer le fichier ~/.ssh/config :


Host *
 ProxyCommand corkscrew http-proxy.exemple.com 8080 %h %p

En prenant soin de remplacer http-proxy.exemple.com par le proxy de votre réseau local et 8080 par le port de ce même proxy.

Par ailleurs, si le proxy demande une authentification, il faut indiquer le login et le mot de passe dans un fichier ~/.ssh/ http-proxy.auth, sous la forme login:pass. N’oubliez pas de rendre le fichier inaccessible pour d’autres que vous, c’est quand même mieux que si c’était moins bien.

Pour les courageux, quelques trucs en plus sur cet HowTo.

Tunnel stable

La configuration marche en l’état, mais si vous avez testé, vous vous rendrez vite compte que la connexion n’est pas toujours très stable. Il peut y avoir plusieurs raisons à cela, la plus courante étant que le proxy force la fermeture des connexions sans trafic, ou que le montage audacieusement présenté ici reste quand même du bidouillage réseau.

Fort heureusement, il existe un logiciel qui peut se charger pour vous de la basse besogne consistant à relancer les tunnels en cas de problème. Sous linux, il s’agit d’autossh.

autossh va gérer tout seul le lancement de SSH, pour lancer votre tunnel stable, il suffira donc de le lancer :


autossh -M 0     -f -N -p 443 -l nojhan maison -L6667:irc.freenode.net:6667 &

Vous reconnaîtrez les options de SSH dans la seconde partie de la commande, le flag -M de la première partie désactive simplement une fonctionnalité (pourtant intéressante) d’autossh, permettant de faire des tests de connexion en cours d’utilisation. Sans bidouillage supplémentaire, ça risque de ne pas marcher tout de suite et ce n’est de toute façon pas indispensable. N’oubliez pas l’esperluette, autossh ne se détachant pas tout seul.

Moniteur de tunnels

Pour ceux qui (comme moi) auraient des problèmes de stabilité, il peut être utile de pouvoir très rapidement redémarer ses sessions autossh. Pour ce faire, j’ai développé une petite application en mode texte, qui permet de lister ses tunnels en temps réel et de redémarrer des sessions bloquées : ereshkigal

Capture d'écran d'ereshkigal

Configuration réseau

Pour vous connecter à n’importe quel serveur sur n’importe quel port (mais pas pour y faire n’importe quoi, vil canaille), il vous suffit donc d’ouvrir un tunnel, comme on vient de le voir, et de configurer proprement votre accès au réseau.

N’oubliez pas, en effet, que vos tunnels ne peuvent que partir de localhost, il vous faut donc configurer votre environnement de façon à utiliser votre machine locale en lieu et place du serveur normalement visé. Pour reprendre mon exemple, il faudra faire utiliser localhost:6667 à votre client IRC, afin de vous connecter sur irc.freenode.org.

Aller plus loin

Pour ceux (et celles, mais j’y crois moins, hélas) qui ont des choses à se reprocher, pensez que vous pouvez installer sur votre machine, à la maison, un proxy HTTP. Quelle idée, me direz-vous, on a déjà assez de proxy, là ! En fait, cela peut-être utile si le proxy du réseau local à la fâcheuse manie de filtrer le trafic, en interdisant certains sites. En installant chez vous quelque chose comme tinyproxy et en l’utilisant via un tunnel, vous n’aurez plus de problème de filtrage, le trafic étant chiffré par SSH (note : pour peu que le proxy vous autorise à consulter des sites en HTTPS, évidemment).

Pour ceux qui se demanderait si le proxy peut repérer un trafic SSH, oui, c’est possible simplement vu qu’il suffit d’ouvrir les paquets transmis. Seulement, il ne verra que du trafic SSH, en aucun cas ce qu’il y a dedans, puisque c’est chiffré. Cependant, il est possible de déterminer quel type de trafic est dans le tunnel via des techniques statistiques (1)(2), bien que ça ne soit pas forcément très fiable, et sûrement encore moins utilisé.

Il existe également un moyen de faire cohabiter sur le même port un serveur HTTPS et un serveur SSH : avec un hack ou SSLH.


Commentaires

Par cherrinle 13 mars 2013 : Tunnel SSH, proxy HTTP
Join the ’cool crowd’ and buy a retro led watch online at ahappydeal. HUGE Range of cutting edge LED Watch styles for men. FREE UK Delivery.
Par xiaofangsle 4 mars 2013 : Tunnel SSH, proxy HTTP
The Huawei E153 USB Modem is a cellular modem that connect your computer over the 3G broadband USB Modem network with download speed up to 3.6Mbps on the HSDPA band. - USB Modem
Par Tistele 10 février 2011 : Tunnel SSH, proxy HTTP
Article très intéressant quoique un peu compliqué (il aurait été utile de rentrer plus dans le détail technique sur certains points pour comprendre le fonctionnement), mais merci !

Articles populaires

[Accueil] - [Plan du site] - [Rechercher] - [Admin.]       SPIP:Squelette