与 Linux TC 默认(慢速)匹配的多个网络目标的带宽限制

与 Linux TC 默认(慢速)匹配的多个网络目标的带宽限制

我正在使用 Linux 流量控制功能来限制 KVM VM 输出带宽,但在使用过滤器匹配给定 VM 的快速类和(默认)慢速类的目的地时遇到了困难。

物理网络输出接口为“eth0”(1 Gbit),是“bond0”绑定设备的一部分。“bond0”是虚拟机虚拟网卡“vmn{0,1,2,3,4}”中“br0”的一部分。

虚拟机网络数据包到互联网的路径是:eth0(虚拟机)->vmn0(主机)->br0(主机)->bond0(主机)->nic0(主机)->互联网。

我正在尝试设置两个课程:

  • 快速:500 Mbps 传出到目的地 10.0.1.0/24 和 10.0.2.0/24
  • 慢速(默认):到其他每个目的地的传出速度为 100 Mbps

我在主机上尝试了以下方法:

# If the qdisc was previously created, delete it
tc qdisc del dev vmn0 root

# New HTB qdisc. By default it goes to our slow traffic class (1:11)
tc qdisc add dev vmn0 root handle 1: htb default 11

# Classes. 1:1 default (500 Mbit) ; 1:10 -> fast (500Mbit); 1:11 -> slow (100Mbit)
tc class add dev vmn0 parent 1: classid 1:1 htb rate 500000kbit ceil 500000kbit quantum 1500
tc class add dev vmn0 parent 1:1 classid 1:10 htb rate 1000kbit ceil 500000kbit
tc class add dev vmn0 parent 1:1 classid 1:11 htb rate 1000kbit ceil 100000kbit

# Associates the fast traffic class with our desireed networks
tc filter add dev vmn0 parent 1: protocol ip prio 10 u32 match ip dst 10.0.1.0/24 flowid 1:10
tc filter add dev vmn0 parent 1: protocol ip prio 10 u32 match ip dst 10.0.2.0/24 flowid 1:10

# Default match if any of previous rules not applied to a slow rate 1:11. Superfluous like traffic goes to 1:11 by default?
tc filter add dev vmn0 parent 1: protocol ip prio 20 u32 match ip dst 0.0.0.0/0 flowid 1:11

从与网络设备“vmn0”关联且 IP 地址为“10.0.1.2”的虚拟机“vma”中,我运行了“iperf -s”。

我从不同主机和 IP 地址“10.0.2.2”上的虚拟机“vmb”运行“iperf -c 10.0.1.2”,结果如下:

[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  57.8 MBytes   485 Mbits/sec    0   1.84 MBytes       
[  4]   1.00-2.00   sec  56.2 MBytes   472 Mbits/sec    0   1.84 MBytes       
[  4]   2.00-3.00   sec  56.2 MBytes   472 Mbits/sec    0   1.84 MBytes       
[  4]   3.00-4.00   sec  55.0 MBytes   461 Mbits/sec    0   1.84 MBytes       
[  4]   4.00-5.00   sec  56.2 MBytes   472 Mbits/sec    0   1.84 MBytes       

看起来不错,“10.0.2.2”的速率限制为~500 Mbit,这是理所当然的。

现在,再次从不同主机上的虚拟机“vmc”和 IP 地址“192.168.1.2”:

[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  57.3 MBytes   481 Mbits/sec    0   1.21 MBytes       
[  4]   1.00-2.00   sec  56.4 MBytes   473 Mbits/sec    0   1.21 MBytes       
[  4]   2.00-3.00   sec  56.7 MBytes   476 Mbits/sec    0   1.21 MBytes       
[  4]   3.00-4.00   sec  56.7 MBytes   476 Mbits/sec    0   1.21 MBytes       
[  4]   4.00-5.00   sec  56.5 MBytes   474 Mbits/sec    0   1.21 MBytes  

这不是我所期望的,因为它应该得到~100 Mbit(默认类,以及与任何以前未匹配的匹配)。

有人能帮忙吗?

答案1

终于让它工作了。

这些行显示了我正在做的事情:

tc qdisc del dev vmn0 root
tc qdisc add dev vmn0 root handle 1: htb default 11 r2q 83
tc class add dev vmn0 parent 1: classid 1:1 htb rate 100000kbit ceil 100000kbit quantum 1500
tc class add dev vmn0 parent 1:1 classid 1:10 htb rate 1000kbit ceil 500000kbit
tc class add dev vmn0 parent 1:1 classid 1:11 htb rate 1000kbit ceil 100000kbit
tc filter add dev vmn0 parent 1: protocol ip prio 10 u32 match ip src 10.0.2.0/24 flowid 1:10

删除目标 10.0.1.0/24 上的过滤器后,流量开始受到速率限制。正如预期的那样,如果流量与过滤规则不匹配,则将进入默认类别(1:11,慢速类别)。

由于流量既执行发送又执行接收,因此流量始终在规则 10.0.1.0/24 上匹配,因此流量在那里进行分类并获得快速路径。

相关内容