本网站可以通过分类标签帮助你快速筛选出你想看的文章,记住地址:www.Facec.cc

linux流量控制tc—案例

参考文章:

一、常用命令

  • 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 环境复原

  1. 清除所有网络接口的 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
  1. 清除所有 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: 默认指向根队列规则。如果你在命令中没有指定 parenttc 会假设你想要添加的是一个根队列规则。在创建子类时,你需要指定一个已经存在的父类,这样子类才能正确地继承父类的属性并在这个层级结构中定位。

# linux   tc  

评论