Limite de largura de banda para vários destinos de rede com uma correspondência padrão (lenta) com o Linux TC

1

Estou jogando com os recursos de controle de tráfego do Linux para restringir a largura de banda de saída do KVM VM e fico preso ao usar filtros para corresponder destinos para uma classe rápida e para uma classe lenta (padrão) para uma determinada VM.

A interface de saída de rede física é "eth0" (1 Gbit) e faz parte do dispositivo de ligação "bond0". "bond0" é parte de "br0" ao longo das placas de rede virtual de máquinas virtuais "vmn {0,1,2,3,4}".

O caminho de um pacote de rede VM para a Internet é: eth0 (vm) - > vmn0 (host) - > br0 (host) - > bond0 (host) - > nic0 (host) - > A Internet.

Estou tentando definir duas classes:

  • Rápido: saída de 500 Mbps para destinos 10.0.1.0/24 e 10.0.2.0/24
  • Lenta (padrão): 100 Mbps de saída para todos os outros destinos

Eu tentei a seguinte abordagem no host:

# 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

Da VM "vma" com dispositivo de rede "vmn0" associado e endereço IP "10.0.1.2" eu corri "iperf -s".

De uma VM "vmb" em um host e endereço IP diferentes "10.0.2.2" Eu executei "iperf -c 10.0.1.2" com os seguintes resultados:

[ 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       

Parece bom ", 10.0.2.2" é taxa limitada a ~ 500 Mbit como deveria.

Agora, a partir de uma VM "vmc" em um host diferente novamente e do endereço 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  

Isso não é o que eu esperava, pois ele deve ter ~ 100 Mbit (classe padrão e uma correspondência para qualquer não correspondido anteriormente).

Alguém pode ajudar com isso?

    
por vroman 07.12.2016 / 10:38

1 resposta

2

Finalmente consegui trabalhar.

Estas linhas mostram o que estou fazendo:

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

Depois de remover o filtro no dst 10.0.1.0/24, o tráfego começou a ter uma taxa limitada. Como esperado, se o tráfego não for correspondido pela regra de filtragem, ele será para a classe padrão (1:11, slow one).

O tráfego sempre foi correspondido na regra 10.0.1.0/24, pois ambos executavam envios e recebimentos, portanto, o tráfego foi classificado e recebeu o caminho rápido.

    
por 07.12.2016 / 13:25