« Proxy » : différence entre les versions
| Ligne 55 : | Ligne 55 : | ||
Sur chaque conteneur client : | Sur chaque conteneur client : | ||
création du fichier /etc/apache2/conf.d/remoteip.conf avec : | création du fichier /etc/apache2/conf.d/remoteip.conf avec : | ||
{{replier | Syntaxe générique}} | |||
RemoteIPHeader X-Real-IP | RemoteIPHeader X-Real-IP | ||
RemoteIPTrustedProxy 10.178.91.45 fd42:b9ca:1a60:95fc:216:3eff:fe71:850f | RemoteIPTrustedProxy 10.178.91.45 fd42:b9ca:1a60:95fc:216:3eff:fe71:850f | ||
{{replier fin}} | |||
RemoteIPHeader X-Real-IP | RemoteIPHeader X-Real-IP | ||
RemoteIPTrustedProxy proxy.lxd | RemoteIPTrustedProxy proxy.lxd | ||
Version du 23 avril 2025 à 13:17
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 :
| Syntaxe générique |
|---|
RemoteIPHeader X-Real-IP RemoteIPTrustedProxy 10.178.91.45 fd42:b9ca:1a60:95fc:216:3eff:fe71:850f |
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 recherches 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
- Chez l'hébergeur, ajouter une zone dns de type CNAME pour le sous-domaine qui pointe vers le domaine principal.
- Modifier le fichier de configuration de nginx pour prendre le sous-domaine en compte (server_name ...), redémarrer nginx.
- 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;
}
#______________________________________________________
# |
# Conteneur Racine : lesitadom.fr -> machine virtuelle |
#______________________________________________________|
#______________________________________________________
# |
# 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;