Dissimulation avec sslh

sslh est un outil qui permet de trier et répartir différent type de flux arrivant sur un même port.

Par exemple: ssh et http sur le port 443.

J’ai testé l’installation depuis les dépôts debian et raspbian.

installation

apt install sslh

Configuration

Coté sslh

il faut placer sslh en amont du serveur web (nginx). donc en écoute sur le port 443 et rediriger le flux sur un autre port pour le serveur web par exemple 2443.

config du service systemctl avec le mode proxy transparent

source

Le fichier cible est /etc/systemd/system/sslh.service

[Unit]
Description=SSL/SSH multiplexer
After=network.target
Documentation=man:sslh(8)

[Service]
ExecStart=/usr/sbin/sslh -F /etc/sslh/sslh.cfg
KillMode=process

# Set routing rules/route automatically on sslh service start
PermissionsStartOnly=true

# Add the ip rules and route to enable Transparent Proxy
ExecStartPre=/sbin/ip rule add fwmark 0x1 lookup 100
ExecStartPre=/sbin/ip route add local 0.0.0.0/0 dev lo table 100
ExecStartPre=/sbin/ip rule add from 127.0.0.2/32 table 100
ExecStartPre=/sbin/ip route flush cache

# Remove the ip rules and route to enable Transparent Proxy
ExecStopPost=/sbin/ip rule del fwmark 0x1 lookup 100
ExecStopPost=/sbin/ip route del local 0.0.0.0/0 dev lo table 100
ExecStopPost=/sbin/ip rule del from 127.0.0.2/32 table 100
ExecStopPost=/sbin/ip route flush cache

[Install]
WantedBy=multi-user.target

à la suite de quoi, on recharge les services:

en root

systemctl daemon-reload

Fichier de conf sslh

Le fichier cible est défini au dessus dans le service : /etc/sslh/sslh.cfg

Normalement le dossier /etc/sslh n’existe pas. Il faut le créer.

verbose: false;
foreground: true;
inetd: false;
numeric: true;
transparent: true;
timeout: 2;
user: "sslh";
pidfile: "/var/run/sslh.pid";
chroot: "/var/empty";

# Change hostname with your external address name.
listen:
(
    {
        host: "192.168.0.4";
        port: "443";
    }
);

# this solution was recommended from: wiki.techunit.org/SSLH
protocols:
(
        {
            name: "ssh";
            service: "ssh";
            host: "127.0.0.2";
            port: "22";
            log_level: 1;
        },
        {
            name: "ssl";
            host: "127.0.0.2";
            port: "2443";
            log_level: 1;
        }
);

Coté nginx

Il faut passer tout les Listen 443 en Listen 2443. Pour cela j’ai utilisé sed :

cd /etc/nginx/site-avalaible
sed -i 's/443/2443/g' *

et voila !

Utilisation

On redémarre simplement les services pour que les modifications de configuration soit pris en compte.

systemctl restart sslh ; systemctl restart nginx

et c’est tout…

Faites attention si vous étes hors d’un accès ssh classique et si vous utilisé des outils tel que shellinabox, une erreur peux rompre la liaison. Des outils tel que screen, byobu ou tmux sont a même de maintenir la connexion lors du redémarrage. Dans le cas d’une rupture de lien ssh reste dispo sur le port que vous avec configuré (défaut 22)