tc脚本命令是Linux系统中用于流量控制(Traffic Control)的核心工具,它通过配置网络接口的队列规则、分类器和过滤器,实现对数据包的优先级管理、带宽限制、延迟控制等功能,tc命令属于iproute2工具包,通常与iptables、netfilter等工具配合使用,构建复杂的网络策略,以下从基本概念、命令结构、常用操作及实际应用场景等方面详细解析tc脚本命令。

tc命令的基本结构
tc命令的语法层次分明,主要由对象(object)、动作(action)和参数组成,基本格式为:
tc [OPTIONS] OBJECT { COMMAND | help }
OBJECT包括qdisc(队列规则)、class(分类)、filter(过滤器)、action(动作)等;COMMAND用于对对象进行增删改查操作,如add、del、replace等,常用选项包括-s
(显示统计信息)、-d
(详细输出)、-n
(不解析DNS)等。
核心对象详解
qdisc(队列规则)
qdisc是流量控制的基础,定义数据包在发送队列中的调度方式,常用qdisc类型包括:
- pfifo_fast:三优先级先进先出队列,默认类型。
- HTB(Hierarchical Token Bucket):分层令牌桶,支持带宽分配和优先级管理。
- SFQ(Stochastic Fairness Queueing):随机公平队列,防止流间霸占带宽。
- TBF(Token Bucket Filter):令牌桶过滤器,限制流量速率。
示例:为eth0接口添加HTB队列,限制总带宽为10Mbps:

tc qdisc add dev eth0 root handle 1: htb default 12
tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit
class(分类)
class用于定义qdisc的子类,实现分层带宽分配,需与qdisc配合使用,例如在HTB下创建多个子类:
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 7mbit ceil 10mbit
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 3mbit ceil 10mbit
filter(过滤器)
filter根据数据包特征(如IP、端口、协议)将其分类到特定class,常用过滤器包括u32(基于规则匹配)、fw(基于iptables标记)、route(基于路由表)等。
示例:将源IP为192.168.1.100的流量分配到class 1:10:
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.100 flowid 1:10
典型应用场景
带宽限制
为不同用户或服务分配固定带宽,例如限制P2P下载:

tc qdisc add dev eth1 root handle 1: htb default 30
tc class add dev eth1 parent 1: classid 1:1 htb rate 100mbit
tc class add dev eth1 parent 1:1 classid 1:10 htb rate 50mbit ceil 100mbit
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 6881 0xffff flowid 1:10
延迟控制
通过netem模块模拟网络延迟和丢包:
tc qdisc add dev eth0 root netem delay 100ms loss 1%
实时流量优先级
保障VoIP或游戏等低延迟业务:
tc qdisc add dev eth0 root handle 1: htb default 20
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 2mbit prio 0
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dscp 46 0xfc flowid 1:10
tc命令的调试与监控
使用tc -s qdisc show dev eth0
查看队列统计信息,包括数据包数、字节量、丢包数等,结合tc -s filter show
可分析规则匹配情况,长期监控可通过tcwatch
工具或结合cron
定期采集数据。
注意事项
- 原子性操作:
replace
命令可避免临时规则失效,但需确保参数完整。 - 规则顺序:filter的优先级(prio)决定匹配顺序,数值越小优先级越高。
- 清理规则:删除qdisc时会自动关联删除其下的class和filter,但建议手动清理避免残留。
相关问答FAQs
Q1: 如何删除已配置的tc规则?
A: 使用tc
命令的del
选项删除特定对象,例如删除整个qdisc:tc qdisc del dev eth0 root
;删除单个class:tc class del dev eth0 parent 1:1 classid 1:10
;删除filter:tc filter del dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.100
,若不确定规则ID,可通过tc filter show dev eth0
查询。
Q2: tc规则重启后失效怎么办?
A: tc规则是内核临时配置,重启后会丢失,可通过两种方式持久化:1)将命令写入网络接口启动脚本(如/etc/network/interfaces
的up
段落);2)使用iptables
的mangle
表标记数据包,结合tc
的fw
过滤器实现规则绑定;3)编写systemd服务单元,在系统启动时自动加载tc规则,例如创建/etc/systemd/system/tc-config.service
,在ExecStart
中执行tc命令并启用服务。