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
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)