我具备基本的 haproxy 知识,并且知道如何根据 SNI 服务器名称处理 tcp 后端的选择。
相关行是
acl is_myhost req.ssl_sni -i my.host.com
acl is_otherhost req.ssl_sni -i other.host.com
use_backend mybackend if is_myhost
use_backend otherbackend if is_otherhost
现在我想将它们更改为允许我根据源 ip 选择后端的东西,但我不知道下面伪配置的确切语法,也不知道这是否可能
acl is_myhost_for_specif req.ssl_sni -i my.host.com <and source ip = 1.2.3.4>
acl is_myhost_for_others req.ssl_sni -i my.host.com <and source ip != 1.2.3.4>
acl is_otherhost req.ssl_sni -i other.host.com
use_backend mybackend1 if is_myhost_for_specific
use_backend mybackend2 if is_myhost_for_others
use_backend otherbackend if is_otherhost
答案1
您的 ACL 伪代码不正确,因为 ACL 声明没有 AND/OR 逻辑的语法。将其移至使用 ACL 的位置,如下例所示。
对于源 IP,有src
(https://cbonte.github.io/haproxy-dconv/2.2/configuration.html#7.3.3-src),例如:
请注意,在 if 语句中匹配两个条件的语法不是
use_backend mybackend if condition1 and condition2
只是
use_backend mybackend if condition1 condition2
acl test_network src 192.168.10.0/24
acl test_network src 192.168.20.0/24
acl is_myhost_for_specif req.ssl_sni -i my.host.com
# both acls must be true (is_myhost **and** test_network)
use_backend mybackend1 if is_myhost test_network
use_backend mybackend2 if is_myhost
顺序use_backend
很重要,因此如果 SNI 匹配,则来自的 IPtest_network
转到mybackend1
,其他 IP 转到。此处声明 ACL 两次意味着“src_ip 匹配 192.168.10.0/24 或 192.168.20.0/24”mybackend2
test_network