如何将指定Cloudflare防火墙规则正确转换为可用的HAProxy规则
问题根因
你之前编写的HAProxy规则逻辑和Cloudflare规则完全不匹配:
- Cloudflare规则中的
any(len(http.request.headers.values[*])[*] gt 60)是判断是否存在任意一个请求头的取值长度大于60 - 你用的
hdr_cnt() gt 60/req.fhdr_cnt() gt 60是判断请求头的总数量大于60,二者逻辑完全不一致,这是规则不生效的核心原因。
可用规则参考
简化版(去掉HTTP版本、查询字符串校验)
acl test1 req.hdr_val_len all gt 60 http-request deny if METH_GET test1
完整匹配原Cloudflare规则版本
# 匹配请求方法为GET acl is_get METH_GET # 匹配查询字符串为空 acl query_empty query len 0 # 匹配HTTP版本为1.1 acl http_11 req.ver eq 1.1 # 匹配任意请求头值长度大于60 acl header_val_too_long req.hdr_val_len all gt 60 # 所有条件满足则拒绝请求 http-request deny if is_get query_empty http_11 header_val_too_long
注意事项
- 上述配置适配HAProxy 2.0及以上版本,
req.hdr_val_len为2.0版本新增的采样方法 - 规则需要放置在frontend或listen块的http-request配置段靠前位置,避免被其他前置规则放行导致不生效
内容的提问来源于stack exchange,提问作者Amigogeha
相关产品推荐
相关产品推荐

