Table des matières

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.

et dans mon cas j'ai choisi d'installer le reverse proxy dans la même machine qui fait serveur de nom de domaine faisant autorité

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.

reverse proxy sni

on installe le paquet `nginx` disponible dans Debian `apt install nginx` éventuellement il fudra installer le module nginx stream au cas ou ça ne serait pas déjà fait: `apt install libnginx-mod-stream`

un seul fichier à éditer: `/etc/nginx/nginx.conf`

ce qui nous intéresse dans ce fichier c'est les streams et les backends

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
 
events {
        worker_connections 768;
        # multi_accept on;
}
 
 
#Les streams:                                                                                                                                                                                                                                                                                                                                                                           
 
stream {
 
        map $ssl_preread_server_name $name {
                ikce.numericore.com                     stream_backend_ikce.numericore.com;
          visio.ikce.numericore.com                     stream_backend_ikce.numericore.com;
              err404.numericore.com                   stream_backend_err404.numericore.com;
        visio.err404.numericore.com                   stream_backend_err404.numericore.com;
 
                default stream_backend_err404.numericore.com;
        }
# Les backends:
        upstream stream_backend_ikce.numericore.com { server 192.168.1.171:443; }
 
        #default backend:
        upstream stream_backend_err404.numericore.com { server 192.168.1.160:443; }
 
        server {
                listen  443;
                listen [::]:443;
                proxy_pass $name;
                # Le proxy_protocole ici casse le map plus haut
                proxy_protocol on;
                # indispensable
                ssl_preread on;
        }
}

on rajoute les blocs stream et backend avant le bloc http dans `/etc/nginx/nginx.conf`

les machines (virtuelles, conteneurs ou autre)

d'autre part il faudra modifier les fichiers nginx des machines concernées (dans mon cas c'est les machines ikce.numericore.com et err404.numericore.com)

dans err404.numericore.com:

on rajoute simplement `proxy_protocol` dans le segment `server` et uniquement pour le port 443 on ne touche pas au port 80 on ne touche pas à l'ipv6 vu que dans mon cas les machines ont de l'ipv6 public.

voici un extrait du fichier `/etc/nginx/conf.d/err404.numericore.com.conf`:

server {
    listen 443 ssl http2 proxy_protocol;
    listen [::]:443 ssl http2;                            
    server_name err404.numericore.com;

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

il faut faire pareil pour les autres machines virtuelles (ikce.numericore.com dans mon cas)

pour obtenir les ip réelles des clients en ipv4 (et pas seulement l'ip du reverse proxy):
voici un extrait du fichier `/etc/nginx.conf` :

http {
    real_ip_header proxy_protocol;
    real_ip_recursive on;
    set_real_ip_from 192.168.1.20;

vous remplacerez 192.168.1.20 par l'ip de votre reverse proxy sni

la box

sur la box il faut rediriger les ports 80 et 443 vers l'ip de la machine qui héberge le reverse proxy sni