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

Řízení šířky pásma, prioritizace provozu a tvarování příchozího a odchozího provozu v systému Linux pomocí nástroje tc. Funkční konfigurace HTB, IFB, DSCP a fq_codel pro skutečné servery.
Linux Traffic Control (tc): praktický průvodce
Příkaz tc vám umožňuje přímo řídit, jak váš server zpracovává síťový provoz. Můžete omezit šířku pásma pro jednotlivé služby, zajistit, aby interaktivní relace jako SSH zůstaly odezvu i při náhlém nárůstu hromadných přenosů, a pomocí jediného nástroje regulovat jak odchozí, tak příchozí datové toky. Tato příručka se zabývá základními pojmy, funkčním nastavením HTB, regulací příchozího provozu pomocí IFB, prioritizací na základě DSCP a tím, jak provádět ladění v případě, že něco nefunguje.
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 v rámci 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 identifikátoru a nakonec jsou zařazeny do fronty na listovém qdiscu k přenosu.
Pro cokoli složitějšího než porovnávání na základě portů 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í provozu. Příchozí pakety již v okamžiku, kdy je vidíte, prošly sítí, takže je můžete pouze regulovat (zahozením při překročení prahové hodnoty), 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 rychlosti | 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čit minimální šířku pásma pro každou službu s možností vypůjčit si nevyužitou kapacitu z jiných tříd.
- TBF (Token Bucket Filter). Beztřídní. Použijte jej, pokud potřebujete pouze omezit celé rozhraní na jednu rychlost.
- fq_codel (Fair Queuing Controlled Delay). Kombinuje spravedlivé rozdělení toku s aktivní správou front, čímž eliminuje bufferbloat. Od verze systemd 217 je to výchozí qdisc ve většině linuxových distribucí 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 linuxovém serveru
tc je součástí balíčku iproute2. V systémech Debian a Ubuntu jej nainstalujte příkazem apt-get install iproute2. V systémech RHEL a jejich derivátech yum install iproute. Budete potřebovat oprávnění 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 bez varování nefunguje:
ip link showZkontrolujte, co se již na rozhraní nachází, včetně aktuálních čítačů:
tc -s qdisc show dev eth0Před aplikací nové konfigurace odstraň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 stávají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 rozhraní, na kterém se provádí tvarování:
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 kombinujte s algoritmem řízení přetížení BBR (jádro 4.9+). BBR udržuje vysokou propustnost bez prodluž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í. Chybné pravidlo filtru vás může okamžitě odříznout.
Řízení odchozího provozu pomocí HTB
HTB vám umožňuje každé službě přiřadit garantované minimum (rate) a maximální limit (ceil). Nevyužitá šířka pásma se přiděluje tomu, kdo ji potřebuje, v pořadí podle priority. Zde je funkční tříúrovňové nastavení pro uplink o rychlosti 1 Gbps.
Vytvořte kořenový qdisc HTB. Ten 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 nastavujte tvarování mírně pod skutečnou kapacitou spojení, jinak se vytvoří fronta na upstreamovém routeru nebo modemu, který nemáte pod kontrolou:
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, co vyžaduje sledování stavu, označte v iptables a porovnejte označení 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ž spotřeboval vaši šířku pásma. Řešením je přesměrování příchozího provozu 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 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 provádět klasifikaci podle značky, místo aby prohledávaly porty v celé 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 serverové úlohy:
| 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ů |
| Podle možností | 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 nasměrujte je 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 počítadla. Ztracené pakety znamenají, že fronta je přetížená; překročení limitů znamená, že jste dosáhli stropu dané třídy a jádro muselo zpozdit nebo odhodit 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 v JSON, pokud data přesměrováváte do metrikového stacku. Spojte to s ss -tin pro zobrazení odhadů RTT a opakovaných přenosů na úrovni TCP.
Většina selhání spadá do následujícího krátkého seznamu:
| Příznak | Pravděpodobná příčina | Řešení |
|---|---|---|
RTNETLINK answers: File exists | Kořenový qdisc je již nakonfigurován | tc qdisc del dev eth0 root nejprve |
| Pravidla se uplatňují, ale provoz není omezen | Nesprávné rozhraní nebo je stále zapnuto TSO/GSO | Ověřte pomocí ip link show, deaktivujte offloady pomocí ethtool -K |
| Filtr se nikdy neshoduje | Chybná syntaxe portu/IP nebo nesprávné zarovnání masky | Přidejte protiopatření 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 | Chybí leaf qdisc nebo je burst příliš nízký | Připojte fq_codel k třídám leaf, zvýšit burst |
Pokud se někdy kvůli nesprávné konfiguraci zablokujete, 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.

Návod k programu iperf3: Testování rychlosti sítě v systémech Linux a Windows
Nainstalujte si iperf3, proveďte testy šířky pásma a vyladěte TCP buffery, abyste dosáhli přesných výsledků v systémech Linux a Windows. Zahrnuje testování UDP, obousměrné testy a testy 10GbE+.
10 min čtení - 7. května 2026
Optimalizované profily pro optimalizaci zatížení linuxových serverů
16 min čtení - 9. června 2026

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í