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 eth0Einfache 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 rootEingehenden 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 ingressHTB (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 3Filter 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 10Netzwerk-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 normalPaketverlust 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 1mbitEntfernen
tc qdisc del dev eth0 root netemPer-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:10Subnetz 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:20Praktische 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:20Bandbreiten-Limitierung für Container
# Docker Container mit veth
tc qdisc add dev veth123abc root tbf rate 10mbit burst 32kbit latency 400msDownload-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 400msMonitoring
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 eth0Echtzeit-Monitoring
# Watch
watch -n 1 tc -s qdisc show dev eth0
# Mit iftop
iftop -i eth0Persistenz
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.targetScript
#!/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}"
;;
esacZusammenfassung
| 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.