tc命令是Linux中用于网络流量控制的强大工具,可对出站流量进行限速、优先级划分和整形。其核心机制基于qdisc(排队规则)、class(类)和filter(过滤器)三大组件。tbf适用于简单限速,htb则支持复杂的分级带宽管理,如为SSH、HTTP分配不同优先级和带宽。常见问题包括误用于入站流量、旧规则残留、过滤器匹配错误及测试方法不当。排查需检查规则状态与统计信息。tc常与iptables协同:iptables在mangle表中通过MARK为目标流量打标记,tc使用fw过滤器根据标记将流量导向特定class进行调度,从而实现精细化QoS策略。
tc
tc
使用
tc
qdisc
class
filter
qdisc
eth0
qdisc
qdisc
qdisc
class
qdisc
HTB
qdisc
qdisc
filter
class
qdisc
基本限速示例 (使用 tbf
tbf
qdisc
# 1. 清除eth0接口上可能存在的旧规则,避免冲突 sudo tc qdisc del dev eth0 root # 2. 在eth0接口上添加一个tbf qdisc,限制出站速度为100kbit/s, # 允许突发流量达到10kbit,并设置延迟为70ms(数据包在队列中等待的最长时间) sudo tc qdisc add dev eth0 root tbf rate 100kbit burst 10kbit latency 70ms # 3. 验证规则是否生效 sudo tc qdisc show dev eth0
分级限速与优先级示例 (使用 HTB
HTB
tc
qdisc
假设我们想将
eth0
# 1. 清除eth0接口上的所有现有规则 sudo tc qdisc del dev eth0 root # 2. 创建一个HTB根qdisc。handle 1: 是这个qdisc的标识符。 # default 20 表示所有未被特定过滤器匹配的流量都将进入classid 1:20。 sudo tc qdisc add dev eth0 root handle 1: htb default 20 # 3. 创建一个主类 (parent 1:),定义总的可用带宽。 # classid 1:1 是这个主类的标识符。 # rate 100mbit 是承诺带宽,ceil 100mbit 是最大可用带宽。 sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit # 4. 创建子类,分配给不同类型的流量。 # a. SSH流量类 (高优先级) # parent 1:1 表示它是主类1:1的子类。classid 1:10 是其标识符。 # rate 50mbit 是承诺带宽,ceil 80mbit 是在有空闲时可以突发到的最大带宽。 # prio 1 表示优先级最高(数字越小优先级越高)。 sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 50mbit ceil 80mbit prio 1 # b. HTTP流量类 (中优先级) sudo tc class add dev eth0 parent 1:1 classid 1:20 htb rate 20mbit ceil 50mbit prio 2 # c. 默认流量类 (低优先级,用于所有未匹配的流量) # 这个类的rate和ceil可以根据实际情况设置,或者让它共享剩余带宽。 sudo tc class add dev eth0 parent 1:1 classid 1:30 htb rate 10mbit ceil 30mbit prio 3 # 5. 使用过滤器将特定流量分类到对应的类。 # protocol ip 表示匹配IP协议流量。prio 定义过滤器本身的优先级。 # u32 过滤器允许我们基于IP头部字段进行匹配。 # match ip dport 22 0xffff 表示匹配目的端口为22的TCP/UDP流量。 # flowid 1:10 表示将匹配到的流量导向classid 1:10。 # a. SSH流量 (目的端口22) sudo tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 22 0xffff flowid 1:10 # b. HTTP流量 (目的端口80) sudo tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip dport 80 0xffff flowid 1:20 # 6. 验证所有规则 sudo tc -s qdisc show dev eth0 sudo tc -s class show dev eth0 sudo tc -s filter show dev eth0 # 7. 删除所有规则 # 当你不再需要这些规则时,记得删除它们。 # sudo tc qdisc del dev eth0 root
这个
HTB
tc
tc
这绝对是
tc
tc
tc
一个最核心的误区是:tc
egress
eth0
eth0
ingress
tc
ingress qdisc
egress
iptables
egress
IMQ
另外,还有几个常见原因:
eth0
sudo tc qdisc del dev eth0 root
filter
u32
default
u32
0xffff
ping
ping
iperf3
netcat
tc
tc
filter
prio
tc
prio
tc
sch_htb
sch_tbf
lsmod | grep sch_
遇到问题,最有效的排查方式是使用
sudo tc -s qdisc show dev eth0
sudo tc -s class show dev eth0
sudo tc -s filter show dev eth0
qdisc
class
tc
iptables
tc
iptables
iptables
tc
iptables
iptables
MARK
CONNMARK
mangle
tc
协同工作流程:
iptables
iptables
mangle
# 示例:标记所有源IP为192.168.1.100的出站流量,标记值为10 sudo iptables -t mangle -A POSTROUTING -s 192.168.1.100 -j MARK --set-mark 10 # 示例:标记所有目的端口为80(HTTP)的出站TCP流量,标记值为20 sudo iptables -t mangle -A POSTROUTING -p tcp --dport 80 -j MARK --set-mark 20 # 确保路由后,标记仍然存在。PREROUTING 也可以,但POSTROUTING更靠近tc的egress。 # 如果要对入站流量进行标记,通常在PREROUTING链进行,但要记住tc只能在出站接口整形。
注意:
MARK
CONNMARK
MARK
tc
tc
fw
iptables
class
qdisc
# 假设你已经设置了一个HTB根qdisc和主类,例如: # 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 ceil 100mbit # 创建一个子类1:10,用于处理标记为10的流量 sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10mbit ceil 20mbit prio 1 # 创建一个子类1:20,用于处理标记为20的流量 sudo tc class add dev eth0 parent 1:1 classid 1:20 htb rate 5mbit ceil 15mbit prio 2 # 使用fw过滤器匹配iptables的标记 # prio 1 表示这个过滤器本身的优先级。handle 10 fw 匹配标记值为10的数据包。 sudo tc filter add dev eth0 parent 1: protocol ip prio 1 handle 10 fw flowid 1:10 # 匹配标记值为20的数据包 sudo tc filter add dev eth0 parent 1: protocol ip prio 2 handle 20
以上就是Linux tc命令流量控制使用方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号