20 votes

Servez 404 à partir de HAProxy quand aucun acl ne correspond

Je suis en train de reconfigurer HAProxy en utilisant la version 1.5dev-17. Ce que j'aimerais faire, c'est renvoyer une erreur 404 lorsqu'il n'y a pas de backend à utiliser pour une requête particulière.

Notre configuration actuelle utilise le default_backend pour router vers nos serveurs d'applications django, mais lorsqu'il y a un grand nombre de requêtes de sondage (comme un pen-test) qui ne correspondent à aucun des autres backends configurés, nos serveurs django s'arrêtent lorsqu'ils essaient de servir ces requêtes invalides, et retournent finalement un 404.

J'aimerais servir le 404 à partir de HAProxy plutôt que de déléguer aux backends de django. J'y parviens actuellement avec un hack :

frontend www
    ...
    default_backend nomatch

backend nomatch
    errorfile 503 /var/www/http/404.http

Et dans le fichier 404.http, je définis le code d'état 404 dans les en-têtes. Cela fonctionne, mais c'est très mal perçu. Existe-t-il une meilleure façon d'y parvenir avec HAProxy ? Ou devrais-je utiliser un backend normal et le laisser gérer la réponse avec un 404 ?

16voto

salmane Points 1631

Si vous êtes d'accord avec l'un des codes de réponse suivants : 200, 400, 403, 405, 408, 429, 500, 502, 503 ou 504.

Vous pourriez alors procéder de la manière suivante :

frontend www
  ...
  default_backend no-match

backend no-match
  mode http
  http-request deny deny_status 400

2voto

user170542 Points 51

Après avoir voulu quelque chose de similaire, voici ce que j'ai trouvé. Je me sentais mal, mais cela fonctionne très bien en pratique et c'est beaucoup plus propre que d'essayer de blacklister des urls particulières. Assurez-vous de laisser un commentaire pour que personne ne tombe dessus en pensant que c'est incorrect.

0voto

cyqsimon Points 123

Ce n'est pas ce que l'OP a demandé, mais au cas où vous, le lecteur, seriez tombé sur cette directive alors que vous utilisiez le mode TCP (comme je l'ai fait), la directive correspondante que vous devez utiliser est la suivante tcp-request content . Vous auriez donc :

frontend my-tcp
  ...
  default_backend no-match

backend no-match
  tcp-request content reject

Bien entendu, en mode TCP, il n'y a pas de code de réponse HTTP. Vous pouvez également utiliser silent-drop au lieu de reject si vous le souhaitez.


Notez que vous NE PAS POUVOIR utilice tcp-request connection porque il ne peut pas être utilisé dans un backend section . Si vous essayez de le mettre dans un frontend à la place, haproxy vous met en garde :

une règle "tcp-request" placée après une règle "use_backend" sera toujours traitée avant la règle "use_backend".

... ce qui signifie qu'il remplace tous vos use_backend y default_backend Les directives de l'Union européenne.

Même si, techniquement, vous CAN utilice tcp-response content il n'y a pas de raison valable de le faire dans ce cas d'utilisation (par rapport à l'utilisation de tcp-request content .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X