connbytes模块用于匹配连接累计字节数、报文数或平均报文长度,支持双向/单向统计及丢弃、标记等动作,但本身不提供动态限速功能,需配合CONNMARK和tc实现平滑限流。

iptables 的 connbytes 模块不能直接“限制”单次连接的流量上限,它只能检测某个连接累计传输的字节数是否达到阈值,并据此触发动作(如标记、丢弃等)。真正的“限速”或“截断”需配合其他机制完成。
它的核心逻辑是:
当一个 TCP/UDP 连接双向(或单向)总流量 ≥ 设定值时,iptables 可对该连接打标、拒绝后续包,或交由 tc 做带宽整形。这不是动态限速,而是一次性判断 + 后续干预。
一、确认 connbytes 模块可用
运行以下命令验证内核支持:
lsmod | grep xt_connbytes
若无输出,说明未加载模块。可尝试手动加载(需内核支持):
modprobe xt_connbytes
注意:该模块依赖连接跟踪(
nf_conntrack),确保iptables -t raw -L能正常显示规则。
二、基础用法:对超量连接直接丢弃
例如,限制每个 TCP 连接双向总流量超过 50MB 后立即终止:
iptables -t mangle -A FORWARD -p tcp -m connbytes \ --connbytes 52428800: --connbytes-dir both --connbytes-mode bytes \ -j DROP
-
52428800:表示 ≥ 50MB(50 × 1024 × 1024) -
--connbytes-dir both:统计源→目的 + 目的→源全部流量 -
--connbytes-mode bytes:按字节计(也可用packets) - 必须使用
mangle表(因connbytes仅在此表生效)
⚠️ 注意:此规则作用于已建立连接的数据流,不是新建连接(SYN)阶段;且一旦触发 DROP,后续所有包(包括 FIN/ACK)都会被丢,连接会异常中断。
三、更稳妥做法:先标记再处理(推荐)
直接 DROP 容易影响用户体验。建议分两步:
- 匹配并标记超量连接(CONNMARK):
iptables -t mangle -A FORWARD -p tcp -m connbytes \ --connbytes 52428800: --connbytes-dir both --connbytes-mode bytes \ -j CONNMARK --save-mark --nfmask 0xffffffff
- 对已标记连接的数据包打包标记(用于 tc 或过滤):
iptables -t mangle -A FORWARD -m connmark --mark 1 -j MARK --set-mark 100
- 用 tc 对 mark 100 的流量限速或降级(例如限为 1Mbps):
tc qdisc add dev eth0 root handle 1: htb default 10 tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit tc class add dev eth0 parent 1:1 classid 1:100 htb rate 1mbit ceil 2mbit tc filter add dev eth0 parent 1: protocol ip prio 2 handle 100 fw flowid 1:100
这样,连接跑满 50MB 后不会突然断开,而是被自动降速,体验更平滑。
四、常见误区提醒
- ❌
connbytes不是实时速率控制器:它不看“每秒多少字节”,只看“总共传了多少字节”。 - ❌ 不能用于 UDP 流控(除非启用连接跟踪且连接状态稳定,但 UDP 本身无连接概念,统计不可靠)。
- ❌ 不适用于短连接(如 HTTP/1.1 短连接、DNS 查询):它们还没传够阈值就结束了。
- ✅ 最适合场景:长连接大文件传输(HTTP 下载、FTP、RTMP 推流、SSH 隧道等)。
实际部署前,建议先用 iptables -t mangle -L -v -n 查看命中数,并结合 conntrack -L | grep "dport=80" 观察连接流量统计是否符合预期。

















