参考:
- iproute2: 网络管理利器
- iproute2和流量控制(ip和tc工具)---iproute2/ip/tc/qdisc实现Linux下的QoS控制
- DeepSeek
- Grok
01 背景
1.1 功能介绍
在 Linux 系统中使用 tc(Traffic Control)命令结合 TBF(Token Bucket Filter)和 HTB(Hierarchical Token Bucket)模块限制网络带宽,包括上传、下载、特定 IP 和特定端口的带宽控制。所有示例以网络接口 eth0 为例,适用于测试网络性能或模拟特定网络环境。
1.2 前提
- 权限:所有 tc 命令需以 root 权限执行(使用 sudo)。
- 工具:确保安装 iproute2 包(包含 tc 命令)。
安装步骤请参考: [网络] [iproute2] tc命令:Linux网络异常模拟(Network Emulation, netem)指南 的 第二章:前提条件
02 限制上传带宽(使用 TBF)
命令:
sudo tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
功能:
限制 eth0 的出口带宽(上传)为 1Mbps,允许 32Kb 的瞬时突发流量,最大排队延迟 400ms。
适用于需要平滑流量的场景(如限制上传带宽),同时允许短暂突发。
参数说明:
- tbf:令牌桶过滤器(Token Bucket Filter),通过令牌控制数据发送速率。系统以固定速率生成令牌,每个令牌允许发送一定数据,未拿到令牌的数据包会被延迟或丢弃。
- rate 1mbit:长期平均带宽限制为 1Mbps。
- burst 32kbit:令牌桶最大容量,允许瞬时突发流量至 32Kb。
- latency 400ms:数据包最大排队延迟,超时则丢弃。较小的 latency 减少延迟但可能增加丢包,较大的值增加延迟但提高吞吐量。
验证
# 查看规则
tc qdisc show dev eth0
# 测试上传带宽(需外部服务器运行 iperf)
iperf -c <server_ip>
清除规则:
sudo tc qdisc del dev eth0 root
03 限制下载带宽(使用 IFB 模块)
命令:
# 加载 ifb 模块
sudo modprobe ifb
# 启动虚拟网卡 ifb0
sudo ip link set dev ifb0 up
# 将 eth0 的入口流量重定向到 ifb0
sudo tc qdisc add dev eth0 handle ffff: ingress
sudo tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
# 限制 ifb0 的出口带宽(即 eth0 的下载带宽)
sudo tc qdisc add dev ifb0 root tbf rate 1mbit burst 20kbit latency 500ms
功能:
通过 IFB(Intermediate Functional Block)虚拟网卡限制 eth0 的入口带宽(下载)为 1Mbps,允许 20Kb 突发流量,最大延迟 500ms。
适用于测试网络拥塞或模拟低速下载环境。
参数说明:
- ifb:虚拟网卡模块,将入口流量重定向为出口流量以便限制。
- ingress:捕获 eth0 的入口流量。
- u32 match u32 0 0:匹配所有 IP 流量。
- action mirred egress redirect dev ifb0:将入口流量重定向到 ifb0 的出口。
- tbf rate 1mbit burst 20kbit latency 500ms:在 ifb0 上限制出口带宽为 1Mbps。
验证:
# 检查 ifb 模块
lsmod | grep ifb
# 查看规则
tc qdisc show dev eth0
tc qdisc show dev ifb0
# 测试下载带宽
iperf -c <server_ip>
清除规则:
sudo tc qdisc del dev eth0 ingress
sudo tc qdisc del dev ifb0 root
sudo ip link set dev ifb0 down
注意:
- tc 无法直接限制入口流量,需通过 IFB 将下载流量转为出口流量处理。
- 确保 ifb 模块已加载(modprobe ifb)。
- 效果为模拟限速(可能引入延迟或丢包),而非物理层带宽控制。
04 限制特定 IP 带宽(使用 HTB)
命令:
# 创建 HTB 根队列
sudo tc qdisc add dev eth0 root handle 1: htb default 10
# 添加父类(总带宽 10Mbps)
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit
# 添加子类(限制目标 IP 带宽为 2Mbps,可借用至 3Mbps)
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 2mbit ceil 3mbit
# 添加过滤器(匹配目标 IP 192.168.1.100)
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.100 flowid 1:10
功能:
使用 HTB(Hierarchical Token Bucket)限制 eth0 上目标 IP(192.168.1.100)的出口带宽为 2Mbps,允许借用至 3Mbps。
适用于对特定设备或 IP 的流量进行精细控制。
参数说明:
- htb:分层令牌桶算法,支持分层带宽分配。
- handle 1::根队列标识符(主句柄为 1)。
- default 10:未匹配规则的流量默认进入子类 1:10。
- classid 1:1:父类标识符,限制总带宽为 10Mbps。
- classid 1:10:子类标识符,限制目标 IP 带宽。
- rate 2mbit:保证带宽为 2Mbps。
- ceil 3mbit:允许借用带宽至 3Mbps(当网络空闲时)。
- u32 match ip dst 192.168.1.100:匹配目标 IP 为 192.168.1.100 的流量。
- flowid 1:10:将匹配流量导向子类 1:10。
验证:
tc qdisc show dev eth0
tc class show dev eth0
tc filter show dev eth0
iperf -c 192.168.1.100
清除规则:
sudo tc qdisc del dev eth0 root
05 限制特定端口带宽(使用 HTB)
命令:
# 清除现有规则
sudo tc qdisc del dev eth0 root
# 创建 HTB 根队列
sudo tc qdisc add dev eth0 root handle 1: htb default 20
# 创建父类(总带宽 100Mbps)
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
# 创建子类(限制 HTTP 端口 80 为 1Mbps)
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit ceil 1mbit
# 添加过滤器(匹配目标端口 80)
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:10
# 添加默认子类(其他流量 50Mbps,可借用至 100Mbps)
sudo tc class add dev eth0 parent 1:1 classid 1:20 htb rate 50mbit ceil 100mbit
功能:
使用 HTB 限制 eth0 上目标端口(HTTP 端口 80)的出口带宽为 1Mbps,其他流量保证 50Mbps(可借用至 100Mbps)。
适用于限制特定服务(如 Web 服务)的带宽。
参数说明:
- htb default 20:未匹配规则的流量进入子类 1:20。
- classid 1:1:父类,设置总带宽为 100Mbps。
- classid 1:10:子类,限制端口 80 带宽为 1Mbps。
- classid 1:20:默认子类,其他流量保证 50Mbps。
- match ip dport 80 0xffff:匹配目标端口 80(16 位精确掩码)。
- protocol ip:匹配 IPv4 流量(IPv6 需改为 protocol ipv6)。
验证:
tc qdisc show dev eth0
tc class show dev eth0
tc filter show dev eth0
curl http://<server_ip>
清除规则:
sudo tc qdisc del dev eth0 root