HAProxy ACL 多个 OR 条件

HAProxy ACL 多个 OR 条件

使用在 Ubuntu 12.04 上运行的 Haproxy 1.5.12

我需要将对我网站的访问限制为来自特定 IP 或请求中具有定义参数的请求。

例如,以下请求应该只对授权 IP 起作用:

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

并且该请求应该从任何 IP(包括允许的 IP)来满足:

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

我的 ACL 是:

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

如果单独使用,它们会发挥很好的作用:

http-request deny if is_test ! is_allowed

或者

http-request deny if is_test ! is_devtool

但是,如果我将它们与 OR 结合起来,我将无法从允许的 IP 访问 URL(反转测试没有帮助):

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

知道如何做到这一点吗?

谢谢

答案1

您似乎想要实施的测试是这样的:

A && !(B || C)

...但这在逻辑上与你所写的并不等同,本质上是这样的......

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

不使用括号作为优先顺序的逻辑等价物A && !(B || C)实际上是这样的:

A && !B && !C

因此,您要寻找的应该是这样的:

http-request deny if is_test !is_allowed !is_devtool

或者,重申一下:如果发生以下情况,则拒绝请求——

  • 它匹配is_test
  • 它不匹配is_allowed
  • 不匹配is_devtool

只要这些条件中的任何一个为假(不是测试、是允许的、是 devtool),您的规则就不匹配,并且不会拒绝请求。

相关内容