Linux Traffic Control (tc): praktický průvodce

12 min čtení - 5. června 2026

hero section cover
Obsah
  • Linux Traffic Control (tc): praktický průvodce
  • Jak funguje tc
  • Nastavení tc na serveru Linux
  • Tvarování odchozího provozu pomocí HTB
  • Tvarování příchozího provozu pomocí IFB
  • Prioritizace provozu pomocí DSCP
  • Monitorování a řešení problémů
Sdílet

Řízení šířky pásma, upřednostňování provozu a formování vstupů a výstupů v systému Linux pomocí tc. Pracovní konfigurace HTB, IFB, DSCP a fq_codel pro skutečné servery.

Linux Traffic Control (tc): praktický průvodce

Příkaz tc vám dává přímou kontrolu nad tím, jak váš server zpracovává síťový provoz. Můžete omezit šířku pásma pro jednotlivé služby, zajistit odezvu interaktivních relací, jako je SSH, i při náhlém nárůstu hromadných přenosů a regulovat jak odchozí, tak příchozí toky pomocí jediného nástroje. Tato příručka pokrývá základní pojmy, funkční nastavení HTB, regulaci příchozího provozu pomocí IFB, prioritizaci založenou na DSCP a postupy ladění v případě poruchy.


 

Jak funguje tc

Každé tc konfigurace se skládá ze čtyř pohyblivých částí:

  • qdisc (queuing discipline). Plánovač připojený k síťovému rozhraní. Rozhoduje o tom, jak jsou pakety zařazovány do fronty a z ní odebírány.
  • Třída. Podskupina uvnitř qdisc s třídami. Představte si to jako jízdní pruh s vlastním rychlostním limitem.
  • Filter. Kontroluje hlavičky paketů (IP adresy, porty, značky) a přiřazuje každý paket do určité třídy.
  • Akce. Co se stane s paketem, jakmile splní podmínky: předání, zahození, přesměrování.

Tyto prvky tvoří strom. Pakety vstupují do kořenového qdisc, procházejí filtry, jsou roztříděny do tříd pomocí major:minor handle a nakonec jsou zařazeny do fronty na listovém qdiscu k přenosu.

Pro cokoli složitějšího než shodu na základě portu označte pakety pomocí iptables nebo nftables v tabulce mangle a poté použijte fw filtr v tc k třídění podle značky. Škáluje se to mnohem lépe než řetězení surových u32 pravidel pro každý typ provozu.

Odchozí vs. příchozí

Na směru záleží. Jádro může odchozí pakety ukládat do vyrovnávací paměti a zpožďovat, což umožňuje skutečné tvarování. Příchozí pakety již v okamžiku, kdy je vidíte, prošly sítí, takže je můžete pouze kontrolovat (zahozením nad prahovou hodnotou), pokud je nejprve nepřesměrujete na zařízení IFB.

FunkceOdchozíPříchozí
SměrOdchozíPříchozí
TvarováníNativníVyžaduje IFB
PolicingPodporovánoPodporováno
Typické použitíQoS, sdílení šířky pásma, regulaceOmezení rychlosti, základní ochrana proti DDoS

Qdiscy, které budete skutečně používat

  • HTB (Hierarchical Token Bucket). S třídami. Použijte jej, pokud chcete zaručenou minimální šířku pásma pro každou službu s možností vypůjčit si nevyužitou kapacitu od jiných tříd.
  • TBF (Token Bucket Filter). Bez tříd. Použijte jej, pokud potřebujete omezit celé rozhraní na jednu rychlost.
  • fq_codel (Fair Queuing Controlled Delay). Kombinuje spravedlnost pro každý tok s aktivní správou fronty, aby zabránil bufferbloatu. Od verze systemd 217 je to výchozí qdisc ve většině distribucí Linuxu a je dodáván jako výchozí v RHEL 9. Vždy jej připojujte jako listový qdisc pod třídami HTB, jinak může jediný nenasytný tok zabrat celou třídu.

Nastavení tc na serveru Linux

