Linux Traffic Control (tc): ein praktischer Leitfaden
12 Min. Lesezeit - 5. Juni 2026

Bandbreitenkontrolle, Priorisierung des Datenverkehrs und Gestaltung der Ein- und Ausgänge unter Linux mit tc. Funktionierende HTB-, IFB-, DSCP- und fq_codel-Konfiguration für echte Server.
Linux Traffic Control (tc): Ein praktischer Leitfaden
Der Linux-Befehl tc Befehl gibt Ihnen direkte Kontrolle darüber, wie Ihr Server den Netzwerkverkehr handhabt. Sie können die Bandbreite pro Dienst begrenzen, interaktive Sitzungen wie SSH auch bei Spitzen bei Massendatenübertragungen reaktionsfähig halten und sowohl den ausgehenden als auch den eingehenden Datenfluss über ein einziges Tool steuern. Dieser Leitfaden behandelt die Kernkonzepte, eine funktionierende HTB-Konfiguration, Ingress Shaping mit IFB, DSCP-basierte Priorisierung und die Fehlerbehebung, wenn etwas nicht funktioniert.
So funktioniert tc
Jedes tc Konfiguration besteht aus vier beweglichen Teilen:
- qdisc (Queuing Discipline). Der an eine Netzwerkschnittstelle angehängte Scheduler. Er entscheidet, wie Pakete in die Warteschlange gestellt und aus ihr entfernt werden.
- Class. Eine Unterteilung innerhalb eines Classful-Qdisc. Stellen Sie sich dies als eine Fahrspur mit eigener Geschwindigkeitsbegrenzung vor.
- Filter. Überprüft Paket-Header (IPs, Ports, Markierungen) und ordnet jedes Paket einer Klasse zu.
- Action. Was mit einem Paket geschieht, sobald es den Kriterien entspricht: weiterleiten, verwerfen, umleiten.
Diese bilden einen Baum. Pakete treten am Root-qdisc ein, durchlaufen Filter, werden durch einen major:minor Handle in Klassen sortiert und landen schließlich in der Warteschlange eines Blatt-Qdiscs zur Übertragung.
Für alles, was komplexer ist als portbasierte Übereinstimmungen, markiere Pakete mit iptables oder nftables in der Mangle-Tabelle und verwende dann den fw Filter in tc , um nach Markierungen zu klassifizieren. Dies skaliert weitaus besser als das Verketten von rohen u32 Regeln für jeden Verkehrstyp.
Ausgang vs. Eingang
Die Richtung spielt eine Rolle. Der Kernel kann ausgehende Pakete zwischenspeichern und verzögern, was echtes Shaping ermöglicht. Eingehende Pakete haben die Leitung bereits passiert, wenn Sie sie sehen, sodass Sie sie nur kontrollieren können (ab einem Schwellenwert verwerfen), es sei denn, Sie leiten sie zuvor an ein IFB-Gerät um.
| Funktion | Ausgang | Ingress |
|---|---|---|
| Richtung | Ausgehend | Eingehend |
| Shaping | Nativ | Erfordert IFB |
| Policing | Unterstützt | Unterstützt |
| Typische Verwendung | QoS, Bandbreitenaufteilung, Pacing | Ratenbegrenzung, grundlegende DDoS-Abwehr |
Die qdiscs, die Sie tatsächlich verwenden werden
- HTB (Hierarchical Token Bucket). Klassenbasiert. Verwenden Sie diesen, wenn Sie eine garantierte Mindestbandbreite pro Dienst wünschen und gleichzeitig die Möglichkeit haben möchten, ungenutzte Kapazität von anderen Klassen auszuleihen.
- TBF (Token Bucket Filter). Klassenlos. Verwenden Sie es, wenn Sie lediglich eine gesamte Schnittstelle auf eine einzige Rate begrenzen müssen.
- fq_codel (Fair Queuing Controlled Delay). Kombiniert Fairness pro Datenfluss mit aktivem Warteschlangenmanagement, um Bufferbloat zu verhindern. Es ist seit systemd 217 der Standard-Qdisc in den meisten Linux-Distributionen und wird standardmäßig mit RHEL 9 ausgeliefert. Fügen Sie es immer als Leaf-Qdisc unter HTB-Klassen ein, da sonst ein einzelner ressourcenhungriger Datenfluss eine ganze Klasse beanspruchen kann.
Einrichtung von tc auf einem Linux-Server
tc wird mit dem iproute2-Paket ausgeliefert. Unter Debian und Ubuntu installieren Sie es mit apt-get install iproute2. Unter RHEL und Derivaten yum install iproute. Sie benötigen Root-Rechte oder sudo.
Ermitteln Sie zunächst den korrekten Schnittstellennamen. Eine falsche Benennung der Schnittstelle ist der häufigste Grund dafür, dass eine Konfiguration stillschweigend keine Wirkung zeigt:
ip link showÜberprüfen Sie, was sich bereits auf der Schnittstelle befindet, einschließlich der Live-Zähler:
tc -s qdisc show dev eth0Löschen Sie alle vorhandenen Root-Qdiscs, bevor Sie eine neue Konfiguration anwenden, um RTNETLINK answers: File exists Fehler zu vermeiden:
tc qdisc del dev eth0 root 2>/dev/null || trueWenn Sie eine bestehende Regel aktualisieren, anstatt ganz von vorne zu beginnen, verwenden Sie replace anstelle von add für einen atomaren Austausch.
Hardware-Offloading wie TSO und GSO bündelt Pakete auf eine Weise, die das Shaping beeinträchtigt. Deaktivieren Sie diese auf der geshapteten Schnittstelle:
sudo ethtool -K eth0 tso off gso offSetzen Sie fq_codel als systemweite Standard-qdisc für neue Schnittstellen fest:
sysctl -w net.core.default_qdisc=fq_codelKombinieren Sie dies bei stark ausgelasteten Servern mit dem BBR-Überlastungskontrollalgorithmus (Kernel 4.9+). BBR hält den Durchsatz hoch, ohne dass die Warteschlangen wachsen:
sysctl -w net.ipv4.tcp_congestion_control=bbrEine Sicherheitsmaßnahme, wenn Sie einen Remote-Rechner über SSH konfigurieren: Öffnen Sie eine zweite Sitzung und halten Sie tc qdisc del dev eth0 root bereits zum Einfügen bereit. Eine fehlerhafte Filterregel kann Sie sofort aussperren.
Gestaltung des ausgehenden Datenverkehrs mit HTB
Mit HTB können Sie jedem Dienst ein garantiertes Minimum (rate) und eine Obergrenze (ceil). Ungenutzte Bandbreite fließt an denjenigen, der sie benötigt, in der Reihenfolge der Priorität. Hier ist eine funktionierende dreistufige Konfiguration für einen 1-Gbit/s-Uplink.
Erstellen Sie den Root-HTB-Qdisc. Der default 30 sendet jedes nicht klassifizierte Paket an die Klasse 1:30 , anstatt es Ihre Regeln umgehen zu lassen:
tc qdisc add dev eth0 root handle 1: htb default 30Begrenzen Sie den Gesamtdurchsatz auf 900 Mbit/s. Shapen Sie immer etwas unterhalb der tatsächlichen Verbindungskapazität, da sich sonst eine Warteschlange auf einem Upstream-Router oder Modem bildet, das Sie nicht kontrollieren:
tc class add dev eth0 parent 1: classid 1:1 htb rate 900mbit ceil 900mbitDefinieren Sie die Service-Stufen. Niedrigere prio Werte erhalten zuerst die ungenutzte Bandbreite:
# High priority: web and API traffic
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 500mbit ceil 900mbit prio 1
# Medium priority: database replication
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 300mbit ceil 900mbit prio 2
# Low priority: bulk and backup traffic
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 100mbit ceil 900mbit prio 3Fügen Sie fq_codel als Leaf-Qdisc an jede Klasse an, damit ein einzelner Datenfluss seine Stufe nicht dominieren kann:
tc qdisc add dev eth0 parent 1:10 handle 10: fq_codel
tc qdisc add dev eth0 parent 1:20 handle 20: fq_codel
tc qdisc add dev eth0 parent 1:30 handle 30: fq_codelKlassifizieren Sie nun den Datenverkehr. Für einfaches Port-Matching u32 ist am schnellsten:
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
match ip dport 443 0xffff flowid 1:10Für alles, was zustandsbehaftet ist, markieren Sie in iptables und gleichen Sie die Markierung mit fw:
iptables -t mangle -A OUTPUT -p tcp --dport 5432 -j MARK --set-mark 2
tc filter add dev eth0 protocol ip parent 1:0 prio 2 handle 2 fw flowid 1:20Shaping des eingehenden Datenverkehrs mit IFB
Sie können eingehenden Datenverkehr nicht nativ gestalten, da ein Paket zum Zeitpunkt seines Eintreffens bereits Ihre Bandbreite beansprucht hat. Die Lösung besteht darin, den eingehenden Datenverkehr auf eine virtuelle Schnittstelle des Intermediate Functional Block (IFB) umzuleiten, wo der Kernel ihn als ausgehenden Datenverkehr behandelt und Ihnen die Anwendung von Classful-Qdiscs ermöglicht.
Laden Sie das Modul und aktivieren Sie die Schnittstelle:
modprobe ifb numifbs=1
ip link set dev ifb0 upFügen Sie der physischen Schnittstelle einen Ingress-Qdisc hinzu und leiten Sie alles um an ifb0:
tc qdisc add dev eth0 ingress handle ffff:
tc filter add dev eth0 parent ffff: protocol all u32 \
match u32 0 0 action mirred egress redirect dev ifb0Von hier an ifb0 verhält sich wie jede andere Schnittstelle. Wenden Sie Ihren HTB-Baum darauf genau so an, wie Sie es beim ausgehenden Datenverkehr tun würden:
tc qdisc add dev ifb0 root handle 1: htb default 30
tc class add dev ifb0 parent 1: classid 1:1 htb rate 900mbit ceil 900mbit
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 500mbit ceil 900mbit prio 1Priorisierung des Datenverkehrs mit DSCP
DSCP (Differentiated Services Code Point) kennzeichnet Pakete mit einem 6-Bit-Wert im TOS-Byte, sodass Ihre tc Filter nach Tags klassifizieren können, anstatt Ports im Regelsatz abzugleichen. Beim Abgleich von DSCP in tc, verschieben Sie den Wert um 2 Bits nach links. Aus DSCP EF (46) wird 0xb8. Die Maske 0xfc trennt die 6 DSCP-Bits von den 2 ECN-Bits.
Eine sinnvolle Standardzuordnung für Server-Workloads:
| Verkehrstyp | DSCP | TOS-Hex | Beispiele |
|---|---|---|---|
| Interaktiv | EF | 0xb8 | SSH, DNS, VoIP |
| Business | AF41 | 0x88 | HTTP, HTTPS, APIs |
| Massen | CS1 | 0x20 | Backups, FTP, Paket-Updates |
| Best-Effort | CS0 | 0x00 | Alles andere |
Markiere ausgehende Pakete in iptables, bevor sie deine tc Filter gelangen:
iptables -t mangle -A OUTPUT -p tcp --dport 22 -j DSCP --set-dscp 46Ordnen Sie dann das Tag in tc und leiten Sie es an die richtige HTB-Klasse weiter:
# EF (SSH, VoIP) goes to the high-priority class
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
match ip tos 0xb8 0xfc flowid 1:10
# AF41 (web traffic) goes to the medium class
tc filter add dev eth0 protocol ip parent 1:0 prio 2 u32 \
match ip tos 0x88 0xfc flowid 1:20
# CS1 (bulk) goes to the low-priority class
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 \
match ip tos 0x20 0xfc flowid 1:30Überwachung und Fehlerbehebung
Die drei Befehle, die Sie ständig verwenden werden:
tc -s qdisc show dev eth0
tc -s class show dev eth0
tc -s filter show dev eth0Beobachten Sie die dropped und overlimits Zähler. Verlorene Pakete bedeuten, dass die Warteschlange überlastet ist; Überschreitungen bedeuten, dass Sie eine Klassenobergrenze erreicht haben und der Kernel den Datenverkehr verzögern oder abwerfen musste. Für eine Live-Ansicht:
watch -n 1 'tc -s class show dev eth0'Fügen Sie -d für interne Parameter (Ziel, Intervall, Quanten) und -j für JSON-Ausgabe, wenn Sie die Daten in einen Metrik-Stack leiten. Kombinieren Sie dies mit ss -tin , um RTT-Schätzungen und Neuübertragungen auf der TCP-Ebene anzuzeigen.
Die meisten Fehler lassen sich in eine kurze Liste einordnen:
| Symptom | Mögliche Ursache | Behebung |
|---|---|---|
RTNETLINK answers: File exists | Root-qdisc bereits konfiguriert | tc qdisc del dev eth0 root zuerst |
| Regeln gelten, aber der Datenverkehr wird nicht begrenzt | Falsche Schnittstelle oder TSO/GSO noch aktiviert | Überprüfen mit ip link show, deaktivieren Sie Offloads mit ethtool -K |
| Filter passt nie | Falsche Port-/IP-Syntax oder Mask-Ausrichtung | Fügen Sie eine Gegenmaßnahme hinzu und überprüfen Sie die Trefferanzahl in tc -s filter show |
| Regeln verschwinden nach dem Neustart | Konfiguration befindet sich nur im Speicher | In ein Skript einbinden und über systemd oder einen NetworkManager-Dispatcher aufrufen |
| Hohe Latenz bei vorrangigem Datenverkehr | Kein Leaf-Qdisc oder zu niedrige Burst-Rate | An fq_codel an Leaf-Klassen an, erhöhen burst |
Sollten Sie sich jemals durch eine Fehlkonfiguration aussperren, ist das Zurücksetzen einfach:
tc qdisc del dev eth0 roottc Man kann keine Bandbreite erzeugen, die man nicht hat, aber bei einem gut dimensionierten Uplink macht dies den Unterschied zwischen vorhersehbarer Leistung und einem Server aus, der zusammenbricht, sobald ein Mandant eine große Übertragung startet. Wenn Sie die reine Bandbreite und die Freiheit benötigen, diese nach Belieben zu gestalten, werfen Sie einen Blick auf die dedizierten Server von FDC.

Linux Traffic Control (tc): ein praktischer Leitfaden
Bandbreitenkontrolle, Priorisierung des Datenverkehrs und Gestaltung der Ein- und Ausgänge unter Linux mit tc. Funktionierende HTB-, IFB-, DSCP- und fq_codel-Konfiguration für echte Server.
12 Min. Lesezeit - 5. Juni 2026
Warum es wichtig ist, einen leistungsstarken und ungemessenen VPS zu haben
7 Min. Lesezeit - 9. Mai 2025

Haben Sie Fragen oder benötigen Sie eine individuelle Lösung?
Flexible Optionen
Globale Reichweite
Sofortige Bereitstellung
Flexible Optionen
Globale Reichweite
Sofortige Bereitstellung