如何在HAProxy中用ACL将客户端IP与动态规则匹配?
HAProxy动态匹配SenderCompID对应IP范围的解决方案
问题场景
需要基于SenderCompID和客户端IP路由FIX会话,已通过映射表获取到对应SenderCompID的允许IP/CIDR,但使用动态变量配置ACL时报错,仅静态硬编码IP的方式可正常工作。
尝试的配置
tcp-request content set-var(txn.accepted_ips) var(txn.sendercompid),map_str(/sender_ips.map) # 此写法失败 acl ip_match src -n -m ip %[var(txn.accepted_ips)] # 此写法也失败 acl ip_match src -n -m ip var(txn.accepted_ips) # 硬编码时可正常工作的示例 acl ip_match src 192.168.0.2 10.0.0.0/8 tcp-request content reject unless ip_match
报错信息
error detected while parsing ACL 'ip_match' : '%[var(txn.accepted_ips)]' is not a valid IPv4 or IPv6 address.
解决方案
HAProxy的src ACL默认不支持直接将动态变量作为IP范围参数,但可以通过**src_ip_in转换器**实现动态IP/CIDR匹配,修改后的配置如下:
tcp-request content set-var(txn.accepted_ips) var(txn.sendercompid),map_str(/sender_ips.map) # 使用src_ip_in转换器判断客户端IP是否在动态获取的IP/CIDR列表内 acl ip_match req.src_ip_in(var(txn.accepted_ips)) tcp-request content reject unless ip_match
关键说明
req.src_ip_in(var(...))会在请求处理阶段动态解析变量中的IP/CIDR列表,完成客户端IP的匹配判断- 映射表
/sender_ips.map中的值需用空格分隔多个IP或CIDR,示例格式:FIX_CLIENT1 192.168.0.2 10.0.0.0/8 FIX_CLIENT2 172.16.0.0/12 - 该特性要求HAProxy版本≥2.2,若版本过低需先升级。
内容的提问来源于stack exchange,提问作者jeremysprofile
相关产品推荐
相关产品推荐

