使用在 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),您的规则就不匹配,并且不会拒绝请求。