tc je dodáván s balíčkem iproute2. Na Debianu a Ubuntu jej nainstalujte pomocí apt-get install iproute2. Na RHEL a odvozených distribucích yum install iproute. Budete potřebovat práva root nebo sudo.

Nejprve zjistěte správný název rozhraní. Nesprávné pojmenování rozhraní je nejčastějším důvodem, proč konfigurace tiše nefunguje:

ip link show

Zkontrolujte, co se již na rozhraní nachází, včetně aktuálních počítadel:

tc -s qdisc show dev eth0

Před aplikací nové konfigurace vymažte všechny existující root qdisc, abyste se vyhnuli RTNETLINK answers: File exists chybám:

tc qdisc del dev eth0 root 2>/dev/null || true

Pokud aktualizujete existující pravidlo, místo abyste začínali od nuly, použijte replace místo add pro atomickou výměnu.

Hardwarové odlehčení, jako jsou TSO a GSO, sdružuje pakety způsobem, který narušuje tvarování. Vypněte je na tvarovaném rozhraní:

sudo ethtool -K eth0 tso off gso off

Nastavte fq_codel jako systémové výchozí qdisc pro nová rozhraní:

sysctl -w net.core.default_qdisc=fq_codel

U vytížených serverů jej spárujte s algoritmem řízení přetížení BBR (jádro 4.9+). BBR udržuje vysokou propustnost bez zvětšování front:

sysctl -w net.ipv4.tcp_congestion_control=bbr

Jeden bezpečnostní zvyk, pokud konfigurujete vzdálený počítač přes SSH: otevřete druhou relaci a mějte tc qdisc del dev eth0 root připravené k vložení. Špatné pravidlo filtru vás může okamžitě odříznout.

Tvarování odchozího provozu pomocí HTB

HTB vám umožňuje přiřadit každé službě garantované minimum (rate) a strop (ceil). Nevyužitá šířka pásma směřuje k tomu, kdo ji potřebuje, v pořadí podle priority. Zde je funkční tříúrovňové nastavení pro uplink 1 Gbps.

Vytvořte kořenový HTB qdisc. default 30 odešle jakýkoli neklasifikovaný paket do třídy 1:30 , místo aby jej nechal obejít vaše pravidla:

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

Omezte celkovou propustnost na 900 Mbps. Vždy tvarujte mírně pod skutečnou kapacitou linky, jinak se vytvoří fronta na upstreamovém routeru nebo modemu, který neovládáte:

tc class add dev eth0 parent 1: classid 1:1 htb rate 900mbit ceil 900mbit

Definujte úrovně služeb. Nižší prio hodnoty získají nevyužitou šířku pásma jako první:

# 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 3

Připojte fq_codel jako listový qdisc ke každé třídě, aby jeden tok nemohl dominovat své úrovni:

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_codel

Nyní klasifikujte provoz. Pro jednoduché porovnání portů u32 je nejrychlejší:

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
  match ip dport 443 0xffff flowid 1:10

Pro cokoli stavového označte v iptables a porovnejte značku s 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:20

Tvarování příchozího provozu pomocí IFB

Příchozí provoz nelze nativně tvarovat, protože v okamžiku, kdy paket dorazí, již využil vaši šířku pásma. Řešením je přesměrovat příchozí provoz na virtuální rozhraní Intermediate Functional Block (IFB), kde jej jádro považuje za odchozí a umožňuje vám použít qdiscy s třídami.

Načtěte modul a spusťte rozhraní:

modprobe ifb numifbs=1
ip link set dev ifb0 up

Přidejte qdisc pro příchozí provoz k fyzickému rozhraní a přesměrujte vše na 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 ifb0

Od tohoto okamžiku se ifb0 se chová jako jakékoli jiné rozhraní. Použijte na něj svůj strom HTB přesně tak, jak byste to udělali u odchozího provozu:

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 1

Prioritizace provozu pomocí DSCP

