Linux Traffic Control (tc): un ghid practic

12 min citire - 5 iunie 2026

hero section cover
Cuprins
  • Controlul traficului Linux (tc): un ghid practic
  • Cum funcționează tc
  • Configurarea tc pe un server Linux
  • Modelarea traficului de ieșire cu HTB
  • Modelarea traficului de intrare cu IFB
  • Prioritizarea traficului cu DSCP
  • Monitorizare și depanare
Distribuie

Controlați lățimea de bandă, prioritizați traficul și modelați intrarea și ieșirea pe Linux cu tc. Configurație de lucru HTB, IFB, DSCP și fq_codel pentru servere reale.

Controlul traficului Linux (tc): un ghid practic

Comanda tc vă oferă control direct asupra modului în care serverul dvs. gestionează traficul de rețea. Puteți limita lățimea de bandă pentru fiecare serviciu, menține sesiunile interactive precum SSH receptive atunci când transferurile în bloc cresc brusc și modela fluxurile de ieșire și de intrare dintr-un singur instrument. Acest ghid acoperă conceptele de bază, o configurare HTB funcțională, modelarea intrării cu IFB, prioritizarea bazată pe DSCP și modul de depanare atunci când ceva nu funcționează.


 

Cum funcționează tc

Fiecare tc configurare este alcătuită din patru componente mobile:

  • qdisc (disciplina de coadă). Programatorul atașat la o interfață de rețea. Acesta decide modul în care pachetele sunt puse în coadă și scoase din coadă.
  • Clasă. O subdiviziune în cadrul unui qdisc bazat pe clase. Gândiți-vă la aceasta ca la o bandă de circulație cu propria limită de viteză.
  • Filtru. Inspectează anteturile pachetelor (IP-uri, porturi, marcaje) și atribuie fiecărui pachet o clasă.
  • Acțiune. Ce se întâmplă cu un pachet odată ce se potrivește: redirecționare, eliminare, redirecționare.

Acestea formează o arbore. Pachetele intră la qdisc-ul rădăcină, trec prin filtre, sunt sortate în clase de un major:minor identificator și ajung în coada unui qdisc de nivel inferior pentru a fi transmise.

Pentru orice este mai complex decât potrivirea bazată pe port, marcați pachetele cu iptables sau nftables în tabelul mangle, apoi folosiți filtrul fw filtrul din tc pentru a clasifica după marcaj. Se scalează mult mai bine decât lanțurile de reguli brute u32 pentru fiecare tip de trafic.

Ieșire vs intrare

Direcția contează. Kernel-ul poate stoca în buffer și întârzia pachetele de ieșire, ceea ce permite o modelare reală. Pachetele de intrare au traversat deja rețeaua până în momentul în care le vedeți, așa că le puteți controla doar (renunțând la cele care depășesc un prag) dacă nu le redirecționați mai întâi către un dispozitiv IFB.

CaracteristicăIeșireIntrare
DirecțieIeșireIntrare
ModelareNativNecesită IFB
MonitorizareSuportatSuportat
Utilizare tipicăQoS, partajarea lățimii de bandă, ritmLimitarea ratei, atenuarea DDoS de bază

Qdisc-urile pe care le veți utiliza efectiv

  • HTB (Hierarchical Token Bucket). Cu clase. Utilizați-l când doriți o lățime de bandă minimă garantată per serviciu, cu posibilitatea de a împrumuta capacitate neutilizată de la alte clase.
  • TBF (Token Bucket Filter). Fără clase. Utilizați-l atunci când trebuie doar să limitați o întreagă interfață la o singură rată.
  • fq_codel (Fair Queuing Controlled Delay). Combină echitatea pe flux cu gestionarea activă a cozilor de așteptare pentru a elimina bufferbloat. Este qdisc-ul implicit în majoritatea distribuțiilor Linux începând cu systemd 217 și este livrat ca implicit pe RHEL 9. Atașați-l întotdeauna ca un qdisc frunză sub clasele HTB, altfel un singur flux lacom poate acapara o întreagă clasă.

Configurarea tc pe un server Linux

tc este livrat împreună cu pachetul iproute2. Pe Debian și Ubuntu, instalați-l cu apt-get install iproute2. Pe RHEL și derivatele sale, yum install iproute. Veți avea nevoie de drepturi de root sau sudo.

Obțineți mai întâi numele corect al interfeței. Denumirea greșită a interfeței este cel mai frecvent motiv pentru care o configurare nu produce niciun efect:

ip link show

Verificați ce se află deja pe interfață, inclusiv contoarele active:

tc -s qdisc show dev eth0

Ștergeți orice qdisc root existent înainte de a aplica o nouă configurație, pentru a evita RTNETLINK answers: File exists erorilor:

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

Dacă actualizați o regulă existentă în loc să începeți de la zero, utilizați replace în loc de add pentru o schimbare atomică.

Descărcarea hardware, cum ar fi TSO și GSO, grupează pachetele în moduri care interferează cu modelarea. Dezactivați-le pe interfața modelată:

sudo ethtool -K eth0 tso off gso off

Setați fq_codel ca qdisc implicit la nivel de sistem pentru interfețele noi:

sysctl -w net.core.default_qdisc=fq_codel

Pentru serverele aglomerate, combinați-l cu algoritmul de control al congestiei BBR (kernel 4.9+). BBR menține un debit ridicat fără a mări cozile:

sysctl -w net.ipv4.tcp_congestion_control=bbr

Un obicei de siguranță dacă configurați un dispozitiv la distanță prin SSH: deschideți o a doua sesiune și aveți tc qdisc del dev eth0 root gata de lipit. O regulă de filtrare greșită vă poate bloca accesul instantaneu.

Modelarea traficului de ieșire cu HTB

