connbytes模块用于匹配连接累计字节数或报文数以触发动作,而非实时限速;它基于conntrack统计单个连接双向/单向流量,支持按bytes、packets或avgpkt模式匹配,并常与CONNMARK、tc联动实现超量连接的标记、丢弃或带宽降级。

iptables 的 connbytes 模块不是用来“限速”的,而是用来**匹配已建立连接累计传输的字节数或包数**,从而触发后续动作(如 DROP、REJECT、MARK 等)。它本身不控制速率,但可作为策略判断依据,配合其他机制(如 tc)或用于主动干预大流量长连接。
connbytes 的核心用途和限制
connbytes 工作在连接跟踪(conntrack)层面,统计的是单个连接(connection)双向/单向累计传输的字节数(或数据包数),适用于识别“已经跑了很多流量”的连接,比如:
- 下载大文件的 HTTP 连接(已传 >50MB)
- 持续上传视频的 RTMP 流连接
- 异常持久且高吞吐的 SSH 隧道或代理连接
注意:它不能实时限速(不像 tc 做带宽整形),也不能按“每秒多少字节”动态调节;它只做一次性的阈值判断——满足条件就执行 -j 动作。
典型用法:对超量连接打标或拦截
常用场景是结合 CONNMARK 或直接丢弃。例如,对单个 TCP 连接累计上传+下载超过 100MB 后标记,供后续规则或 tc 使用:
iptables -t mangle -A FORWARD -p tcp -m connbytes --connbytes 104857600: --connbytes-dir both --connbytes-mode bytes -j CONNMARK --save-mark --nfmask 0xffffffff
说明:
-
--connbytes 104857600:表示 ≥100MB(100×1024×1024) -
--connbytes-dir both统计双向总流量(也可用original或reply) -
--connbytes-mode bytes按字节统计(也可用packets) -
-t mangle是必须的,因 CONNMARK 只在 mangle 表生效
之后你可用 iptables -t mangle -A FORWARD -m connmark --mark 1 -j DROP 直接终止该连接,或用 tc 对标记连接做带宽整形。
与 tc 配合实现“软限速”效果
单纯用 connbytes 无法限速,但可联动 tc 实现“对已超量连接降级处理”:
- 用 connbytes 匹配并 MARK 超量连接(如上)
- 用 iptables 在 mangle 表给该连接的数据包打包标记:
iptables -t mangle -A POSTROUTING -m connmark --mark 1 -j MARK --set-mark 100 - 用 tc 建立 HTB 队列,在 eth0 上为 mark 100 的包分配低优先级带宽:
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 512kbit ceil 1024kbit
tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 100 fw flowid 1:10
这样,一旦连接累计达 100MB,其后续所有数据包都会被压到 512kbit 带宽下运行,达到“自动限速”效果。
注意事项与避坑点
使用 connbytes 时需特别注意:
- 仅对已进入 conntrack 表的连接有效(即已通过 SYN/ACK 完成三次握手)
- 不适用于 UDP 或无状态协议(除非开启 nf_conntrack_udp_* 相关模块并启用连接跟踪)
- 统计值有延迟,非实时更新(通常 1–3 秒内同步),不适合毫秒级响应场景
- 若连接中断重连,计数清零,无法跨连接累计
- 务必搭配
-t mangle使用,filter 表中无法调用 CONNMARK











