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

nginx

 # apk update && apk upgrade

Installation de nginx

 # apk add nginx

Démarrage automatique du service :

 # 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

 # mv /etc/nginx/http.d/default.conf /etc/nginx/http.d/default.conf.sav

Configuration des 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;
       }
 
       real_ip_header proxy_protocol;
       set_real_ip_from 127.0.0.1;
 }

...etc

Créer le fichier dans /etc/nginx/proxy_params

 # vi /etc/nginx/proxy_params
 proxy_set_header Host $http_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;

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 :

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

ou

 RemoteIPHeader X-Real-IP
 RemoteIPTrustedProxy proxy.lxd 

(nom du conteneur nginx, plus correct dans la configuration conteneurs)

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

 LoadModule remoteip_module modules/mod_remoteip.so

Relancer les services apache2

 # rc-service apache2 restart

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

Le processus demande

- une adresse mail
- l'acceptation des conditions générales d'utilisation
- l'autorisation d'envoiyer 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...)

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 recherche sur le net !!!!
 "Managed by Certbot" comme un con et codé avec les pieds !!!

Création d'un fichier /etc/nginx/le.conf avec :

   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; 

et d'un fichier /etc/nginx/realip.conf avec :

 real_ip_header proxy_protocol;                                                          
 set_real_ip_from 127.0.0.1;

et les inclure 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;
 }

Tester la validité des certificats :

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


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 pas possible, 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

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

  1. _____________________________
  2. |
  3. Redirection http vers https |
  4. _____________________________|

server { listen 80 proxy_protocol; listen [::]:80 proxy_protocol;

server_name _; if ($host = lesitadom.fr) { return 301 https://$host$request_uri; }

   	if ($host = bcd.lesitadom.fr) {
       	return 301 https://$host$request_uri;
   	}
   	if ($host = pmb.lesitadom.fr) {
       	return 301 https://$host$request_uri;
   	}
   	if ($host = tables.lesitadom.fr) {
       	return 301 https://$host$request_uri;
   	}
   	if ($host = wiki.lesitadom.fr) {
       	return 301 https://$host$request_uri;
   	}
   	if ($host = wp.lesitadom.fr) {
       	return 301 https://$host$request_uri;
   	}

if ($request_uri = tables){ return 301 https://tables.lesitadom.fr; } if ($host = serveurdd.ddns.net) { return 301 https://lesitadom.fr$request_uri; } return 404; }

  1. ____________________________________________________
  2. |
  3. Conteneur Racine : lesitadom.fr -> serveur virtuel |
  4. ____________________________________________________|

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 / {

              	proxy_pass http://192.168.1.21;
              	include /etc/nginx/proxy_params;
      	}

}

  1. ______________________________________________________
  2. |
  3. Conteneur PMB : bcd.lesitadom.fr -> pmb.lxd opac_css |
  4. ______________________________________________________|

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 / { root /var/www/localhost/htdocs/opac_css; proxy_pass http://pmb.lxd; include /etc/nginx/proxy_params;

      	}

}

  1. ___________________________________________________
  2. |
  3. Conteneur PMB admin : pmb.lesitadom.fr -> pmb.lxd |
  4. ___________________________________________________|

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; location / { proxy_pass http://pmb.lxd; include /etc/nginx/proxy_params;

      	}

}

  1. ______________________________________________________
  2. |
  3. Conteneur Tables : tables.lesitadom.fr -> tables.lxd |
  4. ______________________________________________________|

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; location / { proxy_pass http://tables.lxd; include /etc/nginx/proxy_params;

      	}

}

  1. _____________________________________________________
  2. |
  3. Conteneur Wikimedia : wiki.lesitadom.fr -> wiki.lxd |
  4. _____________________________________________________|

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;

      	}

}

  1. __________________________________________________
  2. |
  3. Conteneur Wordrpress : wp.lesitadom.fr -> wp.lxd |
  4. __________________________________________________|

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;

      	}

}

**************************************** /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;

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

**************************************** /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;

****************************************