haproxy 在 ACL 表达式中缺少获取方法

haproxy missing fetch method in ACL expression

我在 ha 代理中使用这些条件

use_backend test if { path_beg -i /test/ } { { ssl_fc_has_crt } || { src 10.0.0.25 }  || { src 10.1.0.152 }  || { src 10.0.2.41 }  || { src 10.0.0.158}  || { src 64.32.12.252 }  || { src 35.43.19.101 } || { src 80.240.254.1 } || { src 82.10.80.7 } }

但是我看到了这个错误:

error detected while parsing switching rule : missing fetch method in ACL expression '{'.

文档显示 { } 好像它可以对 ACL 进行分组,但没有详细说明:

A condition is formed as a disjunctive form:

   [!]acl1 [!]acl2 ... [!]acln  { or [!]acl1 [!]acl2 ... [!]acln } ...

所以也许它根本就不是分组。我能看到的带有 {} 的所有示例都是针对匿名 ACL 的。 您想在一种情况下将 AND 与 OR 结合使用,而 haproxy 不是很有帮助,但这里应该可以工作:

acl allowed_to_test_site src 10.0.0.25 10.0.0.24 10.1.0.152 10.0.2.41 10.0.0.158 64.32.12.252 35.43.19.101 80.240.254.1 82.10.80.7
acl allowed_to_test_site ssl_fc_has_crt
use_backend backend-sonar if { path_beg -i /test/ } allowed_to_test_site                                                                                                           

这里要说明几点:

  1. 源IP1 || src IP2 可以声明为 acl ip src IP1 IP2 等等。这样的列表作为多个 OR
  2. 多次声明 ACL 再次作为多个 OR
    Docs 说:
acl <aclname> <criterion> [flags] [operator] <value> ...
Declare or complete an access list.

这可以使用更明确的解释 3. AND是隐含的

这样我们就得到了(path_beg -i /test/) AND ( ssl_fc_has_crt OR src matches one of the IPs)
的逻辑 也许有一天 haproxy 会有更好的语法。