Linux Traffic Control (tc): praktický průvodce
12 min čtení - 5. června 2026

Ří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.
| Funkce | Odchozí | Příchozí |
|---|---|---|
| Směr | Odchozí | Příchozí |
| Tvarování | Nativní | Vyžaduje IFB |
| Policing | Podporováno | Podporováno |
| Typické použití | QoS, sdílení šířky pásma, regulace | Omezení 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 showZkontrolujte, co se již na rozhraní nachází, včetně aktuálních počítadel:
tc -s qdisc show dev eth0Př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 || truePokud 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 offNastavte fq_codel jako systémové výchozí qdisc pro nová rozhraní:
sysctl -w net.core.default_qdisc=fq_codelU 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=bbrJeden 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 30Omezte 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 900mbitDefinujte ú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 3Př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_codelNyní 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:10Pro 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:20Tvarová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 upPř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 ifb0Od 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 1Prioritizace 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 provozu | DSCP | TOS hex | Příklady |
|---|---|---|---|
| Interaktivní | EF | 0xb8 | SSH, DNS, VoIP |
| Obchodní | AF41 | 0x88 | HTTP, HTTPS, API |
| Hromadné | CS1 | 0x20 | Zálohy, FTP, aktualizace balíčků |
| S maximálním úsilím | CS0 | 0x00 | Vš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 46Poté 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:30Monitorová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 eth0Sledujte 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říznak | Pravděpodobná příčina | Řešení |
|---|---|---|
RTNETLINK answers: File exists | Root qdisc již nakonfigurován | tc qdisc del dev eth0 root první |
| Pravidla platí, ale provoz není omezen | Nesprávné rozhraní nebo TSO/GSO stále zapnuto | Potvrďte pomocí ip link show, deaktivujte offloady pomocí ethtool -K |
| Filtr se nikdy neshoduje | Špatná syntaxe portu/IP nebo zarovnání masky | Přidejte protireakci a zkontrolujte počet zásahů v tc -s filter show |
| Pravidla zmizela po restartu | Konfigurace je uložena pouze v paměti | Zabalte do skriptu a vyvolejte ze systemd nebo dispečera NetworkManager |
| Vysoká latence u prioritního provozu | Žádný leaf qdisc nebo příliš nízký burst | Př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 roottc 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.

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

Máte dotazy nebo potřebujete vlastní řešení?
Flexibilní možnosti
Globální dosah
Okamžité nasazení
Flexibilní možnosti
Globální dosah
Okamžité nasazení