iptables的connbytes模块不能直接限速,但可基于单连接累计字节数(如≥5mb)对异常大数据连接进行拦截或标记;需配合--connbytes-dir reply精准控制服务端响应流量,并与tc或hashlimit协同实现策略性防护。

在 Linux 中,iptables 本身不直接支持按单个连接的累计字节数(即 connbytes)做动态限速,但 iptables 的 connbytes 模块可以统计每个连接已传输的字节数,并配合 limit 或 hashlimit 实现“对超出阈值的连接进行拦截或标记”,从而间接达成“对异常大数据拉取行为限速或阻断”的效果。
注意:这不是传统意义上的带宽整形(如 tc 做的速率控制),而是基于连接级流量特征的策略性干预——适合识别并抑制爬虫、恶意下载、未授权同步等典型大数据拉取行为。
一、确认内核与模块支持
确保系统启用 xt_connbytes 模块(Linux 2.6.20+ 默认内置):
lsmod | grep connbytes # 若无输出,手动加载: sudo modprobe xt_connbytes
验证是否可用:
iptables -m connbytes --help 2>/dev/null && echo "✅ connbytes 支持正常"
二、用 connbytes 识别“大数据连接”并标记/丢弃
假设你要防护的是 Web 服务(端口 80/443),目标是:
? 对单个 TCP 连接累计发送(outgoing)超过 5MB 的客户端,后续包全部 DROP
✅ 示例规则(INPUT 链,适用于本机服务)
# 1. 先允许常规连接(必须放在前面,避免被后续规则误拦) iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT # 2. 对已建立连接,检查其「出向字节数」是否超 5MB(5242880 字节) # 注意:此处用 -o eth0 是示意;实际应根据服务监听网卡调整,或省略(默认匹配所有) iptables -A INPUT -p tcp --dport 80 -m connbytes --connbytes 5242880: --connbytes-dir original --connbytes-mode bytes -j DROP iptables -A INPUT -p tcp --dport 443 -m connbytes --connbytes 5242880: --connbytes-dir original --connbytes-mode bytes -j DROP
? 关键参数说明:
| 参数 | 含义 |
|---|---|
--connbytes 5242880: |
匹配「已发送 ≥ 5MB」的连接(冒号表示“大于等于”) |
--connbytes-dir original |
统计该连接中「本机作为 server 发送出去」的数据量(即响应体大小) |
--connbytes-mode bytes |
按字节统计(也可选 packets,但字节更准) |
⚠️ 注意:
original表示连接发起方向(client → server 是 original,server → client 是 reply)。Web 场景下,大流量通常来自 server 回复(如文件下载),所以用original反而会漏掉——真正要控的是 reply 流量。
✅ 正确做法是:用--connbytes-dir reply来捕获服务器返回给客户端的大响应体。
✅ 更准确的写法(控服务端响应流量)
# 针对已建立连接,若服务器已向某客户端回复 ≥5MB,则丢弃后续所有包(含新请求) iptables -A INPUT -p tcp --dport 80 -m state --state ESTABLISHED,RELATED -m connbytes --connbytes 5242880: --connbytes-dir reply --connbytes-mode bytes -j DROP iptables -A INPUT -p tcp --dport 443 -m state --state ESTABLISHED,RELATED -m connbytes --connbytes 5242880: --connbytes-dir reply --connbytes-mode bytes -j DROP
✅ 效果:
- 一个客户端请求
/large.zip,Nginx 返回 10MB 文件 → 当第 5MB 发出后,该连接后续所有数据包(包括下一个 HTTP 请求)都被 DROP。 - 连接不会立即断开(TCP 层仍存在),但应用层收不到响应,自然降速或失败。
三、进阶:结合 hashlimit 实现“每 IP 总出口流量限速”
connbytes 控单连接,hashlimit 可控每个 IP 的单位时间总出口流量(更贴近“防大数据拉取”场景):
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
# 对每个源 IP,在 60 秒内总出口字节数超过 10MB,则限速为 1KB/s(平滑抑制) iptables -t mangle -A FORWARD -p tcp -m connbytes --connbytes-dir reply --connbytes-mode bytes \ -m hashlimit --hashlimit-mode srcip --hashlimit-name bigpull \ --hashlimit-above 10485760 --hashlimit-burst 1048576 --hashlimit-upto 1024 --hashlimit-unit second \ -j MARK --set-mark 1 # 然后用 tc 对 mark=1 的流限速(需额外配置 qdisc) # (此部分超出 iptables 范畴,需搭配 tc 使用)
? 提示:纯 iptables 无法做“软限速”(如限 2MB/s),只能做“硬拦截”或“标记交由 tc 处理”。如需精细带宽控制,请用
tc + iptables mark组合。
四、排查与验证方法
-
查看命中规则的包数:
iptables -L INPUT -v -n | grep "connbytes"
-
实时跟踪某连接字节数(需
conntrack工具):sudo conntrack -L | grep "dport=80" | grep "bytes" # 输出示例:... [ASSURED] orig[...bytes=12548902] ...
-
模拟测试(从客户端执行大文件下载):
curl -s http://your-server/large-file.bin > /dev/null
观察服务端
iptables -L -v计数是否增长。
小结
-
iptables -m connbytes不是限速器,而是连接级流量探测器; - 它最适合的用途是:识别并切断“已完成超量数据传输”的异常连接;
- 搭配
state ESTABLISHED和--connbytes-dir reply,可精准打击服务端被滥用下载; - 如需真正限速(如 2MB/s),请用
tc配合iptables -j MARK; - 所有规则建议保存并持久化:
iptables-save > /etc/sysconfig/iptables # CentOS/RHEL # 或 netfilter-persistent save # Debian/Ubuntu(若安装)
不复杂但容易忽略:connbytes-dir reply 和 original 的方向必须和你要控的流量方向一致,否则规则永不触发。










