date: 13 Feb 2010 title: SSLH : HTTPS et SSH sur le même port ! tags: planet-libre, ssh, sslh xrefs: connection-ssh-derriere-un-proxy-la-solution.txt Dans un [précédent article](index.php?p=333), j'avais parlé de corkscrew. Le but était de pouvoir se connecter en SSH sur son serveur en étant derrière un proxy, en utilisant le port 443 (réservé au HTTPS). Mais il y avais quand même un gros inconvénient à cette technique : coté serveur, le serveur SSH occupait le port 443, ce qui empêchait toute utilisation de HTTPS par le serveur web Mais bien sûr, il est possible de résoudre ce problème : vous devez choisir entre HTTP+SSL et SSH ? choisissez SSLH :) ## Principe de fonctionnement SSLH est un multiplexeur de port : c'est un démon qui écoute sur le port 443 du serveur, et en fonction des paquets qu'il reçoit ou pas, il les transmettra soit au serveur web qui n'écoutera plus que sur l'interface locale, soit au serveur SSH qui sera sur un port différent. Voici un petit schéma explicatif : [caption id="attachment_358" align="alignnone" width="300" caption="Schéma de fonctionnement de SSLH"][![Schéma de fonctionnement de SSLH](http://billux13.servhome.org/wp-content/schema-article-sslh-300x201.png)]( http://billux13.servhome.org/wp-content/schema-article-sslh.png)[/caption] La question qui vient juste après est : mais comment fait-il pour différencier les paquets SSH des paquets HTTPS. Effectivement, les deux sont chiffrés et il ne doit pas pouvoir les déchiffrer. En fait, c'est tout simple : un client HTTPS (donc un navigateur web typiquement) commence à parler le premier (par exemple pour faire un GET sur une page web) alors qu'un client SSH attend une réponse du serveur (l'envoi d'une bannière). Ainsi, SSLH attend un certain moment (par défaut 2 secondes) que le client envoi un paquet. Si il en a envoyé, c'était alors une connexion HTTPS, sinon c'était du SSH. ## Installation et Configuration ### Un peu d'apt-pinning Malheureusement, SSLH n'est pas présent dans les dépôts stable de Debian, mais on le trouve dans les dépôts testing. Un apt-get install ne suffit plus, mais ce n'est guère plus compliqué. Premièrement, nous allons ajouter le dépôt testing à notre sources.list : vim /etc/apt/sources.list deb http://ftp.fr.debian.org/debian/ testing main contrib non-free Ensuite, comme on ne veut pas mettre à jour tout le système vers la testing (ce qui serait le cas si vous faites un apt-get update puis upgrade), il faut définir des priorités (c'est de l'[apt-pinning](https://help.ubuntu.com/community/PinningHowto)) : Si vous faites un apt-cache policy vous verrez les dépôts ainsi que leur priorité : ... 500 http://debian.mines.inpl-nancy.fr lenny/main Packages release v=5.0.4,o=Debian,a=stable,l=Debian,c=main origin debian.mines.inpl-nancy.fr ... Il faut donc s'arranger pour que les dépôts testing soient utilisés seulement si le paquet n'est pas présent dans les dépôts stable, donc leur définir une priorité plus faible. Cela ce fait dans le fichier /etc/apt/preferences (créez le si il n'existe pas) : vim /etc/apt/preferences Ajoutez y ceci : Package: sslh Pin: release a=testing Pin-Priority: 600 Package: * Pin: release a=testing Pin-Priority: 1 Un nouveau apt-cache policy doit vous indiquer que le dépôt testing a maintenant une priorité de 1 (la plus basse). Vous pouvez maintenant installer le paquet sslh, après avoir rechargé la liste des paquets : apt-get install sslh ### Configuration On va commencer par s'occuper du serveur web (ici Lighttpd, mais la procédure est la même pour n'importe quel serveur web). Éditez le fichier de configuration de SSL pour n'écouter plus que sur l'IP locale (127.0.0.1) : vim /etc/lighttpd/conf-available/10-ssl.conf Remplacez la ligne $SERVER["socket"] == ":443" par celle-ci : $SERVER["socket"] == "127.0.0.1:443" Enregistrez et redémarrez lighty. Vérifiez que lighty n'écoute que sur localhost, avec un netstat -atn |grep 443 Vous devriez voir une ligne du type tcp 0 0 127.0.0.1:443 0.0.0.0:* LISTEN Une fois ceci fait, allez dans la configuration de SSLH pour l'activer : vim /etc/default/sslh Rajouter à la fin RUN=yes comme indiqué et changez éventuellement le port de votre serveur SSH si celui-ci n'écoute pas sur le 22. Vous devez également changer l'IP 0.0.0.0 par celle de votre serveur (192.168.0.10 par exemple) Enfin, démarrez le démon SSLH et vous aurez la joie de profiter à la fois du HTTPS et du SSH dernière les proxy sur le même serveur :D