Contre toute attente, disais-je, mon installation d’un petit proxy (haproxy) sur un Raspberry Pi 3+ fonctionne comme prévu, du premier coup, et ce jusqu’à plus ample informé !
Jusque et y compris le renouvellement d’un certificat (en mode test) sur l’un des deux serveurs qui se trouve derrière, Incredible :-)
Ma config haproxy (histoire de pouvoir m’y référer plus tard si besoin) :
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode tcp
option tcplog
log global
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
#---------------------------------------------------------------------
# dedicated stats page
#---------------------------------------------------------------------
listen stats
mode http
bind :22222
stats enable
stats uri /haproxy?stats
stats realm Haproxy\ Statistics
stats auth zeboss:passwordisfutile
stats refresh 30s
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main_http_listen
bind 192.168.42.40:80
mode http
acl acl_nextcloud_boulot_http hdr(host) -i nextcloud.boulot.fr
acl acl_boulot_http hdr(host) -i boulot.fr
use_backend backend_snc_http if acl_nextcloud_boulot_http
use_backend backend_sweb_http if acl_boulot_http
frontend main_https_listen
bind 192.168.42.40:443
mode tcp
option tcplog
log global
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
acl acl_nextcloud_boulot_https req.ssl_sni -i nextcloud.boulot.fr
acl acl_boulot_https req.ssl_sni -i boulot.fr
use_backend backend_snc_https if acl_nextcloud_boulot_https
use_backend backend_sweb_https if acl_boulot_https
#---------------------------------------------------------------------
# Backends
#---------------------------------------------------------------------
# Nextcloud server
backend backend_snc_http
description snc (HTTP)
mode http
server server_snc_http 192.168.42.13:80 check
backend backend_snc_https
description snc (HTTPS)
mode tcp
option ssl-hello-chk
server server_snc_https 192.168.42.13:443 check
# Web server
backend backend_sweb_http
description sweb (HTTP)
mode http
server server_sweb_http 192.168.42.16:80 check
backend backend_sweb_https
description sweb (HTTPS)
mode tcp
option ssl-hello-chk
server server_sweb_https 192.168.42.16:443 check
Quelques explications :
Le proxy écoute sur les deux ports 80 et 443 (redirigés depuis la box).
Pour le port 80, c’est du mode HTTP basique, utile en particulier pour laisser passer les quelques requêtes de mise en place des certificats sur les serveurs qui sont derrière. La distinction est faite sur le nom de domaine requis pour diriger vers le premier (serveur Nextcloud) ou le second (serveur web).
Pour le port 443, c’est le mode TCP qui est requis, pour faire la distinction.
Je laisse le soin aux serveurs qui sont derrière de rediriger le trafic HTTP vers HTTPS autant que de besoin.
Pas besoin non plus de mettre en place du Load balancing — ce que haproxy est capable de faire aussi — avec mes deux seuls petits serveurs.
Un certbot renew --dry-run
fonctionne comme attendu, je verrai d’ici quelques jours si le renouvellement réel fonctionne comme prévu (demain a priori).
Jusqu’à présent les stats montent gentiment, on verra sur la durée comment le Raspberry tient la charge…
Et un premier certificat renouvelé à travers le proxy, tout fonctionne comme attendu \o/
1 De Jean-Christian Paul Denis -
Encore une fois j’apprend énorménent de tes courts articles !
J’étais retombé à un seul serveur car je faisais la dispersion vers mes serveurs web depuis un serveur apache, et je me suis cassé les dents sur les renouvellements de certificats ssl… haproxy à l’air si simple vue d’ici, je vais tenter :)
Merci
2 De Franck -
Serviteur JcDenis ;-)
3 De Franck -
Note qu’il y aussi moyen de faire gérer les certificats de tous les serveurs par le proxy, mais comme ma config est provisoire (les serveurs seront ensuite déménagés vers une infra avec chacun leur IP propre) et que le proxy ne devrait pas servir ensuite (quoique), j’ai préféré faire en sorte que le proxy soit le plus « transparent » possible.
4 De JcDenis -
Je viens de prendre 30 minutes pour monter un second serveur web, un serveur haproxy, un second nom de domaine et tester… Et ça à l’air de fonctionner !
Il reste encore IPv6 SSL & Co mais je suis déjà épaté. Merci M’sieur :)
5 De Franck -
You’re very welcome JcDenis ;-)
6 De Franck -
Pour info, la config du proxy n’empêche pas le renouvellement d’un certificat sur un des serveurs qui se trouve derrière.
7 De JcDenis -
Fait et testé cette après-midi, sous-domaine hébergé derrière certifié.
Par contre sur haproxy il faut que je regarde comment on écrit une règle générale pour rediriger tous les sous-domaines vers une machine, aujourd’hui je fais une règle par sous domaine, c’est moche.
P’etre même que je me fais c*** pour rien :p
8 De Franck -
Jette un œil du côté de
hdr_end(host)
, ça devrait faire le job ;-)Plus de doc par ici.
9 De Jean-Christian Paul Denis -
Haproxy
L'ami Franckpaul m'avait donné l'envie d'utiliser un proxy pour rendre accessible mes serveurs locaux depuis les internets. Comme d'habitude je suis partie de son exemple pour le transformer en usine à gaz. Je vais essayer de poser les bases de manière...