Tunnel HTTP pour faire du SSH depuis le bureau

Date: 20/05/2009 | Catégories: Open-source,Reseau | Tags: ,,,,

Vous êtes coincé à votre bureau, derrière un beau Firewall qui bloque, mis à part le HTTP, tous les autres protocoles. Au même moment, le site Web hébergé sur votre serveur perso plante... Dans ce cas, il faut attendre le soir, rentrer chez vous pour enfin pouvoir se connecter en SSH sur votre serveur et résoudre le problème.

Il existe cependant une astuce qui moyennant un brin de préparation va vous permettre de faire passer le SSH à travers ce vilain Firewall...

Principe

La théorie est la suivante: nous allons créer un tunnel HTTP entre le PC du bureau et le PC de la maison. C'est possible car le tunnel est basé sur un protocole autorisé par le Firewall de votre entreprise (HTTP dans notre cas mais vous pouvez utiliser n'importe quel protocole TCP). Ensuite, il faudra rediriger sur votre PC de bureau le protocole SSH vers le tunnel HTTP. Une fois que les paquets SSH sont récupérés sur le PC maison, il n'a qu'a les envoyer vers votre serveur.

   

Préparation de la configuration maison

On commence par installer le logiciel HTTPtunnel sur notre PC maison (exemple d'installation sous Ubuntu):

sudo apt-get install httptunnel

Ensuite on lance la commande suivante:

sudo hts --forward-port A.B.C.D:22 80

Cette commande va écouter sur le port TCP/80 (comme c'est un port < 1024 on doit lancer cette commande en root, d'ou l'utilisation de sudo) et rediriger le trafic vers le serveur (d'adresse ip A.B.C.D dans mon exemple) et sur le port SSH (TCP/22).

Ensuite il faut penser à configurer votre *box pour:

  • autoriser les flux HTTP (TCP/80) entrant à destination de l'adresse publique de la *box votre maison (règle de Firewall)
  • rediriger les flux HTTP (TCP/80) à destination de l'adresse publique de la *box votre maison vers l'adresse privé de votre PC maison (règle de NAT/PAT)

Configuration du PC bureau

Si vous avez la chance de travailler sur un OS de type GNU/Linux à votre bureau, la prcédure est alors relative simple.

On commence par installer HTTPtunnel sur notre PC bureau (exemple d'installation sous Ubuntu):

sudo apt-get install httptunnel

Ensuite on lance la commande suivante:

htc --forward-port 2222 E.F.G.H:80

Cette commande va écouter sur le port TCP/2222 (comme c'est un port >
1024, il n'est pas nécessaire de lancer cette commande en root)
et rediriger le trafic vers le PC maison (d'adresse ip E.F.G.H dans mon
exemple) et sur le port HTTP (TCP/80).

Si votre entreprise oblige les flux Web à transiter par un proxy HTTP (d'adresse S.Q.U.I avec une authentification USER/PASSWORD), il faudra ajouter les paramètres suivants à la ligne de commande:

htc -P S.Q.U.I --proxy-authorization USER:PASSWORD --forward-port 2222 E.F.G.H:80

Dans le cas ou votre PC de bureau est sous Windows (snif), il va falloir passer par une configuration du client Putty par exemple en suivant cette procédure.

Lancement du client SSH

Il suffit de lancer la commande suivante à partir de votre PC de bureau:

ssh localhost -p 2222

Vous serez alors connecté sur votre serveur ! 🙂

  • Faut-il encore ne pas avoir de routeur Cisco qui analyse les trames et qui les casse 🙂

    Mais bon billet !

  • compte0

    Deux petites questions:

    Ton serveur écoute sur le port 80, mais le numéro du port est-il si important? Un firewall qui bloque tout ce qui n’est pas HTTP, va bloquer toutes les requettes qui ne vont pas se connecter au port 80 ?

    Pour répondre à la question précédente, tu ne peut pas utiliser ton utiliser en HTTPS ??

  • En fait on dit plutôt que l’on fait un tunnel SSH sur le port HTTP.

    @compte0: l’idée est que pour sortir de l’endroit où tu es, il faut utiliser un port qui est généralement ouvert (80, ou 443 pour l’https), et donc il faut que ton serveur à l’extérieur écoute aussi sur le port en question.

    Finalement, on peut aller encore plus loin avec cette technique, on peut carrément faire du MSN, Skype, Http, ICQ, ou tout ce que vous voulez, depuis votre boulot via un tunnel SSH passant par un port ouvert (exemple 443) en passant par une passerelle chez vous qui redirige les ports en question 😉

  • Wolfen

    Et si on lançait simplement un serveur SSH sur le PC de la maison, un reroutage du port 443 entrant de la box vers le port 22 du PC maison, et puis depuis le PC du boulot, on fait un « ssh -D 1111 -p 443 utilisateur@ip_box_maison ». Ensuite, on configure le serveur mandataire du PC du boulot avec un proxy de type Socks V5 qu’on renseigne sur localhost port 1111 … Et hop ! On fait ce qu’on veut depuis le boulot (pour peu que le 443 soit ouvert …). :o)

  • ed

    et corkscrew?

  • ed

    ya aussi openvpn qui passe bien les proxy http, et au pire AjaxTerm

  • Pour ceux qui ont la possibilité d’avoir deux adresses IP (de nombreux hébergeurs proposent une IP de fail-over), la solution la plus simple reste encore de rediriger le port 443 de cette dernière vers le port 22 (on pourra même mettre un enregistrement DNS ssh@domaine pour rendre le truc quasi transparent).

    Sinon une machine de rebond comme proposé plus haut est sur le même principe.

  • bonjour

    Bon tuto, mais sauf erreur n’y a-t-il pas un problème sur ton lien en vert sur ton schéma ?

    si c’est un serveur internet : dans ce cas ce n’est pas une connexion ssh entre le pc maison et le serveur

    si c’est un pc de chez toi pourquoi ne passe-t-il pas par ta box pour aller sur le net ?

    je dis ça, enfin je peux me tromper mais si ça peut clarifier les choses pour les novices … enfin j’ai peut être loupé un truc (encore …)

  • @scoubidoo.bi: le schéma est bon, c’est bien le PC maison qui établie la connection TCP vers le serveur en SSH. J’ai effectivement simplifié le schéma et le lien vert devrait passer par la *box maison.

  • dans ce cas le serveur vers lequel pointe le lien en vert c’est un serveur à toi ou un serveur quelconque ?

    car si tu pars d’un pc bureau vers le pc maison et que tu utilises le pc maison comme un proxy (via une redirection de port dynamique) alors la connexion entre le serveur xxx et le pc maison n’est pas crypté et est en http normal.

    Exception faite si tu possèdes une connexion sur le dit serveur et que tu utilises le pc maison comme une machine de rebond afin d’établir une connexion ssh avec un autre serveur uniquement joignable depuis le pc maison

    en gros
    ssh en clair
    pc bureau ————–> pc maison ——————> serveur xxx

    sauf si rebond ….

    ssh ssh
    pc bureau ————–> pc maison ——————> serveur xxx
    rebond

    enfin je veux pas faire mon gros lours (c’est mal parti là non ?)
    mais mon nom sur le gravatar bein il apparait pas en entier, et ça c’est pire que tout 😉

    scoubidoo.biDOO

    j’aime quand même bien ton schéma et ton article 😀

  • ça y est je fait mon lourdingue en fait ssh doit être sur la première flêche et en clair sur la deuxième, mais mes espaces ont été supprimés :'(
    bon j’arrête …

    @+

  • Mea culpa (si si) je viens de relire le début de ton article et tu utilises ton pc maison comme un rebond ssh … donc je retire tout le « mal » que j’ai dit 😛
    pardon, 1000 excuses, toutes mes confuses.

    @+

  • @scoubidoo.bidou: c’est à moi de m’excuser d’avoir écorché ton pseudo 😉 A bientôt et bon week-end !