Cloud Armor高级规则:能否在同一条件下匹配多个IP网段?
在Cloud Armor高级规则中匹配多个IP网段的解决方案
你不能直接用contains来匹配多个IP网段,原因很简单:origin.ip是客户端的单个IP地址,而你写的CIDR段是字符串格式,contains做的是字符串包含判断,不是网络地址归属判断——比如客户端IP34.90.1.1不会被'34.90.0.0/15,...'.contains(origin.ip)匹配到,因为前者不是后者字符串的子串。而国家代码的场景能生效,是因为origin.region_code是单个枚举值(比如AT),正好是逗号分隔列表里的元素,字符串包含逻辑能成立。
针对你的需求(在复杂多逻辑规则中实现IP网段排除),有两种可行方案:
方案1:用逻辑或组合多个inIpRange调用
直接为每个IP网段单独调用inIpRange,再用||(逻辑或)连接,最后用not包裹实现排除逻辑,再结合你的主机、路径匹配条件:
not ( inIpRange(origin.ip, '34.90.0.0/15') || inIpRange(origin.ip, '34.141.128.0/17') || inIpRange(origin.ip, '66.249.64.0/19') ) && host.matches('your-host.com') && path.matches('/your-path/*')
这种方式适合IP网段数量较少的场景,逻辑清晰直观,注意用括号明确优先级,避免逻辑顺序出错。
方案2:使用Cloud Armor IP集合(IP Set)
如果需要管理的IP网段数量较多,推荐用IP集合来批量管理:
- 在Cloud Armor控制台创建一个IP集合,将所有需要排除的CIDR段添加进去
- 在规则表达式中用
inIpSet函数引用这个集合,结合排除逻辑:
not inIpSet(origin.ip, 'projects/your-project-id/global/ipSets/your-excluded-ip-set') && host.matches('your-host.com') && path.matches('/your-path/*')
这种方式的优势是后续修改IP网段不需要调整规则,只需要更新IP集合即可,维护成本更低,也更适合复杂规则场景。
内容的提问来源于stack exchange,提问作者mati kepa
相关产品推荐
相关产品推荐

