参考文章:
一、常用命令
- tc qdisc show|ls 查看所有的<队列规则>
- tc qdisc show ens36 查看指定网卡的<队列规则>
- tc filter show dev ens36 查看指定网卡的 < filter >
---------------
#添加
tc qdisc add dev ens36 root handle 1: htb
#删除
tc qdisc del dev ens36 root handle 1:
---------------
# 添加
tc class add dev ens36 parent 1: classid 1:10 htb rate 10mbit ceil 10mbit
#删除
tc class del dev ens36 classid 1:10
---------------
# 控制源IP 10.100.0.99 的下载速度为10mbit
tc filter add dev ens36 protocol ip parent 1:0 prio 1 u32 \
match ip dst 10.100.0.99/32 \
flowid 1:10
二、tc 环境复原
- 清除所有网络接口的 qdisc 和类
for dev in $(ip link show | grep '^[0-9]' | awk '{print $2}'); do
echo "Cleaning up tc rules for device: $dev"
tc qdisc del dev "$dev" root
done
- 清除所有 ingress qdisc
for dev in $(ip link show | grep '^[0-9]' | awk '{print $2}'); do
echo "Cleaning up ingress qdisc for device: $dev"
tc qdisc del dev "$dev" ingress
done
三、启动虚拟设备来实现 上行带宽限速
# ifb模块需要手动加载。
modprobe ifb
# 启用虚拟设备ifb0
ip link set dev ifb0 up
#重定向ens36入口流量到ifb0
tc qdisc add dev ens36 handle ffff: ingress
tc filter add dev ens36 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
# 配置ifb网卡过滤规则
tc qdisc add dev ifb0 root handle 1: htb
tc class add dev ifb0 parent 1: classid 1:20 htb rate 20mbit ceil 20mbit
# 内网ip 10.100.0.99 --- 外网183.66.100.19
tc filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 \
match ip src 10.100.0.99/32 \
match ip dst 183.66.100.19/32 \
flowid 1:20
三、一个小案例
假设你有一个网络接口 "eth0",你想要控制通过这个接口的不同类型的流量。你可以这样操作:
设定一个父类(例如,句柄为 1:)作为根队列规则。
在这个父类下,创建多个子类,每个子类对应一种类型的流量(例如,视频流量、网页浏览流量等)。
为每个子类分配不同的带宽(例如,视频流量 500 Mbps,网页浏览流量 100 Mbps)。
设置过滤器,根据流量的特征(如端口号或 IP 地址)将流量分配到相应的子类。
Kimi: 好的,让我们通过一系列步骤来具体实现这个例子。假设我们想要控制通过 eth0
接口的网络流量,确保视频流量获得较高的带宽,而网页浏览流量获得较低的带宽。以下是具体的命令和步骤:
1: 设置根 HTB 队列规则
首先,我们需要为 eth0
接口设置一个根 HTB 队列规则。这个根规则将作为所有子类的父类。
tc qdisc add dev eth0 root handle 1: htb default 10
这里的 1:
是根 HTB 规则的句柄,default 10
表示如果流量不匹配任何子类,它将被分配到 ID 为 10 的类。
2: 创建子类并分配带宽
接下来,我们将为视频流量和网页浏览流量创建子类,并为它们分配不同的带宽。
视频流量子类
tc class add dev eth0 parent 1: classid 1:10 htb rate 500mbit ceil 500mbit
这里的 1:10
是视频流量子类的 ID,rate 500mbit
设置了这个子类的最大带宽为 500 Mbps。
网页浏览流量子类
tc class add dev eth0 parent 1: classid 1:20 htb rate 100mbit ceil 100mbit
这里的 1:20
是网页浏览流量子类的 ID,rate 100mbit
设置了这个子类的最大带宽为 100 Mbps。
3: 设置过滤器以匹配流量
现在我们需要设置过滤器,以便将特定的流量匹配到相应的子类。例如,假设我们想要将所有使用 HTTP (端口 80) 和 HTTPS (端口 443) 的流量分配给网页浏览流量子类。
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff match ip dport 443 0xffff flowid 1:20
这里的 1:0
是根过滤器的 ID,prio 1
设置了过滤器的优先级,u32
是匹配规则的类型。match
语句用于定义匹配条件,这里我们匹配目标端口为 80 或 443 的 IP 流量。flowid 1:20
表示匹配的流量将被分配到 ID 为 1:20 的子类。
4: 应用并测试配置
完成以上步骤后,你的流量控制配置应该已经设置好了。你可以通过以下命令来查看当前的 TC 配置:
tc qdisc show dev eth0
tc class show dev eth0
这些命令将显示 eth0
接口上的队列规则和类配置。确保所有配置都正确无误后,你的网络流量控制应该就可以按照预期工作了。
请注意,这些命令需要 root 权限来执行,而且具体的端口号和协议可能需要根据你的实际需求进行调整。此外,这些设置是临时的,重启网络服务或系统后将不再有效。要使设置持久化,你需要将这些命令添加到适当的启动脚本中。
四、一些解释
parent 1:
指的是一个流量控制类的父类的句柄(handle)。这里的 1:
是一个特定的标识符,用于指定该类的层级关系。
-
数字
1
: 这通常是一个主类(major number)的标识符,它与特定的队列规则类型相关联。在 HTB(Hierarchical Token Bucket)队列规则中,这个数字通常用来标识根队列规则。 -
冒号
:
: 这个符号用来分隔主类标识符和次类(minor number)标识符。次类标识符可以进一步指定特定的流量控制类。
在 HTB 队列规则中,层级结构允许你创建一个父类和多个子类。父类可以分配带宽给子类,并且可以设置规则来控制子类的行为。子类继承父类的属性,但也可以有自己的特定设置。
例如,如果你执行以下命令:
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000mbit
这里:
dev eth0
指定了要配置的网络设备。parent 1:
表示这个新的流量控制类是一个已经存在的类的子类,其父类的句柄是1:
。classid 1:1
是新创建的子类的句柄,其中1:
是继承自父类的主类标识符,1
是这个特定子类的次类标识符。htb rate 1000mbit
设置了这个子类的带宽限制为 1000 Mbps。
在没有特别指定父类的情况下,parent 1:
默认指向根队列规则。如果你在命令中没有指定 parent
,tc
会假设你想要添加的是一个根队列规则。在创建子类时,你需要指定一个已经存在的父类,这样子类才能正确地继承父类的属性并在这个层级结构中定位。