This commit is contained in:
jlecour 2024-02-15 10:27:01 +01:00
parent 413deb1992
commit 8430cc362f

View file

@ -163,13 +163,13 @@ frontend fe_https
Le fichier `example_com.pem` doit contenir le certificat ainsi que la clé privée et éventuellement des paramètres Diffie-Hellman (tout au format PEM).
Il est possible d'indiquer plusieurs fois `crt /chemin/vers/fichier.pem` pour avoir plusieurs certificats possibles. HAProxy utilisera alors le mécanisme de SNI. Si on indique plutôt un dossier (par exemple `/etc/ssl/haproxy/`) tous les fichiers trouvés seront chargé par ordre alphabétique.
Il est possible d'indiquer plusieurs fois `crt /chemin/vers/fichier.pem` pour avoir plusieurs certificats possibles. HAProxy utilisera alors le mécanisme de SNI. Si on indique plutôt un dossier (par exemple `/etc/ssl/haproxy/`) tous les fichiers trouvés seront chargés par ordre alphabétique.
Pour chaque fichier PEM trouvé, HAProxy cherchera un fichier `.ocsp` du même nom. Il peut être vide ou contenir une réponse OCSP valide (au format DER). Cela active le mécanisme de « OCSP stapling »
Tous les détails de configuration pour l'attribut `crt` sont consultables sur <http://cbonte.github.io/haproxy-dconv/1.8/configuration.html#5.1-crt>
Dans le cas où HAProxy gère plusieurs domaines dont certains seulement ont un certificat SSL, HAProxy enverra par défaut le certificat défini par la directive `crt`. Si il pointe sur un répertoire, un des certificats du répertoire (ça ne semble pas être le premier/dernier par ordre alphabétique) sera envoyé. Pour éviter ce comportement, on peut rajouter la directive `strict-sni`. Dans ce cas, si HAProxy ne trouve pas le certificat qui correspond au domaine demandé par le client, il retournera l'erreur SSL *SSL_ERROR_BAD_CERT_DOMAIN*.
Dans le cas où HAProxy gère plusieurs domaines dont certains seulement ont un certificat SSL, HAProxy enverra par défaut le certificat défini par la directive `crt`. Sil pointe sur un répertoire, un des certificats du répertoire (ça ne semble pas être le premier/dernier par ordre alphabétique) sera envoyé. Pour éviter ce comportement, on peut rajouter la directive `strict-sni`. Dans ce cas, si HAProxy ne trouve pas le certificat qui correspond au domaine demandé par le client, il retournera l'erreur SSL *SSL_ERROR_BAD_CERT_DOMAIN*.
Il est aussi possible de désigner un fichier contenant la liste de tous les PEM :
@ -278,7 +278,7 @@ La partie `http-request set-path` permet de modifier le path au moment du traite
Le serveur amont n'ayant aucune information de l'URL intiale, s'il doit envoyer un en-tête de redirection calculé de manière relative à la requête, celui-ci ne sera pas correct. Il faut le modifier à la volée avant de renvoyer la réponse.
La partie `http-response replace-header` va donc remplacer la valeur de l'en-tête `Location`.
L'expression régulière ne sera satisfaite que si le domaine d'origine est utilisé (ou totalement absent), conservant ainsi la possibilité d'avoir des redirection intactes vers d'autres domaines.
L'expression régulière ne sera satisfaite que si le domaine d'origine est utilisé (ou totalement absent), conservant ainsi la possibilité d'avoir des redirections intactes vers d'autres domaines.
Détail des captures :
1. http ou https, suivi du _host_ et éventuellement un port (facultatif)
@ -293,7 +293,7 @@ L'utilisation d'un ACL (très rapide) permet de ne faire l'opération (plus lent
C'est utile par exemple pour accéder aux graphes Munin du load-balancer.
Il faut faire écouter le serveur web local sur le port 81 (avec les bonnes restriction d'accès) en activant le Proxy Protocol ([exemple pour Nginx](/HowtoNginx#nginx-en-aval)), et y rediriger les requêtes :
Il faut faire écouter le serveur web local sur le port 81 (avec les bonnes restrictions d'accès) en activant le Proxy Protocol ([exemple pour Nginx](/HowtoNginx#nginx-en-aval)), et y rediriger les requêtes :
~~~
frontend myfront
@ -383,7 +383,7 @@ Pour les détails, dans le backend « per_ip_rates » on définit une directive
Dans le second backend « per_ip_and_url_rates », on définit une directive `stick-table` de type binary (longueur de 8 bits), qui peut contenir jusqu'à 1 million d'entrées, qui expire au bout d'une heure et qui comptabilise le nombre de requêtes IP/URL sur les 10 dernières secondes.
On peut ensuite utiliser ces deux compteurs dans les frontends/backend de notre choix en y faisant référence dans une directive `http-request` via la paramètre `table`.
On peut ensuite utiliser ces deux compteurs dans les frontends/backend de notre choix en y faisant référence dans une directive `http-request` via le paramètre `table`.
Dans l'exemple suivant, on crée deux blocs de 2 directives `http-request`.
@ -398,13 +398,13 @@ frontend default
[…]
~~~
Le premier bloc contient deux lignes dont la première définit une règle « track-sc0 » qui se basant sur la table du backend « per_ip_rates » en omettant toutes les requêtes vers certains type de fichiers (CSS, JS…). La seconde ligne indique ensuite de renvoyer un status 429 si le nombre des requêtes HTTP/sec pour une même IP selon les données provenant de « track-sc0 » est supérieur à 100 (donc 100 requêtes depuis une même IP sur les 10 dernières seconndes).
Le premier bloc contient deux lignes dont la première définit une règle « track-sc0 » qui se basant sur la table du backend « per_ip_rates » en omettant toutes les requêtes vers certains types de fichiers (CSS, JS…). La seconde ligne indique ensuite de renvoyer un status 429 si le nombre des requêtes HTTP/sec pour une même IP selon les données provenant de « track-sc0 » est supérieur à 100 (donc 100 requêtes depuis une même IP sur les 10 dernières seconndes).
Le second bloc contient quant à lui deux lignes dont la première définit une règle « track-sc1 » qui se base sur la table du backend « per_ip_and_url_rates » en omettant toute les requêtes vers certains types de fichiers (CSS, JS…). La seconde ligne indique ensuite de renvoyer un status 429 si le nombre des requêtes HTTP/sec vers une URL unique depuis une même IP selon les données provenant de « track-sc1 » est supérieur à 10 (donc 10 requêtes depuis une même IP et vers la même URL sur les 10 dernières secondes).
Le second bloc contient quant à lui deux lignes dont la première définit une règle « track-sc1 » qui se base sur la table du backend « per_ip_and_url_rates » en omettant toutes les requêtes vers certains types de fichiers (CSS, JS…). La seconde ligne indique ensuite de renvoyer un status 429 si le nombre des requêtes HTTP/sec vers une URL unique depuis une même IP selon les données provenant de « track-sc1 » est supérieur à 10 (donc 10 requêtes depuis une même IP et vers la même URL sur les 10 dernières secondes).
### Protocol PROXY
L'utilisation du protocol PROXY permet de faciliter la communication et la traçabilité lorsque des proxy sont impliqués.
L'utilisation du protocol PROXY permet de faciliter la communication et la traçabilité lorsque des proxys sont impliqués.
Voir la [présentation générale du protocol](https://www.haproxy.com/blog/use-the-proxy-protocol-to-preserve-a-clients-ip-address/).
@ -586,7 +586,7 @@ Les valeurs renvoyées peuvent être les suivantes :
- Un % entier (ex 75%) pour l'ajustement du poids
- La chaîne `maxconn:` suivie d'un entier pour spécifier le nombre max de connexions
- Les mot `ready`, `drain`, `maint`, `down` et `up` pour modifier les états
- Les mots `ready`, `drain`, `maint`, `down` et `up` pour modifier les états
Il faut bien avoir en tête qu'il y a 2 types d'états :
* "administrative" : ready (prêt), drain (ne plus envoyer de trafic, sans couper l'existant), maint (maintenance, plus de trafic du tout)
@ -598,7 +598,7 @@ On notera que seuls les algorithmes d'équilibrage dynamiques (roundrobin et lea
### Agent-check sur la surveillance de l'espace disque
On peux faire un agent check avec xinetd comme vu plus haut et le script `diskchk.sh` qui permet de surveillé l'espace disque, exemple avec la partition `/var` :
On peut faire un agent check avec xinetd comme vu plus haut et le script `diskchk.sh` qui permet de surveiller l'espace disque, exemple avec la partition `/var` :
~~~bash
#!/bin/bash
@ -617,7 +617,7 @@ fi
exit 0
~~~
Pour utilisé ce script il faut au préalable que le **check nrpe** `check_disk` soit installé sur la machine que l'on veux surveillé.
Pour utiliser ce script il faut au préalable que le **check nrpe** `check_disk` soit installé sur la machine que l'on veut surveiller.
La variable `disk_space_max` indique en pourcentage l'espace disque restant à partir duquel le script retournera `drain`.
@ -637,7 +637,7 @@ backend mail
server mail01 192.168.0.2:25 inter 10000 rise 2 fall 5 check weight 50 agent-port 9999
~~~
Dans ce cas le serveur mis en `drain` par le script, le serveur concerné n'envera plus de trafic, mais les mails en cours d'envoir ne sont pas coupés.
Dans ce cas le serveur mis en `drain` par le script, le serveur concerné n'enverra plus de trafic, mais les mails en cours d'envoi ne sont pas coupés.
### HTTP basic authentication
@ -662,7 +662,7 @@ http-request auth realm Texte if !AuthOkayPourMonSite
Remplacez les variables `$nom` par vos valeurs (en enlevant le `$`).
Les conditions après le `if` sont pas défaut (implicitement) combinées avec des ET logiques. Si nécessaire, on peut utiliser explicitement le mot-clé `or`.
Les conditions après le `if` sont par défaut (implicitement) combinées avec des ET logiques. Si nécessaire, on peut utiliser explicitement le mot-clé `or`.
#### Redirection HTTPS
@ -720,7 +720,7 @@ resolvers mydns
parse-resolv-conf
~~~
Lorsque le nom de domaine indiqué comporte plusieurs adresse IP et qu'on veut avoir autant de serveurs disponibles que d'IP disponibles, on peut utiliser `server-template`. Exemple avec un domaine qui aurait 4 IP résolues :
Lorsque le nom de domaine indiqué comporte plusieurs adresses IP et qu'on veut avoir autant de serveurs disponibles que d'IP disponibles, on peut utiliser `server-template`. Exemple avec un domaine qui aurait 4 IP résolues :
~~~
backend myback