Utilisation de Haproxy 1.5.12 exécuté sur Ubuntu 12.04
Je dois restreindre l'accès à mon site Web aux demandes provenant de certaines adresses IP ou ayant un paramètre défini dans la demande.
Ainsi, par exemple, la demande suivante ne devrait fonctionner qu'à partir d'adresses IP autorisées:
http://www-test.example.com/page.php
Et cette demande doit être satisfaite à partir de n'importe quelle adresse IP (y compris celles autorisées):
http://www-test.example.com/page.php?devtool=1
Mes ACL sont:
acl is_test hdr(Host) -m sub test
acl is_allowed src -f /etc/haproxy/allowed_ips
acl is_devtool urlp(devtool) 1
acl is_devtool hdr_sub(Referer) devtool=1
et ils fonctionnent bien s'ils sont utilisés exclusivement:
http-request deny if is_test ! is_allowed
ou
http-request deny if is_test ! is_devtool
Mais si je les combine avec un OR je ne peux pas accéder à l'URL à partir d'une IP autorisée (inverser les tests n'aide pas)):
http-request deny if is_test ! is_allowed || is_test ! is_devtool
Une idée de comment faire ça?
Merci
Le test que vous semblez vouloir imposer est le suivant:
A && !(B || C)
... mais ce n'est pas logiquement équivalent à ce que vous avez écrit, qui est essentiellement ceci ...
(A && !B) || (A && !C)
L'équivalent logique de A && !(B || C)
sans utiliser de parenthèses pour la priorité est en fait ceci:
A && !B && !C
Donc, ce que vous cherchez doit être le suivant:
http-request deny if is_test !is_allowed !is_devtool
Ou, pour le reformuler: refuser la demande si -
is_test
, etis_allowed
, etis_devtool
Tant que l'une de ces conditions est fausse (n'est pas test, est autorisée, est devtool), votre règle ne correspond pas et ne refuse pas la demande.