如何基于ModSecurity(实际用Coraza)按IP对规则做速率限制?
基于源IP的Coraza速率限制实现
针对你匹配foo.com主机头的规则,要实现每个源IP每秒最多10次请求的限制,可通过以下两种方式完成:
方式一:直接扩展原规则
将速率限制动作直接附加到原规则中,利用Coraza的ratelimit动作实现按IP分组的速率控制:
SecRule REQUEST_HEADERS:Host "foo.com" "id:5,phase:1,ratelimit:10/1,key:%{REMOTE_ADDR},msg:'Exceeded rate limit for foo.com from IP %{REMOTE_ADDR}',log,deny"
参数解释:
ratelimit:10/1:设定每秒最多允许10次请求,格式为「请求次数/时间单位」,支持s(秒)、m(分)、h(时)、d(天)key:%{REMOTE_ADDR}:以客户端源IP作为速率计数的分组键,保证每个IP的请求独立统计deny:触发限制时直接拒绝请求,可根据需求替换为drop(断开连接)或其他动作log:记录触发限制的日志,便于后续排查
方式二:拆分规则(更灵活)
如果后续需要叠加更多限制条件,可拆分规则先标记目标请求,再单独做速率控制:
- 标记匹配
foo.com的请求:
SecRule REQUEST_HEADERS:Host "foo.com" "id:5,phase:1,setvar:tx.foo_com_request=1"
- 针对标记的请求按IP做速率限制:
SecRule TX:foo_com_request "@eq 1" "id:6,phase:1,ratelimit:10/1,key:%{REMOTE_ADDR},msg:'Exceeded rate limit for foo.com from IP %{REMOTE_ADDR}',log,deny"
这种方式的优势是可以轻松扩展额外条件(比如结合请求路径、HTTP方法等),不影响原匹配规则的独立性。
注意事项
- 确保Coraza已启用速率限制模块(默认通常已开启)
- 若部署多实例Coraza节点,需配置分布式存储(如Redis)实现跨节点的速率计数同步
- 可根据业务需求调整速率阈值,比如每分钟600次可写为
ratelimit:600/1m
内容的提问来源于stack exchange,提问作者user2233706
相关产品推荐
相关产品推荐

