linux内核级网络限速通过tc在egress路径调度流量,仅限真实网卡出向流量;tbf适合全局限速,htb+filter支持ip/端口差异化限速,复杂匹配可结合iptables标记实现。

Linux 内核层级的网络流量限速,本质是通过 tc(Traffic Control) 在协议栈出口(egress)路径上对数据包排队、调度和整形,不依赖应用层、不修改业务逻辑,直接作用于内核网络子系统。它不是“堵”,而是“调度”——把发出去的包按策略缓存、延时或丢弃,从而实现精准带宽控制。
限速只对出向流量生效
tc 控制的是本机发出的数据(即 egress 流量),比如服务器上传、客户端发请求、DNS 查询响应等。入口(ingress)流量无法直接限速,若需限制下载速度,必须借助 ifb(Intermediate Functional Block)虚拟设备配合重定向实现。
- 目标网卡必须是真实物理接口(如 eth0、ens33),不能是 lo、docker0 或 veth 等虚拟接口(除非明确配置 ifb 或 netns 场景)
- 执行前确认接口状态:
ip link show eth0 | grep "state UP" - 清理旧规则避免冲突:
sudo tc qdisc del dev eth0 root 2>/dev/null || true
简单全局限速:用 TBF 快速上线
TBF(Token Bucket Filter)结构最简、行为可预测,适合对整块出口带宽设硬上限,例如防止备份任务打满上行链路。
Python Linux版 为 Python.org 官方提供的 Python 3.14.6 Linux/Unix 源码包,适合在Linux/Unix环境中安装、运行 Python 代码并学习函数、模块和脚本开发。
- 命令示例(限制 eth0 出口为 2Mbit/s,允许短时突发):
sudo tc qdisc add dev eth0 root tbf rate 2mbit burst 25kb latency 50ms -
rate 是长期平均速率;burst 太小会导致小包频繁丢弃(如 SSH 握手失败),太大则失去限速意义;建议设为
rate / 10左右(单位注意大小写:mbit ≠ mbps) - 删除规则只需:
sudo tc qdisc del dev eth0 root
按 IP 或端口差异化限速:HTB + filter 组合
当需要“区别对待”流量时(如限制某客户端上传、保障 SSH 带宽),HTB 提供分层令牌桶,配合 u32 过滤器精准匹配。
- 先挂根 HTB:
sudo tc qdisc add dev eth0 root handle 1: htb default 30 - 建总类(保证底层容量):
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit - 建子类(如限制 192.168.1.100 的出向流量):
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit ceil 1mbit - 加过滤器(注意方向:出向规则中
match ip src指本机 IP,match ip dst才是目标 IP):sudo tc filter add dev eth0 parent 1: protocol ip u32 match ip dst 192.168.1.100 flowid 1:10
进阶:结合 iptables 标记实现灵活策略
当匹配条件复杂(如按端口、协议、连接状态),单纯 u32 难以覆盖,可用 iptables 在 mangle 表中标记数据包,再由 tc 按 mark 路由到对应 class。
- 标记 HTTP 流量:
sudo iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 100 - tc 关联标记:
sudo tc filter add dev eth0 parent 1: protocol ip prio 1 handle 100 fw flowid 1:20 - 此方式解耦了匹配逻辑(iptables)与带宽分配(tc),便于维护和复用










