Le programme stunnel permet de chiffrer des connexions TCP en SSL (Secure Sockets Layer). Il peut donc aussi aider à passer les règles firewall. On peut par exemple, passer une connexion VPN dans stunnel tant que le protocol utilisé est en TCP. Voici un exemple de configuration :
Installation et configuration serveur (Debian/Ubuntu)
Installation sous Debian/Ubuntu
apt install stunnel
Après avoir installé le programme stunnel, nous allons configurer le service permettant de chiffrer le flux.
Pour cela, créer un fichier de configuration
touch /etc/stunnel/services.conf
Editer le fichier /etc/stunnel/services.conf puis ajouter les lignes suivantes :
cert = /etc/stunnel/stunnel.pem ;Certificat que l'on va générer plus tard CAfile = /etc/stunnel/stunnel.pem ;CA du Certificat que l'on va générer plus tard verify = 3 ;Type de vérification du certificat (voir la doc pour plus détails) ;Définition des Services [Telnet] accept = Mon_IP_Public:Numero_De_Port ;Le numéro port du routeur sur le quel on souhaite envoyer le trafic connect = 127.0.0.1:23 ;Adresse IP et port du service aux quel on souhaite se connecter (dans cette exemple ça sera telnet)
Lancer stunnel sur le serveur
systemctl restart stunnel4.service
Ne pas oublier de vérifier que le firewall accepte les connexions sur l’ip et le port qui ont été configurés.
Installation et configuration client (Debian/Ubuntu/Windows)
Debian/Ubuntu Client
apt install stunnel
créer un fichier de configuration
touch /etc/stunnel/services.conf
Editer le fichier /etc/stunnel/services.conf puis ajouter les lignes suivantes :
client = yes ;Indique qu'il s'agit du client cert = /etc/stunnel/stunnel.pem ;Certificat que l'on va générer plus tard CAfile = /etc/stunnel/stunnel.pem ;CA du Certificat que l'on va générer plus tard verify = 3 ;Type de vérification du certificat (voir la doc pour plus détails) ##Définition des Services## [Telnet] ;Nom du Service accept = 127.0.0.1:23 ;Adresse et port sur lesquels le client telnet se connectera sur la machine cliente afin de passer dans le tunnel connect = Mon_IP_Public:Numero_De_Port ;L'addresse IP et le numéro port du routeur sur le quel on souhaite envoyer le trafic
Windows
Lancer l’installeur puis suivre les instructions de l’assistant d’installation
Créer un fichier de configuration C:\Program Files (x86)\stunnel\config\services.conf
Puis ajouter les lignes suivantes :
client = yes cert = stunnel.pem CAfile = stunnel.pem verify = 3 ;##Définition des Services## [Telnet] accept = 127.0.0.1:45000 connect = Mon_IP_Public:Numero_De_Port
Génération des certificats
Il faut au préalable avoir installé OpenSSL
Création de l’arborescence
mkdir CA cd CA mkdir newcerts private echo '01' > serial touch index.txt
Création du fichier de configuration openssl.cnf
[ req ] default_bits = 4096 # Size of keys default_keyfile = key.pem # name of generated keys default_md = sha512 # message digest algorithm string_mask = nombstr # permitted characters distinguished_name = req_distinguished_name [ req_distinguished_name ] # Ces valeurs apparaitront au Prompt #---------------------- ---------------------------------- 0.organizationName = Remplir-a-votre-convenance organizationalUnitName = Remplir-a-votre-convenance emailAddress = Remplir-a-votre-convenance emailAddress_max = 40 localityName = Remplir-a-votre-convenance stateOrProvinceName = Remplir-a-votre-convenance countryName = Remplir-a-votre-convenance countryName_min = 2 countryName_max = 2 commonName = FQDN-ou-Adresse-IP-de-votre-server commonName_max = 64 # Valeurs par défaut que l'on peut modifier. #------------------------------ ------------------------------ 0.organizationName_default = Remplir-a-votre-convenance localityName_default = Remplir-a-votre-convenance stateOrProvinceName_default = Remplir-a-votre-convenance countryName_default = Remplir-a-votre-convenance [ v3_ca ] basicConstraints = CA:TRUE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always
Génération du CA root
openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf
Vérification des paramètres
openssl x509 -in cacert.pem -noout -text openssl x509 -in cacert.pem -noout -dates openssl x509 -in cacert.pem -noout -purpose
Génération du certificat que l’on va placer sur le client et le serveur
openssl req -new -days 365 -nodes -config openssl.cnf -out stunnel.pem -x509 -keyout stunnel.pem
Afin de tester la connexion, lancer un client telnet puis saisir les paramètres correspondants à la configuration. dans notre cas il s’agit de 127.0.0.1:45000.
Voici un exemple de log sur le client :
021.07.27 10:49:38 LOG5[2]: Service [Telnet] accepted connection from 127.0.0.1:9716 2021.07.27 10:49:38 LOG5[2]: s_connect: connected Mon_IP_Public:Numero_De_Port 2021.07.27 10:49:38 LOG5[2]: Service [Telnet] connected remote server from 10.8.8.1:9717 2021.07.27 10:49:38 LOG5[2]: Certificate accepted at depth=0: O=TZA, L=City, ST=STATE, C=CO 2021.07.27 10:49:41 LOG5[3]: Service [Telnet] accepted connection from 127.0.0.1:9719 2021.07.27 10:49:41 LOG5[3]: s_connect: connected Mon_IP_Public:Numero_De_Port 2021.07.27 10:49:41 LOG5[3]: Service [Telnet] connected remote server from 10.8.8.1:9720