Raspberry PI – Raspbian et reverse proxy Nginx
Bonjour,
Si comme moi, vous commencez à avoir pas mal de services dispatché sur quelques serveurs et que vous en avez marre de router des ports vers ces différents services, voici la solution : le reverse proxy.
Je vais donc vous présenter comment installer et configurer Nginx en tant que reverse proxy.
Ce tuto est orienté Raspberry et Raspbian mais il fonctionnera également pour toutes les distributions à base de Debian (Ubuntu et consorts). Pour les autres distributions, vous n’aurez pas de mal à trouver comment installer Nginx (Par ex yum install nginx pour tous les système à base de RedHat/CentOs …)
Sans compter de l’avantage indéniable de ne plus router pleins de ports « non standard » pour accéder à tous vos services, vous augmenterez la sécurité :
-Non seulement vos différents services ne seront plus en frontaux sur le web
-Mais en plus si l’un de vos services ne supporte pas le SSL, votre reverse proxy lui supporte très bien le SSL et peut meme rediriger automatiquement toutes les requêtes http en https.
Le tunnel ssl ne sera pas du client vers le service mais du client vers le reverse proxy, la connexion entre le reverse proxy et le service qui ne gère pas le ssl sera en http.
Nous avons donc deux types de liaisons :
|client|<==HTTPS==>|REVERSE_PROXY|<==HTTPS==>|serveur|
|client|<==HTTPS==>|REVERSE_PROXY|<==HTTP==>|serveur|
Voici un shémas représentant un client voulant accéder au service01http.
Il ouvre donc son navigateur et tape : http://service01http.mondomaine.com
Mais une redirection s’effectue par le reverse proxy et dans son navigateur apparait l’adresse : https://service01http.mondomaine.com
Passons maintenant au vif du sujet.
Installation de Nginx :
Ouvrez
apt-get install nginx
Génération d’un certificat SSL autosigné (ceci va permettre de ne pas avoir de connexion en clair,cela évite de pouvoir récupérer les identifiants/password en clair sur votre réseau) :
sudo openssl genrsa -out /etc/nginx/nginx.key 2048 sudo openssl req -new -key nginx.key -out /etc/nginx/nginx.csr sudo openssl x509 -req -days 3650 -in /etc/nginx/nginx.csr -signkey /etc/nginx/nginx.key -out /etc/nginx/nginx.crt
Les hôtes virtuels :
Imaginons que nous avons 4 services web sur 3 serveurs :
-Serveur_01 : Service_01_HTTP -Serveur_02 : Service_02_HTTPS -Serveur_03 : Service_03_HTTP + Service_04_HTTPS
Nous allons donc créer 4 entrées DNS sur notre nom de domaine :
service01http.mondomaine.com service02https.mondomaine.com service03http.mondomaine.com service04https.mondomaine.com
Imaginons maintenant que pour le service02https nous voulons y accéder par deux adresses différentes :
service02https.mondomaine.com service02httpsbis.mondomaine.com
Le but est donc d’accéder à ces 4 services en HTTPS (peu importe que le service supporte ou non le SSL)
Configuration des hosts :
Nous allons donc commencer par configurer Nginx :
sudo nano /etc/nginx/sites-available/reverse
Collez ensuite ceci :
# Certificats SSL ssl_certificate /etc/nginx/nginx.crt; ssl_certificate_key /etc/nginx/nginx.key; server { # Redirection des requetes en HTTP vers HTTPS # Port en entree listen 80; # Redirection vers return 301 https://$host$request_uri; } server { # service01http listen 443; # J'active SSL ssl on; server_name service01http.mondomaine.com; # entree DNS location / { # pour le dossier racine (/), on active le mode proxy vers l'adresse spécifiée, sur le port spécifié proxy_pass http://192.168.1.2:80/; } } server { # service02https et service02httpsbis listen 443; ssl on; # On peut spécifier 2 noms de domaine différents qui auront le même comportement server_name service02https.mondomaine.com; server_name service02httpsbis.mondomaine.com; location / { proxy_pass https://192.168.1.3:443/; } } server { # service03http listen 443; # J'active SSL ssl on; server_name service03http.mondomaine.com; # entree DNS location / { # pour le dossier racine (/), on active le mode proxy vers l'adresse spécifiée, sur le port spécifié proxy_pass http://192.168.1.4:80/; } } server { # service04https listen 443; # J'active SSL ssl on; server_name service04https.mondomaine.com; # entree DNS location / { # pour le dossier racine (/), on active le mode proxy vers l'adresse spécifiée, sur le port spécifié proxy_pass https://192.168.1.4:443/; } }
Maintenant un petit restart et votre reverse proxy est maintenant en ligne !
sudo /etc/init.d/nginx restart
Petit ajout, si Nginx n’arrive pas a redémarrer, c’est peut être à cause de la longueur de votre entrée DNS (server_name)
Pour y remédier faites :
sudo nano /etc/nginx/nginx.conf
Puis cherchez la ligne :
#server_names_hash_bucket_size 64;
Décommentez là en enlevant le # :
server_names_hash_bucket_size 64;
Et vous pouvez maintenant redémarrer Nginx :
sudo /etc/init.d/nginx restart
Si vous avez des soucis ou des questions, n’hésitez pas les commentaires sont fait pour ça :)