iptables实际可用的是-m hashlimit(哈希限速模块),非-m haslimit;它通过--hashlimit-mode和--hashlimit-srcmask实现按源IP或子网独立计数限速,支持C类网段共用计数器、差异化策略及与connlimit联动防护。

iptables 本身没有 -m haslimit 模块,这是个常见误解。实际可用的是 -m limit(基础速率限制)和 -m hashlimit(哈希限速模块),后者才是实现“按子网差异化限速”的核心工具。它能对每个源IP或源网络独立计数、分别限速,非常适合应对来自不同网段的分布式DDoS流量。
确认并启用 hashlimit 模块
大多数现代 Linux 内核(2.6.19+)已内置该模块,但需确认是否可用:
- 运行
iptables -m hashlimit --help,若显示帮助信息则支持 - 若报错“Unknown arg”,检查内核配置:
zcat /proc/config.gz | grep HASHLIMIT或查看/lib/modules/$(uname -r)/kernel/net/netfilter/xt_hashlimit.ko* - OpenWrt 等嵌入式系统可能需手动安装:
opkg install kmod-ipt-hashlimit
按子网设置独立限速规则
hashlimit 的关键在于 --hashlimit-mode 和 --hashlimit-srcmask,它们决定“谁被归为同一组”进行限速。例如:
-
限制整个 C 类子网(/24)的总入站连接速率:
iptables -A INPUT -p tcp --dport 80 -m hashlimit \--hashlimit-above 500/hour \--hashlimit-burst 100 \--hashlimit-mode srcip \--hashlimit-srcmask 24 \--hashlimit-name http_per_subnet \-j DROP - 这意味着:所有来自 192.168.1.0/24 的 IP,其发往 80 端口的请求共用一个计数器,总量超 500 次/小时即触发丢弃
-
区分大客户网段与普通用户网段:
对信任的办公网段(如 10.10.0.0/16)放宽至 2000/hour,而对公网段(0.0.0.0/0)保持严格限制(300/hour),需分两条规则,并注意顺序——更具体的子网规则必须放在更宽泛规则之前
结合 connlimit 实现双重防护
hashlimit 控制“请求频率”,connlimit 控制“并发连接数”。两者互补可覆盖更多 DDoS 场景:
- 先用 hashlimit 封顶每子网每小时请求数
- 再加一条:
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 --connlimit-mask 24 -j DROP
表示:任一 /24 子网内,同时发起的新 TCP 连接不得超过 50 个 - 这样既防慢速 CC(靠 hashlimit),也防 SYN Flood(靠 connlimit + mask)
避免误伤与规则持久化
hashlimit 规则默认不记录日志,调试阶段建议加 LOG 链辅助观察:
- 在 DROP 前插入:
iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-above 300/hour --hashlimit-mode srcip --hashlimit-srcmask 24 -j LOG --log-prefix "[HASHLIMIT-DROP] " - 规则生效后,用
iptables -L INPUT -n -v查看匹配包数,确认限速逻辑符合预期 - 保存规则(Debian/Ubuntu):
iptables-save > /etc/iptables/rules.v4;(CentOS/RHEL):service iptables save或使用iptables-persistent


















