SSLH, pour SSL/SSH multiplexer, est un outil écrit en C qui permet d'utiliser un seul et même port TCP pour se connecter à un serveur en SSH, HTTPS ou OpenVPN. Il est donc possible de n'ouvrir que le port 443 pour accéder à SSH, Apache/NGinx en HTTPS ou OpenVPN sur un serveur, et ceci sur la même adresse IP.

Pour réaliser ce miracle, il analyse les paquets entrants sur un port TCP, sans les déchiffrer, et recherche les spécificités de chaque protocole pour envoyer le trafic vers le bon port d'écoute du daemon concerné par ce trafic.

Il supporte IPV4 et IPV6, et peu reconnaître les protocoles OpenVPN, HTTPS, Tinc, XMPP et SSH. Il est également possible d'ajouter de nouveau protocole en les identifiants grâce à des REGEXP. Par exemple, une connexion XMPP commence toujours par un paquet contenant "jabber", OpenVPN commence lui par les octets 0x00, 0xOD ou 0x38, etc.

Installation

Sous GNU/Debian, on passe par apt-get :

apt-get install sslh

Vous pouvez récupérer les sources sur la page GitHub du projet SSLH et compiler si vous voulez une version particulière ou à jour.

Configuration

Nous allons ici voir comment utiliser Apache, SSH et OpenVPN sur le même port 443.

Apache

Il faut commencer par indiquer à Apache que son port d'écoute pour HTTPS ne sera plus 443 mais par exemple 4443. Ça ce passe dans le fichier /etc/apache2/ports.conf ou il faut remplacer les lignes :

<IfModule ssl_module>
        Listen 1.2.3.4443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 1.2.3.4443
</IfModule>

par

<IfModule ssl_module>
        Listen 1.2.3.4:4443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 1.2.3.4:4443
</IfModule>

Pensez également à modifier ce port dans les fichiers de configuration de vos vhosts :

<VirtualHost 1.2.3.4:4443>

Reste à recharger la configuration d'Apache :

systemctl reload apache2

OpenVPN

Pour OpenVPN, il faut travailler sur le fichier /etc/openvpn/server.conf pour modifier le port et idéalement faire écouter le daemon uniquement sur localhost :

local 127.0.0.1
port 443

Si vous utilisiez déjà port-share pour partager le port 443 entre HTTPS et OpenVPN, il faut supprimer/commenter la ligne.

N'oublier pas de recharger OpenVPN :

systemctl reload openvpn

SSLH

Maintenant que tous nos daemon ont libéré le port 443 sur notre interface réseau publique, nous pouvons passer à la configuration de SSLH.

Elle est très simple, tout ce passe dans le fichier /etc/default/sslh, où il faut activer le démarrage du daemon avec "RUN=yes" et spécifier les adresses et ports de nos serveurs :

RUN=yes
DAEMON_OPTS="--user sslh --on-timeout ssl --listen 1.2.3.4:443 --ssh 127.0.0.1:22 --openvpn 127.0.0.1:443 --ssl 1.2.3.4:4443 --pidfile /var/run/sslh/sslh.pid"

Classiquement user permet d'indiquer l'utilisateur pour faire tourner le daemon, listen d'indiquer l'adresse IP et le port d'écoute, puis ssh, openvpn et --ssl d'indiquer l'adresse IP et le port d'écoute de chaque daemon.

L'option --on-timeout ssl permet de préciser la redirection par défaut en cas de timeout. Ici, le trafic sera envoyer vers Apache.

Et pour finir, démarrons SSLH avec :

systemctl start sslh

SSH

Il faut cette fois modifier le fichier /etc/ssh/sshd_config pour à nouveau spécifier le port et idéalement faire écouter le daemon uniquement sur localhost :

Port 22
ListenAddress 127.0.0.1

Et enfin recharger la configuration :

systemctl reload ssh

Vous voilà maintenant avec OpenVPN, SSH et HTTPS accessible sur le seul port 443 de votre IP publique, ce qui est très pratique pour utiliser ces services depuis un réseau qui n'autorise que le trafic sur les ports 80 et 443.

Source : https://linuxfr.org/news/sslh%C2%A0110-la-b%C3%AAte-noire-des-censeurs