菜鸟科技网

tc脚本命令如何高效配置网络规则?

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

tc脚本命令如何高效配置网络规则?-图1
(图片来源网络,侵删)

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脚本命令如何高效配置网络规则?-图2
(图片来源网络,侵删)
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脚本命令如何高效配置网络规则?-图3
(图片来源网络,侵删)
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定期采集数据。

注意事项

  1. 原子性操作replace命令可避免临时规则失效,但需确保参数完整。
  2. 规则顺序:filter的优先级(prio)决定匹配顺序,数值越小优先级越高。
  3. 清理规则:删除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/interfacesup段落);2)使用iptablesmangle表标记数据包,结合tcfw过滤器实现规则绑定;3)编写systemd服务单元,在系统启动时自动加载tc规则,例如创建/etc/systemd/system/tc-config.service,在ExecStart中执行tc命令并启用服务。

分享:
扫描分享到社交APP
上一篇
下一篇