tc (Traffic Control) ist das Linux-Tool für Bandbreiten-Management und QoS. Es ermöglicht Traffic Shaping, Rate Limiting und Priorisierung.

Grundlagen

Konzepte

| Begriff | Beschreibung | |---------|--------------| | qdisc | Queueing Discipline - Warteschlangen-Algorithmus | | class | Klasse für Traffic-Kategorisierung | | filter | Regeln zur Klassifizierung | | root | Wurzel der qdisc-Hierarchie |

Aktuelle Konfiguration

# Alle qdiscs anzeigen
tc qdisc show

# Für bestimmtes Interface
tc qdisc show dev eth0

# Mit Statistiken
tc -s qdisc show dev eth0

# Klassen anzeigen
tc class show dev eth0

# Filter anzeigen
tc filter show dev eth0

Einfache Rate Limiting

Ausgehenden Traffic limitieren

# 1 Mbit/s Limit (tbf = Token Bucket Filter)
tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms

# Entfernen
tc qdisc del dev eth0 root

Eingehenden Traffic limitieren

# Ingress qdisc
tc qdisc add dev eth0 handle ffff: ingress

# 10 Mbit/s Limit (alles über 10Mbit wird gedroppt)
tc filter add dev eth0 parent ffff: protocol ip prio 1 \
    u32 match ip src 0.0.0.0/0 \
    police rate 10mbit burst 100k drop flowid :1

# Entfernen
tc qdisc del dev eth0 ingress

HTB (Hierarchical Token Bucket)

Basis-Konfiguration

# Root qdisc erstellen
tc qdisc add dev eth0 root handle 1: htb default 30

# Root-Klasse (Gesamtbandbreite)
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit

# Unterklassen
# Hohe Priorität: 50 Mbit garantiert
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 50mbit ceil 100mbit prio 1

# Mittlere Priorität: 30 Mbit garantiert
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 30mbit ceil 100mbit prio 2

# Niedrige Priorität: 20 Mbit garantiert
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 20mbit ceil 100mbit prio 3

Filter hinzufügen

# SSH (Port 22) -> Hohe Priorität
tc filter add dev eth0 parent 1: protocol ip prio 1 \
    u32 match ip dport 22 0xffff flowid 1:10

# HTTP/HTTPS -> Mittlere Priorität
tc filter add dev eth0 parent 1: protocol ip prio 2 \
    u32 match ip dport 80 0xffff flowid 1:20
tc filter add dev eth0 parent 1: protocol ip prio 2 \
    u32 match ip dport 443 0xffff flowid 1:20

# Rest -> Niedrige Priorität (default 30)

SFQ (Stochastic Fairness Queueing)

# Faire Verteilung zwischen Flows
tc qdisc add dev eth0 root handle 1: htb default 10
tc class add dev eth0 parent 1: classid 1:10 htb rate 100mbit
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10

Netzwerk-Simulation

Latenz hinzufügen

# 100ms Delay
tc qdisc add dev eth0 root netem delay 100ms

# Mit Varianz
tc qdisc add dev eth0 root netem delay 100ms 20ms

# Mit Verteilung
tc qdisc add dev eth0 root netem delay 100ms 20ms distribution normal

Paketverlust simulieren

# 1% Paketverlust
tc qdisc add dev eth0 root netem loss 1%

# Mit Korrelation
tc qdisc add dev eth0 root netem loss 1% 25%

# Burst-Verlust
tc qdisc add dev eth0 root netem loss 1% 25% 0.1%

Kombiniert

# Schlechte Verbindung simulieren
tc qdisc add dev eth0 root netem delay 200ms 50ms loss 2% rate 1mbit

Entfernen

tc qdisc del dev eth0 root netem

Per-IP Limitierung

Einzelne IP limitieren

# Setup
tc qdisc add dev eth0 root handle 1: htb default 100
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit ceil 1mbit
tc class add dev eth0 parent 1:1 classid 1:100 htb rate 99mbit ceil 100mbit

# IP 192.168.1.100 auf 1 Mbit limitieren
tc filter add dev eth0 parent 1: protocol ip prio 1 \
    u32 match ip dst 192.168.1.100/32 flowid 1:10

