21.2. Linux QoS mit ”tc”

Linux benutzt ”tc” vom Paket ”iproute2”, um das Bandbreitenmanagement zu konfigurieren, allgemein beschrieben in Linux Advanced Routing & Traffic Control HOWTO.

21.2.1. Beispiel für eine Warteschlange mit konstanter Bitrate

Mit dem ”cbq” Planer können Röhren mit konstanter Bitrate definiert werden.

21.2.1.1. Root qdisc Definition

Definition einer root qdisc mit einer Bandbreite von 1000 MBit/s an eth1

# tc qdisc add dev eth1 root handle 1: cbq avpkt 1000 bandwidth 1000Mbit

21.2.1.2. QoS class Definition

Definition einer Klasse 1:1 mit 1 MBit/s

# tc class add dev eth1 parent 1: classid 1:1 cbq rate   1Mbit allot 1500 bounded 

Definition einer Klasse 1:2 mit 50 MBit/s

# tc class add dev eth1 parent 1: classid 1:2 cbq rate  50Mbit allot 1500 bounded

Definition einer Klasse 1:3 mit 10 MBit/s

# tc class add dev eth1 parent 1: classid 1:3 cbq rate  10Mbit allot 1500 bounded

Definition einer Klasse 1:4 mit 200 kBit/s

# tc class add dev eth1 parent 1: classid 1:4 cbq rate 200kbit allot 1500 bounded

21.2.1.3. QoS filter Definition

Definition eines Filters für IPv4 (protocol ip), TCP (match ip protocol 6 0xff) Zielport 5001 (match ip dport 5001 0xffff) unter Benutzung der Klasse 1:2 von oben

# tc filter add dev eth1 parent 1: protocol ip   u32 match ip  protocol 6 0xff match ip dport 5001 0xffff flowid 1:1

Definition eines Filters für IPv6 (protocol ip), TCP (match ip6 protocol 6 0xff) Zielport 5001 unter der Benutzung der Klasse 1:2 von oben

# tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 protocol 6 0xff match ip6 dport 5001 0xffff flowid 1:2

Definition eines Filters für IPv6 für Pakete mit Flowlabel 12345 (match ip6 flowlabel 0x12345 0x3ffff) unter der Benutzung der Klasse 1:3 von oben

# tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 flowlabel 12345 0x3ffff flowid 1:3 

Definition eines Filters für IPv6 für Pakete mit der Linux iptables Markierung 32 (handle 32 fw) unter der Benutzung der Klasse 1:4 von oben

# tc filter add dev eth1 parent 1: protocol ipv6 handle 32 fw flowid 1:4

Die letzte Filterdefinition benötigt auch einen Eintrag in ip6tables um das Paket zu markieren

# ip6tables -A POSTROUTING -t mangle -p tcp --dport 5003 -j MARK --set-mark 32 

21.2.1.4. Testen der Filterdefinition mit iperf

Starten auf Serverseite in separaten Konsolen:

# iperf -V -s -p 5001
# iperf -V -s -p 5002
# iperf -V -s -p 5003

Starten auf Clientseite und Vergleichen der Ergebnisse:

# iperf -V -c SERVER-IPv4 -p 5001    (erwartet:      1 MBit/s)
# iperf -V -c SERVER-IPv6 -p 5001    (erwartet:     50 MBit/s)
# iperf -V -c SERVER-IPv4 -p 5002    (erwartet:  >> 50 MBit/s && <= 1000 MBit/s)
# iperf -V -c SERVER-IPv6 -p 5002    (erwartet:  >> 50 MBit/s && <= 1000 MBit/s)
# iperf -V -c SERVER-IPv4 -p 5003    (erwartet:  >> 50 MBit/s && <= 1000 MBit/s)
# iperf -V -c SERVER-IPv6 -p 5003    (erwartet:    200 kBit/s)

Das Ergebnis der Transferraten sollten der Definitionen von oben entsprechen, das Ergebnis auf Port 5002 sollte ziemlich identisch unabhängig von der benutzten IP-Version sein.