iptables 限制qps需用limit或hashlimit模块:limit基于令牌桶限全局速率,hashlimit按源ip独立限速;firewalld rich rule封装hashlimit更直观;须配合syncookies、connlimit等策略增强防护。

直接限制每秒请求数(QPS),iptables 本身不靠 connlimit,它只管并发连接数;真正起作用的是 limit 和 hashlimit 模块,或换用 firewalld 的 rich rule。
用 iptables -m limit 限制新建连接速率(适合基础防护)
limit 模块基于令牌桶算法,对匹配的数据包做简单速率控制,适用于防 SYN Flood 或低强度 HTTP 洪水。
- 它统计的是“每秒通过的包数量”,不是连接数,但配合
--syn可间接限制新连接频率。 - 规则需成对使用:先放行合规流量,再丢弃超限流量。
常见写法:
# 允许每秒最多 5 个新 TCP 连接(SYN 包),突发允许 10 个 sudo iptables -A INPUT -p tcp --syn -m limit --limit 5/s --limit-burst 10 -j ACCEPT # 其余 SYN 包全部丢弃 sudo iptables -A INPUT -p tcp --syn -j DROP
⚠️ 注意:
-
--limit 5/s是平均速率,内核会平滑分配令牌; -
--limit-burst 10防止合法用户因瞬时请求被误拦; - 此规则对 UDP 不生效(UDP 无 SYN);
- 不能按源 IP 分组限速,所有流量共用一个令牌桶。
用 iptables -m hashlimit 实现按源 IP 限速(推荐用于 CC/UDP 反射防护)
hashlimit 更精准:为每个源 IP 维护独立计数器,支持老化、分组统计,适合防 CC 攻击和 UDP 反射。
典型 HTTP 防护示例:
# 每个源 IP 每秒最多 10 个新连接,突发上限 30,计数器 10 分钟后自动清理 sudo iptables -I INPUT -p tcp --dport 80 --syn -m hashlimit \ --hashlimit-above 10/sec \ --hashlimit-burst 30 \ --hashlimit-mode srcip \ --hashlimit-name http_per_ip \ -j DROP
UDP 反射防护示例(如 DNS 端口):
# 限制每个源 IP 每分钟最多 60 个 UDP 53 端口新建请求 sudo iptables -A INPUT -p udp --dport 53 -m state --state NEW -m hashlimit \ --hashlimit-above 60/min \ --hashlimit-burst 5 \ --hashlimit-mode srcip \ --hashlimit-name dns_qpm \ -j DROP
关键参数说明:
-
--hashlimit-mode srcip:按客户端 IP 统计(也可加dstport多维分组); -
--hashlimit-above:超过该值即触发动作(DROP/REJECT); -
--hashlimit-burst:允许短时突发,避免正常用户卡顿; -
--hashlimit-name:必须唯一,用于内核哈希表标识; - 默认老化时间约 10 分钟(600 秒),可调
--hashlimit-htable-expire(单位毫秒)。
用 firewalld rich rule 实现更直观的 QPS 控制(适合 systemd 环境)
如果你用的是 firewalld(RHEL/CentOS/Fedora 默认),rich rule 封装了 hashlimit 行为,语法更清晰,且支持持久化。
启用每秒 5 个新连接限制:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="80" protocol="tcp" limit value="5/s" accept' sudo firewall-cmd --reload
补充说明:
-
limit value="5/s"仅作用于新建连接(SYN 包),等效于hashlimit --hashlimit-above 5/sec; - 不加
--permanent重启后失效; - 超限包默认静默丢弃;如需日志,改用
audit limit value="5/s" reject。
配合其他策略提升实效性
单靠限速不够,需组合使用:
- 启用
tcp_syncookies=1缓解 SYN Flood(echo 1 > /proc/sys/net/ipv4/tcp_syncookies); - 对 UDP 服务,加长度过滤(如
iptables -A INPUT -p udp -m length --length 0:28 -j DROP); - 结合
connlimit控制并发连接数,弥补hashlimit不覆盖长连接的短板; - 记录并封禁高频攻击源:用
recent模块标记 +DROP,或导出日志交由 fail2ban 处理。
不复杂但容易忽略。











