On n'a besoin d'un reverse proxy que dans le cas ou on n'a pas d'ipv6.
et comme tout le monde n'a pas encore ipv6 (il y a même des gens qui vont désactiver l'ipv6 sur leur machine…) on va mettre en place un reverse proxy:
il suffit d'installer par exemple un server Haproxy, que ce soit dans l'hyperviseur ou une machine virtuelle.
il est préférable d'installer le reverse proxy dans une machine virtuelle ou un conteneur plutôt que dans l'hyperviseur de façon à faciliter les sauvegardes.
dans mon cas les machines virtuelles et les conteneurs ont de l'ipv6, donc les noms de domaines vont directement sur ces machines, pas besoin de reverse proxy sni pour l'ipv6.
le problème c'est que je n'ai qu'une seule ipv4 publique (la box de mon fournisseur d'accès à Internet) et que je suis obligé de partager cette unique ipv4 publique pour toutes mes machines virtuelles ou conteneurs.
c'est pour permettre cette cohabitation que j'installe un reverse proxy sni.
avec l'ipv6, c'est simple: toutes les machines ont un accès direct à Internet et sont directement joignable depuis Internet, elles sont indépendantes et n'ont pas de problèmes de ports à partager donc pas de problèmes de traduction d'adresses.
on installe le paquet haproxy
disponible dans Debian
apt install haproxy
un seul fichier à éditer: /etc/haproxy/haproxy.cfg
global maxconn 60000 log 127.0.0.1 local0 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets defaults log global mode http option logasap option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http frontend httpweb mode http option httplog bind [::]:80 v6only bind *:80 http-request add-header X-Forwarded-For %[src] use_backend err404_servers if { req.hdr(host) -i err404.numericore.com } use_backend planet_servers if { req.hdr(host) -i planet.numericore.com } default_backend err404_servers frontend httpsweb mode tcp option tcplog bind [::]:443 v6only bind *:443 use_backend err404_s_servers if { req.hdr(host) -i err404.numericore.com } use_backend planet_s_servers if { req.hdr(host) -i planet.numericore.com } default_backend err404_s_servers backend err404_servers mode http balance roundrobin server err40401 ct-err404:80 check send-proxy backend err404_s_servers mode tcp balance roundrobin option ssl-hello-chk server err40401 ct-err404:443 check send-proxy backend ikce_servers mode http balance roundrobin server planet01 ct-ikce:80 check send-proxy backend ikce_s_servers mode tcp balance roundrobin option ssl-hello-chk server planet01 ct-ikce:443 check send-proxy
à la place de ct-err404 et ct-ikce vous utiliserez les ip de vos machines ou leur nom si vous utilisez votre serveur dns.
je sépare les bind sur deux lignes: ipv6 et ipv4 pour avoir des logs qui s'affichent mieux.
check
est utilisé pour vérifier régulièrement la disponibilité du serveur (je n'en ai qu'un mais je pourrais répartir la charge facilement en rajoutant des lignes server)
send-proxy
est utilisé pour envoyer l'ip réelle et pas celle du reverse proxy
dans ces machines, il suffit de modifier /etc/nginx/nginx.conf:
http { real_ip_header proxy_protocol; real_ip_recursive on; set_real_ip_from 192.168.1.17;
vous indiquerez l'ip de votre serveur proxy à la place de 192.168.1.17 et vous relancerez nginx avec systemctl reload nginx
lorsque on modifie le fichier de conf nginx, Yunohost ne va pas être content et refusera de les mettre à jour car ils auront étés modifiés, celà vaut pour les certificats, il suffit de forcer pour passer outre.
sur la box il faut rediriger les ports 80 et 443 vers l'ip de la machine qui héberge le reverse proxy sni