Назад | Перейти на главную страницу

Ограничение пропускной способности для нескольких сетевых пунктов назначения с (медленным) совпадением по умолчанию с Linux TC

Я играю с функциями управления трафиком 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, поскольку оно выполняло и отправку, и прием, поэтому трафик классифицировался там и получал быстрый путь.