我正在使用 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 上匹配,因此流量在那里进行分类并获得快速路径。