« Proxy » : différence entre les versions
Aucun résumé des modifications |
|||
| Ligne 5 : | Ligne 5 : | ||
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 == | ||
# lxc launch proxy locale:alpineLe | |||
# apk update | # lxc exec proxy apk update | ||
# lxc exec proxy apk upgrade | |||
Installation de nginx | Installation de nginx | ||
# apk add nginx | # lxc exec proxy apk add nginx | ||
Démarrage automatique du service : | Démarrage automatique du service : | ||
# 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) | ||
| Ligne 20 : | Ligne 21 : | ||
Annuler le fichier de conf par défaut | 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 | # mv /etc/nginx/http.d/default.conf /etc/nginx/http.d/default.conf.sav | ||
Créer les fichiers de configuration (voir contenu plus bas) : <br> | |||
* /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 | # vi /etc/nginx/http.d/proxy.conf | ||
| Ligne 36 : | Ligne 43 : | ||
} | } | ||
include /etc/nginx/realip.conf; | |||
} | } | ||
...etc | ...etc | ||
Démarrer nginx | Démarrer nginx | ||
| Ligne 72 : | Ligne 70 : | ||
---- | ---- | ||
==Certbot== | ==Certificats Let'sEncrypt avec Certbot== | ||
(cf. https://certbot.eff.org/instructions) | (cf. https://certbot.eff.org/instructions) | ||
| Ligne 86 : | Ligne 84 : | ||
# ln -s /opt/certbot/bin/certbot /usr/bin/certbot | # ln -s /opt/certbot/bin/certbot /usr/bin/certbot | ||
(Raspberry configuré pour écouter 80 et 443) | (Raspberry est configuré pour écouter 80 et 443) | ||
Configuration automatique d'nginx | Configuration automatique d'nginx | ||
# certbot --nginx | # certbot --nginx | ||
Remarque : | Remarque : On peut également ne générer qu'un certificat et configurer nginx à la main en lançant : | ||
# certbot certonly --nginx | # 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 | Le processus demande | ||
- une adresse mail | - une adresse mail | ||
| Ligne 139 : | Ligne 138 : | ||
===Avec '# certbot certonly --nginx'=== | ===Avec '# certbot certonly --nginx'=== | ||
Inclure le.conf et realip.conf dans chaque | |||
et | |||
server { | server { | ||
Version du 26 avril 2025 à 13:07
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
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 redirectionlisten [::]: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
- 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;
}
#______________________________________________________
# |
# 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;