Linux Traffic Control (tc): un ghid practic
12 min citire - 5 iunie 2026

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șire | Intrare |
|---|---|---|
| Direcție | Ieșire | Intrare |
| Modelare | Nativ | Necesită IFB |
| Monitorizare | Suportat | Suportat |
| Utilizare tipică | QoS, partajarea lățimii de bandă, ritm | Limitarea 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 showVerificaț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 || trueDacă 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 offSetați fq_codel ca qdisc implicit la nivel de sistem pentru interfețele noi:
sysctl -w net.core.default_qdisc=fq_codelPentru 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=bbrUn 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 30Limitaț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 900mbitDefiniț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 3Ataș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_codelAcum 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:10Pentru 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:20Modelarea 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 upAdă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 ifb0De 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 1Prioritizarea 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 trafic | DSCP | TOS hex | Exemple |
|---|---|---|---|
| Interactiv | EF | 0xb8 | SSH, DNS, VoIP |
| Afaceri | AF41 | 0x88 | HTTP, HTTPS, API-uri |
| În bloc | CS1 | 0x20 | Copii de rezervă, FTP, actualizări de pachete |
| Efort maxim | CS0 | 0x00 | Tot 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 46Apoi 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:30Monitorizare ș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 eth0Urmă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ă:
| Simptom | Cauză probabilă | Soluție |
|---|---|---|
RTNETLINK answers: File exists | Qdisc-ul root este deja configurat | tc qdisc del dev eth0 root primul |
| Regulile se aplică, dar traficul nu este limitat | Interfață greșită sau TSO/GSO încă activat | Confirmaț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ăștii | Adă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ă repornire | Configurația se află doar în memorie | Încadrați într-un script și apelați din systemd sau un dispecer NetworkManager |
| Latență ridicată la traficul prioritar | Fără qdisc de tip leaf sau burst prea mic | Ataș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 roottc 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.

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

Aveți întrebări sau aveți nevoie de o soluție personalizată?
Opțiuni flexibile
Acoperire globală
Implementare instantanee
Opțiuni flexibile
Acoperire globală
Implementare instantanee