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