« Proxy » : différence entre les versions

De Documentation
Aller à la navigationAller à la recherche
Ligne 1 : Ligne 1 :


----
----
=Installation de nginx et de certbot dans un conteneur Alpine léger=
'''<big>Installation de nginx et de certbot dans un conteneur Alpine léger</big>'''


Pour que la redirection fonctionne, il faut ajouter un CNAME aux sous-domaines et non les rediriger (réécriture de la requête sinon, et échec !)
Pour que la redirection fonctionne, il faut ajouter un CNAME aux sous-domaines et non les rediriger (réécriture de la requête sinon, et échec !)


== Création du conteneur et installation d'Nginx ==
=Création du conteneur et installation d'Nginx=
Création et mise à jour du conteneur :
  lxc launch proxy locale:alpineLe
  lxc launch proxy locale:alpineLe
  lxc exec proxy apk update
  lxc exec proxy apk update
  lxc exec proxy apk upgrade
  lxc exec proxy apk upgrade


Installation de nginx
Installation de nginx et démarrage auto du service :
  lxc exec proxy apk add nginx
  lxc exec proxy apk add nginx
Démarrage automatique du service :
  lxc exec proxy rc-update add nginx
  lxc exec proxy rc-update add nginx


Mettre le conteneur en frontal (à partir de l'hôte)
Mettre le conteneur en frontal ''(à partir de l'hôte)''
  lxc config device add nom_du_conteneur myport80 proxy listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80 proxy_protocol=true
  lxc config device add ''nom_du_conteneur'' myport80 proxy listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80 proxy_protocol=true
  lxc config device add nom_du_conteneur myport443 proxy listen=tcp:0.0.0.0:443 connect=tcp:127.0.0.1:443 proxy_protocol=true
  lxc config device add ''nom_du_conteneur'' myport443 proxy listen=tcp:0.0.0.0:443 connect=tcp:127.0.0.1:443 proxy_protocol=true


Annuler le fichier de conf par défaut
Annuler le fichier de conf par défaut :
  lxc shell proxy
  lxc shell proxy
  mv /etc/nginx/http.d/default.conf /etc/nginx/http.d/default.conf.sav
  mv /etc/nginx/http.d/default.conf /etc/nginx/http.d/default.conf.sav
Ligne 29 : Ligne 28 :
:* /etc/nginx/'''proxy_params'''
:* /etc/nginx/'''proxy_params'''


Configurer les redirections (voir fichier complet plus bas)
Configurer les redirections (voir fichier complet [[#proxy.conf|plus bas]]) :
  vi /etc/nginx/http.d/'''proxy.conf'''
  vi /etc/nginx/http.d/'''proxy.conf'''


Ligne 85 : Ligne 84 :
----
----


==Certificats Let'sEncrypt avec Certbot==
=Certificats Let'sEncrypt avec Certbot=
(cf. https://certbot.eff.org/instructions)
(cf. https://certbot.eff.org/instructions)


Ligne 124 : Ligne 123 :


{{replier | Si on choisit la configuration automatique (à éviter si possible)}}
{{replier | Si on choisit la configuration automatique (à éviter si possible)}}
===Ajouté automatiquement dans la conf de chaque redirection===
==Ajouté automatiquement dans la conf de chaque redirection==
   listen [::]:443 ssl ipv6only=on; # managed by Certbot
   listen [::]:443 ssl ipv6only=on; # managed by Certbot
   listen 443 ssl; # managed by Certbot
   listen 443 ssl; # managed by Certbot
Ligne 151 : Ligne 150 :
{{replier fin}}
{{replier fin}}


===Avec '# certbot certonly --nginx'===
==Avec '# certbot certonly --nginx'==


Inclure le.conf et realip.conf dans chaque
Inclure le.conf et realip.conf dans chaque
Ligne 172 : Ligne 171 :
  https://www.sslshopper.com/ssl-checker.html
  https://www.sslshopper.com/ssl-checker.html


===Commandes utiles===
==Commandes utiles==
Pour '''lister''' les certificats :
Pour '''lister''' les certificats :
   # certbot certificates
   # certbot certificates
Ligne 197 : Ligne 196 :




==Procédure pour les sous-domaines==
=Procédure pour les sous-domaines=


# Chez l'hébergeur, ajouter une zone dns de type CNAME pour le sous-domaine qui pointe vers le domaine principal.
# Chez l'hébergeur, ajouter une zone dns de type CNAME pour le sous-domaine qui pointe vers le domaine principal.
Ligne 203 : Ligne 202 :
# Ajouter le sous-domaine au certificat letsencrypt existant (--expand)
# Ajouter le sous-domaine au certificat letsencrypt existant (--expand)


==Fichiers de configuration==
=Fichiers de configuration=
===proxy.conf===
==proxy.conf==
/etc/nginx/http.d/proxy.conf (copie proxy.sav)
/etc/nginx/http.d/proxy.conf (copie proxy.sav)
   #_____________________________
   #_____________________________
Ligne 456 : Ligne 455 :
   }
   }


===le.conf===
==le.conf==
/etc/nginx/le.conf
/etc/nginx/le.conf
   ssl_certificate /etc/letsencrypt/live/lesitadom.fr/fullchain.pem;
   ssl_certificate /etc/letsencrypt/live/lesitadom.fr/fullchain.pem;
Ligne 463 : Ligne 462 :
   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;  
   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;  


===realip.conf===
==realip.conf==
/etc/nginx/realip.conf
/etc/nginx/realip.conf
   real_ip_header proxy_protocol;
   real_ip_header proxy_protocol;
   set_real_ip_from 127.0.0.1;
   set_real_ip_from 127.0.0.1;


===proxy_params===
==proxy_params==
/etc/nginx/proxy_params  
/etc/nginx/proxy_params  
   proxy_redirect off;
   proxy_redirect off;

Version du 14 mai 2025 à 13:18


Installation de nginx et de certbot dans un conteneur Alpine léger

Pour que la redirection fonctionne, il faut ajouter un CNAME aux sous-domaines et non les rediriger (réécriture de la requête sinon, et échec !)

Création du conteneur et installation d'Nginx

Création et mise à jour du conteneur :

lxc launch proxy locale:alpineLe
lxc exec proxy apk update
lxc exec proxy apk upgrade

Installation de nginx et démarrage auto du service :

lxc exec proxy apk add nginx
lxc exec proxy rc-update add nginx

Mettre le conteneur en frontal (à partir de l'hôte)

lxc config device add nom_du_conteneur myport80 proxy listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80 proxy_protocol=true
lxc config device add nom_du_conteneur myport443 proxy listen=tcp:0.0.0.0:443 connect=tcp:127.0.0.1:443 proxy_protocol=true

Annuler le fichier de conf par défaut :

lxc shell proxy
mv /etc/nginx/http.d/default.conf /etc/nginx/http.d/default.conf.sav

Créer les fichiers de configuration (voir contenu plus bas) :

  • /etc/nginx/le.conf
  • /etc/nginx/realip.conf
  • /etc/nginx/proxy_params

Configurer les redirections (voir fichier complet plus bas) :

vi /etc/nginx/http.d/proxy.conf
server {
      listen 80 proxy_protocol;
      listen [::]:80 proxy_protocol;

      server_name tables.lesitadom.fr;

      location / {
              include /etc/nginx/proxy_params;
              proxy_pass http://tables.lxd;
      }

      include /etc/nginx/realip.conf;
}

...etc

À l'usage, le module H5P de wordpress rame. Il semble qu'il faille charger le module de compression zip et configurer nginx :

apk add nginx-mod-http-zip

Dans le fichier /etc/nginx/nginx.conf, ajouter :

gzip on;
gzip_types text/plain text/css application/json application/javascript application/xml application/xhtml+xml image/svg+xml;
gzip_comp_level 5;
gzip_vary on;
gzip_min_length 1000;

Démarrer nginx

rc-service nginx start

Reconfigurer les autres conteneurs pour mettre la nouvelle adresse (fichier remoteip.conf) Sur chaque conteneur client : création du fichier /etc/apache2/conf.d/remoteip.conf avec :

/etc/apache2/conf.d/remoteip.conf

 RemoteIPHeader X-Real-IP
 RemoteIPTrustedProxy 10.178.91.45 fd42:b9ca:1a60:95fc:216:3eff:fe71:850f

Pour une configuration en mode conteneur :

/etc/apache2/conf.d/remoteip.conf

 RemoteIPHeader X-Real-IP
 RemoteIPTrustedProxy proxy.lxd 

Modification de /etc/apache2/httpd.conf décommenter :

 LoadModule remoteip_module modules/mod_remoteip.so

Relancer les services apache2

rc-service apache2 restart

Certificats Let'sEncrypt avec Certbot

(cf. https://certbot.eff.org/instructions)

Création d'un environnement virtuel pour certbot

 # apk add python3 augeas-libs
 # python3 -m venv /opt/certbot/
 # /opt/certbot/bin/pip install --upgrade pip

Installer certbot dans l'environnement créé :

 # /opt/certbot/bin/pip install certbot certbot-nginx

Préparer la commande certbot :

 # ln -s /opt/certbot/bin/certbot /usr/bin/certbot

(Raspberry est configuré pour écouter 80 et 443)

Configuration automatique d'nginx

 # certbot --nginx

Remarque : On peut également ne générer qu'un certificat et configurer nginx à la main en lançant :

 # certbot certonly --nginx

Cette procédure est préférable. Elle evite de voir Certbot mettre le bazar dans le fichier de configuration d'nginx.

Le processus demande

- une adresse mail
- l'acceptation des conditions générales d'utilisation
- l'autorisation d'envoyer des infos par E-mail
- indiquer quels serveurs doivent être en HTTPS (se base sur le fichier de configuration de nginx : proxy.conf ici)

Automatiser la mise à jour du certificat :

# echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" |  tee -a /etc/crontabs/root > /dev/null

ou éditer cron et ajouter :

 0    0    1    */2    *    certbot renew
 # crontab -e
 0    0    1    */2    *    certbot renew -q (pour quiet)

(vérifier si certbot ne fout pas le bordel dans le fichier de conf d'nginx : faire un fichier de sauvegarde fonctionnel avant...)

Si on choisit la configuration automatique (à éviter si possible)

Ajouté automatiquement dans la conf de chaque redirection

 listen [::]:443 ssl ipv6only=on; # managed by Certbot
 listen 443 ssl; # managed by Certbot
 ssl_certificate /etc/letsencrypt/live/lesitadom.fr/fullchain.pem; # managed by Certbot
 ssl_certificate_key /etc/letsencrypt/live/lesitadom.fr/privkey.pem; # managed by Certbot
 include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

Et pour chaque bloc serveur, la conf correspondante (redirection permanente)

 server {                                                                                    
   if ($host = lesitadom.fr) {                                                             
       return 301 https://$host$request_uri;                                               
   } # managed by Certbot                                                                  
                                                                                           
                                                                                           
       listen 80 proxy_protocol;                                                           
       listen [::]:80 proxy_protocol;                                                      
                                                                                           
       server_name lesitadom.fr;                                                           
   return 404; # managed by Certbot                                                        
}                     
 !!!! Certbot modifie le fichier de configuration d'nginx, mais ne met pas 'proxy_protocol' à la fin des directives d'écoute.
 ==>> ! il faut le rajouter à la main, sinon rien ne fonctionne et on est bon pour trois jours de recherches sur le net !!!!
 "Managed by Certbot" comme un con et codé avec les pieds !!!

Avec '# certbot certonly --nginx'

Inclure le.conf et realip.conf dans chaque

 server {
     listen [::]:443 ssl ipv6only=on proxy_protocol;
     listen 443 ssl proxy_protocol;
         
     include /etc/nginx/le.conf;
     server_name toto.lesitadom.fr;
         location / {
         ...
         }
     include /etc/nginx/realip.conf;
 }

Pour tester la validité des certificats :

https://www.ssllabs.com/ssltest/index.html
https://www.sslshopper.com/ssl-checker.html

Commandes utiles

Pour lister les certificats :

 # certbot certificates

pour lister les sous-domaines inclus :

 # certbot certificates --cert-name lesitadom.fr

Pour ajouter ou retirer un sous-domaine du certificat :

 # certbot certonly --cert-name <nom du certificat> -d <liste du domaine et des sous-domaines à inclure, séparés par ','>

Exemple :

 # certbot certonly --cert-name lesitadom.fr -d lesitadom.fr,bcd.lesitadom.fr,phpma.lesitadom.fr

(ne garde que le domaine principal et les sous-domaines 'bcd' et 'phpma')

Renouveler le certificat

Ajouter un sous-domaine Impossible simplement, il faut préciser tous les sous-domaines à chaque fois (en rajoutant --expand, on met le certificat à jour) Exemple :

 # certbot certonly --expand --cert-name lesitadom.fr -d lesitadom.fr,bcd.lesitadom.fr,phpma.lesitadom.fr,[sous-domaines à ajouter séparés par une ',']

-> Choix 1 : Nginx web server -> Vérifier la mise à jour puis "u" (update) Il peut être judicieux d'ajouter '--dry-run -v' pour simuler la commande en mode verbiage avant de lancer une commande effective...


Procédure pour les sous-domaines

  1. Chez l'hébergeur, ajouter une zone dns de type CNAME pour le sous-domaine qui pointe vers le domaine principal.
  2. Modifier le fichier de configuration de nginx pour prendre le sous-domaine en compte (server_name ...), redémarrer nginx.
  3. Ajouter le sous-domaine au certificat letsencrypt existant (--expand)

Fichiers de configuration

proxy.conf

/etc/nginx/http.d/proxy.conf (copie proxy.sav)

 #_____________________________
 #			       |
 # Redirection http vers https |
 #_____________________________|
 
 server {
 	listen 80 proxy_protocol;
 	listen [::]:80 proxy_protocol;
 
 	server_name .lesitadom.fr;
 		return 301 https://$host$request_uri;
 	 
   	server_name serveurdd.ddns.net;
       		return 301 https://$host$request_uri;
   	 
   	server_name les-bosquets.fr;
       		return 301 https://$host$request_uri;
 }
 
 #______________________________________________________
 #                                                      |
 # Réécriture pour phpmyadmin, wordpress, tables et pmb |
 #______________________________________________________|

 server {
 	listen [::]:443 ssl proxy_protocol;
 	listen 443 ssl proxy_protocol;
 
 	include /etc/nginx/le.conf;
 	include /etc/nginx/realip.conf;
 
        server_name lesitadom.fr;                                                  
               location /phpma {                                                  
                       return 302 https://phpma.lesitadom.fr;                     
               }                                                                  
               location /phpmyadmin {                               
                       return 302 https://phpma.lesitadom.fr;
               }                                                    
               location /wordpress {                          
                       return 302 https://wp.lesitadom.fr;   
               }                                                    
               location /wp {                                
                       return 302 https://wp.lesitadom.fr;   
               }                                              
               location /mediawiki {                         
                       return 302 https://wiki.lesitadom.fr;        
               }                                             
               location /wiki {                              
                       return 302 https://wiki.lesitadom.fr;  
               }                                             
               location /pmb {                                      
                       return 302 https://pmb.lesitadom.fr;  
               }                                             
               location /bcd {                                
                       return 302 https://pmb.lesitadom.fr/opac_css;
               }                                                    
               location /tables {                            
                       return 302 https://tables.lesitadom.fr;
               }                                              
               location / {                                         
                       proxy_pass http://192.168.1.21;              
                       include /etc/nginx/proxy_params;      
               }                                              
               location /*{                                   
                       return 404; 
 }
 #________________________________________________________      
 #                                                        |           
 # Conteneur phpMyAdmin : phpma.lesitadom.fr -> phpma.lxd |           
 #________________________________________________________|    
                                                                
 server {                                                       
       listen [::]:443 ssl proxy_protocol;                          
       listen 443 ssl proxy_protocol;                               
                                                             
       allow 192.168.1.0/24;                                  
       deny all;                                              
                                                                    
       include /etc/nginx/le.conf;                                  
       include /etc/nginx/realip.conf;                       
                                                              
       server_name phpma.lesitadom.fr;                        
                                                                    
       location / {                                                 
               rewrite ^/$ /phpmyadmin last;                 
       }                                                      
                                                              
       location /phpmyadmin {                                       
               proxy_pass http://phpma.lxd;                         
               include /etc/nginx/proxy_params;              
       }                                                      
 }              
 #______________________________________________________
 #                                                      |
 # Conteneur PMB : bcd.lesitadom.fr -> pmb.lxd opac_css |
 #______________________________________________________|
 
 server {
 	listen [::]:443 ssl proxy_protocol;
 	listen 443 ssl proxy_protocol;
 
 	include /etc/nginx/le.conf;                                                             
 	include /etc/nginx/realip.conf;
 
 	server_name bcd.lesitadom.fr;
 	location / {
 		return 302 https://pmb.lesitadom.fr/opac_css/;
      	}
 }
 
 #___________________________________________________
 #                                                   |
 # Conteneur PMB admin : pmb.lesitadom.fr -> pmb.lxd |
 #___________________________________________________|
 
 server {
 	listen [::]:443 ssl proxy_protocol;
 	listen 443 ssl proxy_protocol;
 
 	include /etc/nginx/le.conf;                                                             
 	include /etc/nginx/realip.conf;
 
 	server_name pmb.lesitadom.fr pmb.les-bosquets.fr;
 	location / {
 		proxy_pass http://pmb.lxd;
 		include /etc/nginx/proxy_params;
      	}
 }
 
 #______________________________________________________
 #                                                      |
 # Conteneur Tables : tables.lesitadom.fr -> tables.lxd |
 #______________________________________________________|
 
 server {
 	listen [::]:443 ssl proxy_protocol;
 	listen 443 ssl proxy_protocol;
 
 	include /etc/nginx/le.conf;                                                             
 	include /etc/nginx/realip.conf;
 
 	server_name tables.lesitadom.fr tables.les-bosquets.fr;
 	location / {
 		proxy_pass http://tables.lxd;
 		include /etc/nginx/proxy_params;
      	}
 }
 
 #_____________________________________________________
 #                                                     |
 # Conteneur Wikimedia : wiki.lesitadom.fr -> wiki.lxd |
 #_____________________________________________________|
 
 server {
 	listen [::]:443 ssl proxy_protocol;
 	listen 443 ssl proxy_protocol;
 
 	include /etc/nginx/le.conf;                                                             
 	include /etc/nginx/realip.conf;
 
 	server_name wiki.lesitadom.fr;          
 	location / {
 		proxy_pass http://wiki.lxd;
 		include /etc/nginx/proxy_params;
      	}
 }
 
 #__________________________________________________
 #                                                  |
 # Conteneur Wordrpress : wp.lesitadom.fr -> wp.lxd |
 #__________________________________________________|
 
 server {
                                         
 	listen [::]:443 ssl proxy_protocol;
 	listen 443 ssl proxy_protocol;
 
 	include /etc/nginx/le.conf;                                                             
 	include /etc/nginx/realip.conf;
 
 	server_name wp.lesitadom.fr;          
 	location / {
 		proxy_pass http://wp.lxd;
 		include /etc/nginx/proxy_params;
      	}
 }
 
 #___________________________________________________                 
 #                                                   |         
 # Redirection de serveurdd.ddns.net -> lesitadom.fr |                
 #___________________________________________________|          
                                                                    
 server {                                                             
                                                             
       listen [::]:443 ssl proxy_protocol;                    
       listen 443 ssl proxy_protocol;                         
                                                                    
       server_name serveurdd.ddns.net;                              
               if ($request_uri = /tables){                  
                       return 301 https://tables.lesitadom.fr;
               }                                              
                                                                    
               if ($request_uri = /pmb){                            
                       return 301 https://pmb.lesitadom.fr/opac_css/;
               }                                              
                                                              
               if ($request_uri = /pmb/admin.php){                  
                       return 301 https://pmb.lesitadom.fr;         
               }                                                     
                                                                     
               if ($request_uri = /pmb/opac_css/index.php){   
                       return 301 https://pmb.lesitadom.fr/opac_css/;
               }                                                    
                                                                     
               if ($request_uri = /mediawiki){                       
                       return 301 https://wiki.lesitadom.fr;  
               }                                                     
               return 301 https://lesitadom.fr;                      
 }
 
 #________________________________________________              
 #                                                |             
 # Redirection de les-bosquets.fr -> lesitadom.fr |                    
 #________________________________________________|                   
                                                                     
 server {                                                       
                                                              
       listen [::]:443 ssl proxy_protocol;                           
       listen 443 ssl proxy_protocol;                               
                                                                     
       server_name les-bosquets.fr;                                  
               if ($request_uri = /tables){                   
                       return 302 https://tables.les-bosquets.fr;    
               }                                                    
                                                                     
               if ($request_uri = /pmb){                             
                       return 302 https://pmb.les-bosquets.fr/opac_css/;
               }                                                        
                                                                     
               if ($request_uri = /adminbcd){                        
                       return 302 https://pmb.les-bosquets.fr;       
               }                                              
                                                                        
               if ($request_uri = /pmb/opac_css/index.php){          
                       return 302 https://pmb.les-bosquets.fr/opac_css/;
               }                                                        
                                                              
               return 302 https://pmb.les-bosquets.fr/opac_css;         
 }

le.conf

/etc/nginx/le.conf

 ssl_certificate /etc/letsencrypt/live/lesitadom.fr/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/lesitadom.fr/privkey.pem;
 include /etc/letsencrypt/options-ssl-nginx.conf;
 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

realip.conf

/etc/nginx/realip.conf

 real_ip_header proxy_protocol;
 set_real_ip_from 127.0.0.1;

proxy_params

/etc/nginx/proxy_params

 proxy_redirect 	off;
 proxy_set_header 	Host 			$host;
 proxy_set_header 	X-Real-IP		$remote_addr;
 proxy_set_header 	X-Forwarded-For 	$proxy_add_x_forwarded_for;
 proxy_set_header 	X-Forwarded-Proto 	$scheme;