DSCP (Differentiated Services Code Point) označuje pakety 6bitovou hodnotou v bajtu TOS, takže vaše tc filtry mohou klasifikovat podle značky, místo aby prohledávaly porty v sadě pravidel. Při porovnávání DSCP v tc, posuňte hodnotu o 2 bity doleva. DSCP EF (46) se změní na 0xb8. Maska 0xfc odděluje 6 bitů DSCP od 2 bitů ECN.

Rozumné výchozí přiřazení pro pracovní zátěže serverů:

Typ provozuDSCPTOS hexPříklady
InteraktivníEF0xb8SSH, DNS, VoIP
ObchodníAF410x88HTTP, HTTPS, API
HromadnéCS10x20Zálohy, FTP, aktualizace balíčků
S maximálním úsilímCS00x00Vše ostatní

Označte odchozí pakety v iptables, než se dostanou k vašim tc filtry:

iptables -t mangle -A OUTPUT -p tcp --dport 22 -j DSCP --set-dscp 46

Poté porovnejte značku v tc a přesměrujte jej do správné třídy HTB:

# 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

Monitorování a řešení problémů

Tři příkazy, které budete neustále používat:

tc -s qdisc show dev eth0
tc -s class show dev eth0
tc -s filter show dev eth0

Sledujte dropped a overlimits . Ztracené pakety znamenají, že fronta je přetížená; překročení limitů znamená, že jste dosáhli stropu třídy a jádro muselo zpozdit nebo omezit provoz. Pro živý náhled:

watch -n 1 'tc -s class show dev eth0'

Přidejte -d pro interní parametry (target, interval, quantum) a -j pro výstup JSON, pokud data přesměrováváte do metrikového stacku. Spárujte to s ss -tin , abyste viděli odhady RTT a opakovaná vysílání na vrstvě TCP.

Většina selhání spadá do krátkého seznamu:

PříznakPravděpodobná příčinaŘešení
RTNETLINK answers: File existsRoot qdisc již nakonfigurovántc qdisc del dev eth0 root první
Pravidla platí, ale provoz není omezenNesprávné rozhraní nebo TSO/GSO stále zapnutoPotvrďte pomocí ip link show, deaktivujte offloady pomocí ethtool -K
Filtr se nikdy neshodujeŠpatná syntaxe portu/IP nebo zarovnání maskyPřidejte protireakci a zkontrolujte počet zásahů v tc -s filter show
Pravidla zmizela po restartuKonfigurace je uložena pouze v pamětiZabalte do skriptu a vyvolejte ze systemd nebo dispečera NetworkManager
Vysoká latence u prioritního provozuŽádný leaf qdisc nebo příliš nízký burstPřipojte fq_codel k třídám leaf, zvýšit burst

Pokud se někdy zablokujete kvůli nesprávné konfiguraci, reset je jednoduchý:

tc qdisc del dev eth0 root

tc nemůžete vytvořit šířku pásma, kterou nemáte, ale na dobře dimenzovaném uplinku to znamená rozdíl mezi předvídatelným výkonem a serverem, který se zhroutí v okamžiku, kdy jeden nájemce spustí velký přenos. Pokud potřebujete surovou šířku pásma a svobodu ji tvarovat, jak se vám zlíbí, podívejte se na dedikované servery FDC.

Blog

Tento týden byly představeny

Další články
Linux Traffic Control (tc): praktický průvodce

Linux Traffic Control (tc): praktický průvodce

Řízení šířky pásma, upřednostňování provozu a formování vstupů a výstupů v systému Linux pomocí tc. Pracovní konfigurace HTB, IFB, DSCP a fq_codel pro skutečné servery.

12 min čtení - 5. června 2026

Proč je důležité mít výkonný a neměřený VPS

7 min čtení - 9. května 2025

Další články
background image

Máte dotazy nebo potřebujete vlastní řešení?

icon

Flexibilní možnosti

icon

Globální dosah

icon

Okamžité nasazení

icon

Flexibilní možnosti

icon

Globální dosah

icon

Okamžité nasazení