You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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:记录触发限制的日志,便于后续排查

方式二:拆分规则(更灵活)

如果后续需要叠加更多限制条件,可拆分规则先标记目标请求,再单独做速率控制:

  1. 标记匹配foo.com的请求:
SecRule REQUEST_HEADERS:Host "foo.com" "id:5,phase:1,setvar:tx.foo_com_request=1"
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:04:52