tc|限制虚拟机带宽

tc(Traffic Control)可以管理和控制网络流量

ifb(Intermediate Functional Block)是Linux内核中的一种虚拟网络接口,主要用于处理入站流量。与物理网络接口不同,ifb不直接与硬件通信,而是用于在数据包进入或离开物理接口之前,对其进行处理

tc只能对出站流量进行控制,所以我们可以通过将入站流量重定向到ifb接口,管理员可以对入站流量进行相似的管理和控制

限制出站流量

创建根队列规则

tc qdisc add dev ens32 root handle 1: htb default 10
  • tc qdisc add dev ens33 root:这条命令在ens33接口上添加一个根队列规则(queueing discipline,简称 qdisc)。qdisc 是 Linux 网络中的一个调度机制,用于管理网络流量的发送顺序和速率。
  • handle 1::这指定了一个标识符(1:),用于后续对该队列规则的引用。这个标识符可以理解为qdisc的名称。
  • htb::指定使用的qdisc类型为 htb(Hierarchical Token Bucket,层次令牌桶),它是一种先进的队列调度器,支持层次化的流量管理,适合进行带宽限制。
  • default 10: 如果没有明确的分类,流量将被默认发送到classid 1:10对应的类中。

创建一个类来限制带宽为3M

tc class add dev ens32 parent 1: classid 1:1 htb rate 3mbit
  • tc class add dev ens33 parent 1::这条命令在ens33接口的 1: 这个 qdisc 下创建了一个类(class),这些类用来进一步对流量进行分类和限制,parent 1: 表示这是属于标识符为 1: 的 qdisc 的一个子类。
  • classid 1:1:这个类的标识符是 1:1,以后可以用这个标识符来引用它。
  • htb: 这表示该类使用的是htb调度器,继承了父类(1:)的特性。
  • rate 3mbit: 这将流量速率限制为 3Mbps,rate 表示允许的平均流量速率。

添加sfq队列确保没有单个会话占用过多带宽

tc qdisc add dev ens32 parent 1:1 handle 10: sfq perturb 10
  • perturb 10:表示每10秒重新打乱一次队列,以确保公平性

将过滤器绑定在类上

tc filter add dev ens32 protocol ip parent 1:0 prio 1 u32 match ip dst 0.0.0.0/0 flowid 1:1
  • tc filter add dev ens33 protocol ip:这条命令为ens33接口添加一个过滤器,过滤器用于识别并将流量分类。protocol ip表示过滤器适用于IP协议的数据包。
  • parent 1:0:表示过滤器应用于 1: 这个 qdisc 的所有子类。
  • prio 1:这定义了过滤器的优先级,1是最高优先级,限制范围越宽松的优先级建议越低。
  • u32:这是一种非常灵活和强大的过滤器类型,可以基于数据包头的内容来匹配数据包。
  • match ip dst 0.0.0.0/0:这表示匹配所有目标地址(0.0.0.0/0 表示所有 IP 地址)。
  • flowid 1:1:这指定了匹配的流量将被发送到classid 1:1(即带宽限制为 3Mbps 的类)中。

限制入站流量

加载ifb模块

modprobe ifb

创建一个ifb设备

ip link add ifb0 type ifb
ip link set ifb0 up
  • ip link add ifb0 type ifb:这条命令创建了一个名为ifb0的ifb设备。ip link是一个管理网络接口的命令,这里我们添加了一个新设备ifb0。
  • ip link set ifb0 up:这条命令将ifb0设备启用,使其可以开始处理流量。

重定向入站流量到ifb0

tc qdisc add dev ens32 handle ffff: ingress
tc filter add dev ens32 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
  • tc qdisc add dev ens32 handle ffff: ingress:这条命令在ens32上添加了一个特殊的qdisc,ingress qdisc用于处理入站流量。ffff:是一个保留的标识符,用于表示默认的 ingress qdisc。
  • tc filter add dev ens32 parent ffff::这为ingress qdisc添加了一个过滤器。
  • protocol ip u32 match u32 0 0:这里使用32位键来匹配所有 IP 数据包,0 0是通配符,第一个 0 表示匹配的值,第二个 0 表示掩码。由于掩码为 0,所以它匹配所有值。
  • action mirred egress redirect dev ifb0:这条命令将匹配的入站流量重定向(redirect)到ifb0设备。mirred 是一种tc动作,允许我们重定向或镜像流量。

在ifb0上应用带宽限制

这里就和之前对ens32接口的配置类似

tc qdisc add dev ifb0 root handle 1: htb default 10
tc class add dev ifb0 parent 1: classid 1:1 htb rate 3mbit
tc qdisc add dev ifb0 parent 1:1 handle 10: sfq perturb 10
tc filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip src 0.0.0.0/0 flowid 1:1

持久化配置

在/etc/rc.local写入以上配置,然后chmod +x /etc/rc.local即可

清除配置

tc qdisc del dev ens32 root
tc qdisc del dev ens32 ingress
tc qdisc del dev ifb0 root
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!