SSH over HTTP, ou comment échapper aux proxys

Imaginez : vous êtes au bureau, et vous devez vous connecter en SSH à votre machine perso pour une raison ou une autre, légitime bien sûr (le rapport de la veille sur lequel vous avez travaillé si tard par exemple). Comme dans beaucoup d’entreprises, le traffic à destination du port 22 est bloqué et un affreux proxy régit tout ce qui passe. Heureusement tout n’est pas perdu.

Disclaimer

Pas question ici de parler de manières de contourner votre devoir de productivité (ou alors c’est un dommage collatéral et on enverra une couronne et des fleurs). Non, vous êtes grands et vous savez ce que vous faites. De toutes façons, je ne suis pas responsable de l’utilisation que vous feriez des infos contenues dans cet article. Et toc.

Principe

Le principe général est de faire passer un traffic réseau chiffré, SSH, sur le protocole HTTP en utilisant l’instruction CONNECT, et ce deux fois s’il vous plaît. Cette commande HTTP demande au serveur de faire suivre le traffic vers la destination sans analyser le contenu ou sa validité.

Bien, cela étant dit, vous n’aurez pas à taper la commande CONNECT vous même. C’est ici qu’entre en jeu cet utilitaire formidable qu’est proxytunnel. Pour le côté client, on utilisera cet autre outil tout aussi formidable (on se croirait chez Drucker, c’est horrible) qu’est Apache.

Téléchargez Proxytunnel pour la plateforme depuis laquelle vous vous connecterez. Choisissez de préférence une version binaire et collez-la précieusement sur une clé USB. Vous n’en aurez plus besoin avant les tests.

Voici ce qui va se passer : depuis votre machine, située derrière le proxy, vous établissez, grâce à Proxytunnel, une connection HTTP vers un serveur Apache fonctionnant sur la machine cible. Le port de destination sera expliqué un peu plus loin. Ce serveur va à son tour jouer le rôle de proxy pour les données à destination du port 22 de la même machine (nous parlons de SSH). Et voilà, vous êtes connecté chez vous. Parlons un peu de la configuration nécessaire côté Apache.

Configurer Apache

Afin de ne pas être embêté par un proxy qui va voir que le traffic est chiffré en utilisant SSL (oui, pour lui ça en est) mais qu’il ne part pas vers un port standard pour ce traffic, vous allez devoir mettre Apache en écoute sur le port 443 sans utiliser le chiffrement SSL. Si vous utilisez déjà ce port, il vous faut espérer que le proxy laissera passer le traffic SSL sur le port 563 (nntps, NNTP over SSL). C’est le cas pour le proxy de Microsoft, ISA. Dans ce cas, remplacez 443 par 563 dans tous les exemples qui suivent. Je précise que ce cas, qui devrait fonctionner, n’a pas été testé. Si ça marche pour vous, faîtes le moi savoir, je confirmerai l’info ici même.

D’abord, il faut dire à Apache d’écouter sur le port 443 (à rajouter au besoin dans le fichier de configuration global du serveur) et qu’on va créer des vhosts sur ce port pour toutes les IPs :

Listen 443
NameVirtualHost *:443

Maintenant, vous pouvez passer à la configuration du proxying proprement dit (toujours à rajouter dans la conf globale d’Apache, ou dans un fichier inclus) :

<IfModule mod_proxy.c>
ProxyRequests On
ProxyVia On
AllowCONNECT 22

<Proxy www.monserveur.com>
Order deny,allow
Deny from all
Allow from [IP_PUBLIQUE_1]
Allow from [IP_PUBLIQUE_2]
</Proxy>

<Proxy *>
Order deny,allow
Deny from all
</Proxy>

</IfModule>

Voilà, c’est fini. Quelques explications :

  • ProxyRequests On : on autorise le proxying ;
  • ProxyVia On : le serveur rajoute un en-tête « Via : » aux requêtes ;
  • AllowCONNECT 22 : seules les requêtes à destination du port 22 sont autorisées ;
  • <Proxy www.monserveur.com>... </Proxy> : on autorise uniquement les connections à destination de www.monserveur.com (à remplacer par le nom de votre machine) depuis les IPs IP_PUBLIQUE_1 et IP_PUBLIQUE_2 (à modifier en fonction de votre cas) ;
  • <Proxy *>...</Proxy> : juste pour éviter que votre machine ne serve de proxy public, ouvert à tout le monde. Toujours appréciable.

Maintenant, redémarrez Apache et sautez à la section suivante.

Proxytunnel en tant que daemon

Bien, vos petits doigts fébriles sont tout prêts à taper la commande magique qui vous ouvrira les portes de cette saleté de proxy. Sans plus tarder, la voici :

proxytunnel -p PROXY:PORT -r www.serveur.com:443 -d www.monserveur.com:22 -v -a PORT_LOCAL

Petite explication de texte :

  • -p PROXY:PORT : l’adresse ou le nom du proxy local, avec le numéro de port à utiliser ;
  • -r www.serveur.com:443 : le FQDN ou l’IP de votre machine avec le numéro de port sur lequel écoute Apache ;
  • -d www.serveur.com:22 : comme avant, sauf qu’ici c’est la destination finale qu’il faut préciser (votre machine et le port sur lequel écoute le service SSH) ;
  • -a PORT_LOCAL : Proxytunnel peut se lancer en daemon et écouter sur un port local pour forwarder ce qui arrive dessus à travers le proxy. C’est ce que nous faisons ici en lui donnant un numéro de port quelconque ;
  • -v : c’est toujours pratique de pouvoir débugguer, alors on lui demande d’être bavard.

Maintenant, connectez-vous en ssh sur localhost:PORT_LOCAL. Hop, vous êtes automagiquement transportés à travers tous ces proxys vers votre chez-vous.

Savourez-bien le confort de votre chère machine, et rappelez-vous que vous êtes ici pour bosser.