HTB vă permite să atribuiți fiecărui serviciu un minim garantat (rate) și o limită maximă (ceil). Lățimea de bandă neutilizată este alocată celor care au nevoie de ea, în ordinea priorităților. Iată o configurație funcțională pe trei niveluri pentru o legătură ascendentă de 1 Gbps.

Creați qdisc-ul HTB rădăcină. default 30 trimite orice pachet neclasificat către clasa 1:30 în loc să-l lase să ocolească regulile dvs.:

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

Limitați debitul total la 900 Mbps. Reglați întotdeauna ușor sub capacitatea reală a legăturii, altfel se formează o coadă pe un router sau modem din amonte pe care nu îl controlați:

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

Definiți nivelurile de serviciu. Valorile prio obțin prima dată lățimea de bandă neutilizată:

# 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

Atașați fq_codel ca qdisc de nivel inferior la fiecare clasă, astfel încât un singur flux să nu poată domina nivelul său:

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

Acum clasificați traficul. Pentru potrivirea simplă a porturilor, u32 este cel mai rapid:

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

Pentru orice lucru care ține cont de starea anterioară, marcați în iptables și potriviți marca cu 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

Modelarea traficului de intrare cu IFB

Nu puteți modela nativ traficul de intrare, deoarece, în momentul în care un pachet ajunge, acesta a utilizat deja lățimea de bandă. Soluția este redirecționarea traficului de intrare către o interfață virtuală Intermediate Functional Block (IFB), unde kernelul îl tratează ca trafic de ieșire și vă permite să aplicați qdisc-uri cu clase.

Încărcați modulul și activați interfața:

modprobe ifb numifbs=1
ip link set dev ifb0 up

Adăugați un qdisc de intrare la interfața fizică și redirecționați totul către 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

De aici, ifb0 se comportă ca orice altă interfață. Aplicați-i arborele HTB exact așa cum ați face-o pentru traficul de ieșire:

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

Prioritizarea traficului cu DSCP

DSCP (Differentiated Services Code Point) etichetează pachetele cu o valoare de 6 biți în octetul TOS, astfel încât tc filtrele să poată clasifica după etichetă, în loc să caute porturi în setul de reguli. Când potriviți DSCP în tc, deplasați valoarea la stânga cu 2 biți. DSCP EF (46) devine 0xb8. Masca 0xfc izolează cei 6 biți DSCP de cei 2 biți ECN.

O mapare implicită rezonabilă pentru sarcinile de lucru ale serverului:

Tipul de traficDSCPTOS hexExemple
InteractivEF0xb8SSH, DNS, VoIP
AfaceriAF410x88HTTP, HTTPS, API-uri
În blocCS10x20Copii de rezervă, FTP, actualizări de pachete
Efort maximCS00x00Tot restul

Etichetați pachetele de ieșire în iptables înainte ca acestea să ajungă la tc filtrele:

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

Apoi potriviți eticheta în tc și redirecționați-l către clasa HTB corespunzătoare:

# 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

Monitorizare și depanare

Cele trei comenzi pe care le veți folosi constant:

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

Urmăriți dropped și overlimits . Pachetele pierdute înseamnă că coada este saturată; depășirea limitelor înseamnă că ați atins plafonul clasei și kernelul a trebuit să întârzie sau să elimine traficul. Pentru o vizualizare în timp real:

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

Adăugați -d pentru parametrii interni (țintă, interval, cuantum) și -j pentru ieșire JSON dacă redirecționați către un stack de metrici. Combinați-l cu ss -tin pentru a vedea estimările RTT și retransmisiunile la nivelul stratului TCP.

Majoritatea eșecurilor se încadrează într-o listă scurtă:

SimptomCauză probabilăSoluție
RTNETLINK answers: File existsQdisc-ul root este deja configurattc qdisc del dev eth0 root primul
Regulile se aplică, dar traficul nu este limitatInterfață greșită sau TSO/GSO încă activatConfirmați cu ip link show, dezactivați descărcările cu ethtool -K
Filtrul nu se potrivește niciodatăSintaxă greșită a portului/IP-ului sau aliniere incorectă a măștiiAdăugați o acțiune de contracarare și verificați numărul de accesări în tc -s filter show
Regulile au dispărut după repornireConfigurația se află doar în memorieÎncadrați într-un script și apelați din systemd sau un dispecer NetworkManager
Latență ridicată la traficul prioritarFără qdisc de tip leaf sau burst prea micAtașați fq_codel la clasele leaf, ridicați burst

Dacă vreodată vă blocați din cauza unei configurări greșite, resetarea este simplă:

tc qdisc del dev eth0 root

tc nu puteți genera lățime de bandă pe care nu o aveți, dar pe o legătură ascendentă bine aprovizionată aceasta face diferența între o performanță previzibilă și un server care se prăbușește în momentul în care un utilizator începe un transfer de mari dimensiuni. Dacă aveți nevoie de lățimea de bandă brută și de libertatea de a o modela după cum doriți, aruncați o privire la serverele dedicate ale FDC.

Blog

În prim plan săptămâna aceasta

Mai multe articole
Linux Traffic Control (tc): un ghid practic

Linux Traffic Control (tc): un ghid practic

Controlați lățimea de bandă, prioritizați traficul și modelați intrarea și ieșirea pe Linux cu tc. Configurație de lucru HTB, IFB, DSCP și fq_codel pentru servere reale.

12 min citire - 5 iunie 2026

De ce este important să aveți un VPS puternic și nemeditat

7 min citire - 9 mai 2025

Mai multe articole
background image

Aveți întrebări sau aveți nevoie de o soluție personalizată?

icon

Opțiuni flexibile

icon

Acoperire globală

icon

Implementare instantanee

icon

Opțiuni flexibile

icon

Acoperire globală

icon

Implementare instantanee