HAProxy ACL várias condições OR

1

Usando o Haproxy 1.5.12 rodando no Ubuntu 12.04

Eu preciso restringir o acesso ao meu site a solicitações provenientes de determinados IPs ou que tenham um parâmetro definido na solicitação.

Assim, por exemplo, a seguinte solicitação deve funcionar somente a partir de IPs autorizados:

http://www-test.example.com/page.php

E esta solicitação deve ser atendida a partir de qualquer IP (incluindo os permitidos):

http://www-test.example.com/page.php?devtool=1

Minhas ACLs são:

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

e eles funcionam bem se usados exclusivamente:

http-request deny if is_test ! is_allowed

ou

http-request deny if is_test ! is_devtool

Mas se eu combinar com um OR, não consigo acessar o URL de um IP permitido (inverter os testes não ajuda):

http-request deny if is_test ! is_allowed || is_test ! is_devtool

Alguma ideia de como fazer isso?

Obrigado

    
por jeremyjr 06.04.2016 / 16:47

1 resposta

9

O teste que você parece querer impor é este:

A && !(B || C)

... mas isso não é logicamente equivalente ao que você escreveu, que é essencialmente isso ...

(A && !B) || (A && !C)

O equivalente lógico de A && !(B || C) sem usar parênteses para precedência é, na verdade, este:

A && !B && !C

Então, o que você está procurando deve ser isso:

http-request deny if is_test !is_allowed !is_devtool

Ou, para reformular: negue a solicitação se -

  • corresponde a is_test , e
  • não corresponde a is_allowed , e
  • não corresponde a is_devtool

Desde que qualquer uma dessas condições seja falsa (não é test, é permitido, é devtool) sua regra não corresponde e não nega a solicitação.

    
por 06.04.2016 / 21:39