Я играю с функциями управления трафиком Linux, чтобы ограничить выходную полосу пропускания виртуальной машины KVM, и застрял при использовании фильтров для сопоставления мест назначения для быстрого класса и для медленного класса (по умолчанию) для данной виртуальной машины.
Физический сетевой выходной интерфейс - «eth0» (1 Гбит) и является частью связывающего устройства «bond0». «bond0» является частью «br0» на виртуальных сетевых картах виртуальных машин «vmn {0,1,2,3,4}».
Путь от сетевого пакета виртуальной машины к Интернету: eth0 (vm) -> vmn0 (host) -> br0 (host) -> bond0 (host) -> nic0 (host) -> Internet.
Я пытаюсь установить два класса:
Я пробовал на хосте следующий подход:
# 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
С виртуальной машины «vma» со связанным сетевым устройством «vmn0» и IP-адресом «10.0.1.2» я запустил «iperf -s».
С виртуальной машины «vmb» на другом хосте и IP-адресе «10.0.2.2» я запустил «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 Мбит, как и положено.
Теперь снова с виртуальной машины «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 Мбит (класс по умолчанию и соответствие для любого, не сопоставленного ранее).
Может кто-нибудь помочь с этим?
Наконец-то он заработал.
Эти строки показывают, что я делаю:
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
После удаления фильтра на dst 10.0.1.0/24 трафик начал ограничиваться по скорости. Как и ожидалось, если трафик не соответствует правилу фильтрации, он переходит в класс по умолчанию (1:11, медленный).
Трафик всегда соответствовал правилу 10.0.1.0/24, поскольку оно выполняло и отправку, и прием, поэтому трафик классифицировался там и получал быстрый путь.