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 serveur 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 haproxy disponible dans Debian apt install haproxy
un seul fichier à éditer:

/etc/haproxy/haproxy.cfg:

global
        log /dev/log    local0 info
        log /dev/log    local1 info
        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
        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 http_in
        mode http
        option httplog
        bind [::]:80 v6only
        bind *:80
        option forwardfor
        http-request add-header X-Forwarded-For %[src]
        http-request set-header X-Forwarded-Proto https if { ssl_fc }
 
        acl host_err404 hdr(host) -i err404.numericore.com
        acl host_err404 hdr(host) -i visio.err404.numericore.com
 
        acl host_planet hdr(host) -i ikce.numericore.com
 
 
        use_backend http_err404 if host_err404
        use_backend http_planet if host_ikce
 
 
backend http_err404
        mode http
        option forwardfor
        balance roundrobin
        server server1 ct-err404:80
 
backend http_ikce
        mode http
        option forwardfor
        balance roundrobin
        server server1 ct-ikce:80
 
 
#######################
frontend tcp_https
        mode tcp
        option tcplog
        bind [::]:443 v6only
        bind *:443
        acl tls req.ssl_hello_type 1
        tcp-request inspect-delay 5s
        tcp-request content accept if tls
 
 
        acl host_err404 req.ssl_sni -i err404.numericore.com
        acl host_err404 req.ssl_sni -i visio.err404.numericore.com
 
        acl host_planet req.ssl_sni -i ikce.numericore.com
 
 
        use_backend tcp_err404 if host_err404
        use_backend tcp_planet if host_ikce
 
 
backend tcp_err404
  mode tcp
  option ssl-hello-chk
  balance roundrobin
  server err404 ct-err404:443 send-proxy check
 
backend tcp_ikce
  mode tcp
  option ssl-hello-chk
  balance roundrobin
  server planet ct-ikce:443 send-proxy check
 
############### 
frontend port1935
  mode tcp
  option tcplog
  bind [::]:1935 v6only
  bind *:1935
  acl err404_1935 req.ssl_sni -i err404.numericore.com
 
 
  use_backend err404_1935 if err404_1935
 
 
backend err404_1935
  mode tcp
  balance roundrobin
  server err404 ct-err404:1935 send-proxy

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 (et les autres ports que vous aller proxyfier) vers l'ip de la machine qui héberge le reverse proxy sni