Subnetz limitieren

# Subnetz 192.168.2.0/24 auf 10 Mbit
tc filter add dev eth0 parent 1: protocol ip prio 1 \
    u32 match ip dst 192.168.2.0/24 flowid 1:20

Praktische Beispiele

Webserver Traffic Shaping

#!/bin/bash
# web-traffic-shaping.sh

DEV=eth0
UPLINK=100mbit

# Reset
tc qdisc del dev $DEV root 2>/dev/null

# HTB Setup
tc qdisc add dev $DEV root handle 1: htb default 30

# Haupt-Klasse
tc class add dev $DEV parent 1: classid 1:1 htb rate $UPLINK ceil $UPLINK

# Klassen
tc class add dev $DEV parent 1:1 classid 1:10 htb rate 60mbit ceil 100mbit prio 1  # HTTP/HTTPS
tc class add dev $DEV parent 1:1 classid 1:20 htb rate 30mbit ceil 100mbit prio 2  # SSH
tc class add dev $DEV parent 1:1 classid 1:30 htb rate 10mbit ceil 50mbit prio 3   # Rest

# Filter
tc filter add dev $DEV parent 1: protocol ip prio 1 u32 match ip sport 80 0xffff flowid 1:10
tc filter add dev $DEV parent 1: protocol ip prio 1 u32 match ip sport 443 0xffff flowid 1:10
tc filter add dev $DEV parent 1: protocol ip prio 2 u32 match ip sport 22 0xffff flowid 1:20

Bandbreiten-Limitierung für Container

# Docker Container mit veth
tc qdisc add dev veth123abc root tbf rate 10mbit burst 32kbit latency 400ms

Download-Limitierung

# IFB (Intermediate Functional Block) für Ingress
modprobe ifb
ip link set dev ifb0 up

# Ingress umleiten
tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 \
    action mirred egress redirect dev ifb0

# Limit auf ifb0
tc qdisc add dev ifb0 root tbf rate 10mbit burst 32kbit latency 400ms

Monitoring

Statistiken

# qdisc Statistiken
tc -s qdisc show dev eth0

# Ausgabe:
# qdisc htb 1: root refcnt 2 r2q 10 default 30 direct_packets_stat 0
#  Sent 1234567890 bytes 12345678 pkt (dropped 123, overlimits 456 requeues 0)

# Klassen-Statistiken
tc -s class show dev eth0

# Filter-Statistiken
tc -s filter show dev eth0

Echtzeit-Monitoring

# Watch
watch -n 1 tc -s qdisc show dev eth0

# Mit iftop
iftop -i eth0

Persistenz

Systemd-Service

# /etc/systemd/system/tc-rules.service
[Unit]
Description=Traffic Control Rules
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/tc-rules.sh start
ExecStop=/usr/local/bin/tc-rules.sh stop

[Install]
WantedBy=multi-user.target

Script

#!/bin/bash
# /usr/local/bin/tc-rules.sh

case "$1" in
    start)
        # tc Regeln hier
        ;;
    stop)
        tc qdisc del dev eth0 root 2>/dev/null
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        ;;
esac

Zusammenfassung

| Befehl | Funktion | |--------|----------| | tc qdisc add | qdisc hinzufügen | | tc qdisc del | qdisc entfernen | | tc class add | Klasse hinzufügen | | tc filter add | Filter hinzufügen | | tc -s qdisc show | Statistiken |

| qdisc | Verwendung | |-------|------------| | tbf | Einfaches Rate Limiting | | htb | Hierarchisches Shaping | | sfq | Fair Queueing | | netem | Netzwerk-Simulation | | ingress | Eingehender Traffic |

| Option | Beschreibung | |--------|--------------| | rate | Garantierte Bandbreite | | ceil | Maximale Bandbreite | | burst | Burst-Größe | | prio | Priorität |

Fazit

tc ist mächtig für Traffic Control. HTB eignet sich für komplexe QoS-Setups. netem ist ideal für Netzwerk-Simulation. Die Syntax ist komplex, aber flexibel. Für einfache Limits sind iptables oder nftables manchmal ausreichend.