hashlimit模块仅限新建连接速率(如每秒请求数),无法限制并发连接数;真正控制单ip并发上限需配合connlimit模块,二者协同实现“限速+限连”双重防护。

不能用 hashlimit 直接限制“并发连接数”,它只管单位时间内的匹配次数,比如每秒多少个新连接请求;真正控并发上限得靠 connlimit 模块。所谓“为独立源 IP 动态配置并发限速”,其实是两件事协同:一是用 hashlimit 控单 IP 新建连接频率(防扫描、防爆破),二是用 connlimit 控单 IP 同时建立的连接总数(防资源耗尽)。
先用 hashlimit 限新建连接速率
hashlimit 按源 IP 维护独立令牌桶,适合做精准频控:
- --hashlimit-mode srcip 是关键,确保每个 IP 计数隔离,互不干扰
- 常用写法示例(HTTP 服务,每秒最多 12 个新连接,突发允许 36 个):
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m hashlimit \<br> --hashlimit-above 12/sec --hashlimit-burst 36 \<br> --hashlimit-mode srcip --hashlimit-name http-new \<br> -j ACCEPT
- 必须紧跟一条兜底规则:
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j DROP
否则未匹配 hashlimit 的包会继续向下走,可能被默认策略放行
再用 connlimit 控制并发连接数
hashlimit 管“进来多快”,connlimit 管“能留多少”:
- 限制单个 IPv4 地址最多维持 5 条活跃连接:
iptables -A INPUT -p tcp --dport 80 -m connlimit \<br> --connlimit-above 5 --connlimit-mask 32 \<br> -j REJECT --reject-with tcp-reset
- --connlimit-mask 32 表示精确到 /32(单 IP),若想按网段限(如整个内网),可设为 24
- 用 REJECT + tcp-reset 而非 DROP,让客户端立刻感知断连,避免卡在超时重试
组合使用更稳妥,且支持动态调整
两条规则顺序不能颠倒:先放行合规的新建连接(hashlimit),再拦截超额的已建连接(connlimit)。实际部署建议:
- 初期把
-j DROP或-j REJECT换成-j LOG --log-prefix "LIMIT-HIT: ",观察dmesg | grep LIMIT-HIT确认拦截是否合理 - hashlimit 表项默认长期驻留,加
--hashlimit-htable-expire 60000(单位毫秒)可让空闲 60 秒的 IP 条目自动清理,防内存累积 - 可通过
cat /proc/net/ipt_hashlimit/http-new查看当前各 IP 的计数状态,便于排查或调参
注意常见误区
别混淆功能边界:
- limit 模块不行:它是全局计数器,所有 IP 共用一个桶,无法实现“每 IP 独立限速”
- hashlimit 不等于带宽限速:它不看字节数、不控发包间隔,仅统计匹配事件次数;要限带宽得结合 tc
- 不要只限新建连接就以为万事大吉:攻击者可能建 100 个长连接空占端口,必须用 connlimit 补上这一环











