Proxy

De Documentation
Aller à la navigationAller à la recherche

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

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

Installation de nginx

lxc exec proxy apk add nginx

Démarrage automatique du service :

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 :

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

Pour une configuration en mode conteneur :

 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;