Linux Traffic Control (tc): praktiline juhend

12 min lugemine - 5. juuni 2026

hero section cover
Sisukord
  • Linuxi liikluse juhtimine (tc): praktiline juhend
  • Kuidas tc töötab
  • Tc seadistamine Linuxi serveris
  • Väljamineva liikluse kujundamine HTB abil
  • Sissetuleva liikluse kujundamine IFB abil
  • Liikluse prioriseerimine DSCP abil
  • Jälgimine ja veaotsing
Jaga

Kontrollige ribalaiust, seadke liiklus prioriteediks ja kujundage sisse- ja väljaminekuid Linuxis koos tc-ga. Töötav HTB, IFB, DSCP ja fq_codel konfigureerimine reaalsete serverite jaoks.

Linuxi liikluse juhtimine (tc): praktiline juhend

Linuxi tc käsu abil saate otseselt kontrollida, kuidas teie server võrguliiklust haldab. Saate piirata ribalaiust teenuse kaupa, hoida interaktiivseid sessioone nagu SSH reageerivana, kui massülekanded tõusevad, ning kujundada nii väljaminevaid kui sissetulevaid vooge ühe tööriista abil. Käesolev juhend hõlmab põhimõisteid, töötavat HTB seadistust, sissetuleva liikluse kujundamist IFB abil, DSCP-põhist prioriteerimist ning seda, kuidas seda siluda, kui midagi ei tööta.


 

Kuidas tc töötab

Iga tc seadistus koosneb neljast liikuvast osast:

  • qdisc (järjekorra distsipliin). Võrguliidesega seotud ajastaja. See otsustab, kuidas pakette järjekorda lisatakse ja sealt eemaldatakse.
  • Klass. Alajaotus klassipõhises qdisc-is. Mõelge sellele kui sõidurajale, millel on oma kiiruspiirang.
  • Filter. Kontrollib paketi päiseid (IP-aadresse, porte, märgistusi) ja määrab iga paketi klassi.
  • Action. Mis juhtub paketiga, kui see vastab tingimustele: edastamine, kõrvaldamine, ümbersuunamine.

Need moodustavad puu. Paketid sisenevad juur-qdisc-i, läbivad filtrid, sorteeritakse klassidesse major:minor käepideme järgi klassidesse ja jõuavad edastamiseks lehe-qdisci järjekorda.

Kõikide portipõhisest vastavusest keerulisemate juhtude puhul märgistage paketid iptables või nftables abil mangle-tabelis, seejärel kasutage fw filtrit tc märgi järgi klassifitseerimiseks. See skaleerub palju paremini kui toore u32 reeglite ahelat iga liiklustüübi jaoks.

Väljaminev vs sissetulev

Suund on oluline. Tuum võib väljaminevaid pakette puhverdada ja viivitada, mis võimaldabki tõelist kujundamist. Sissetulevad paketid on juba võrgu läbinud, kui te neid näete, seega saate neid ainult kontrollida (kõrvalda üle künnise), kui te neid esmalt IFB-seadmesse ümber ei suuna.

FunktsioonVäljaminevSissetulev
SuundVäljaminevSissetulev
KujundaminePõhineNõuab IFB-d
JärelevalveToetatudToetatud
Tüüpiline kasutusQoS, ribalaiuse jagamine, kiiruse reguleerimineKiiruse piiramine, põhiline DDoS-rünnakute leevendamine

Qdiscid, mida tegelikult kasutate

  • HTB (Hierarchical Token Bucket). Klassipõhine. Kasutage seda, kui soovite garanteeritud minimaalse ribalaiuse teenuse kohta koos võimalusega laenata kasutamata võimsust teistest klassidest.
  • TBF (Token Bucket Filter). Klassivaba. Kasutage seda, kui soovite piirata kogu liidese ühe kiirusega.
  • fq_codel (Fair Queuing Controlled Delay). Ühendab vooõigluse aktiivse järjekorrahaldusega, et vältida puhvri ületäitumist. See on olnud vaikimisi qdisc enamikus Linuxi distributsioonides alates systemd 217-st ja on vaikimisi kaasas RHEL 9-s. Kinnitage see alati lehe-qdisc-ina HTB-klasside alla, vastasel juhul võib üks ahne voog hõivata kogu klassi.

Tc seadistamine Linuxi serveris

tc tuleb koos iproute2 paketiga. Debianis ja Ubuntus installige see käsuga apt-get install iproute2. RHEL-is ja selle derivaatides yum install iproute. Vajate root-õigusi või sudo-õigusi.

Leidke esmalt õige liidese nimi. Liidese vale nimetamine on kõige tavalisem põhjus, miks konfiguratsioon vaikimisi midagi ei tee:

ip link show

Kontrollige, mis liidesel juba on, sealhulgas reaalajas loendurid:

tc -s qdisc show dev eth0

Kustutage kõik olemasolevad root qdisc-id enne uue konfiguratsiooni rakendamist, et vältida RTNETLINK answers: File exists vigu:

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

Kui te uuendate olemasolevat reeglit, mitte ei alusta nullist, kasutage replace asemel add atomaarse vahetuse jaoks.

Riistvaraline koormuse ülekandmine, nagu TSO ja GSO, pakettide koondamine viisil, mis segab kujundamist. Lülitage need kujundatud liidesel välja:

sudo ethtool -K eth0 tso off gso off

Määrake fq_codel uute liideste süsteemiülese vaikimisi qdisc-iks:

sysctl -w net.core.default_qdisc=fq_codel

Hõivatud serverite puhul kombineerige seda BBR-i ülekoormuse kontrolli algoritmiga (kernel 4.9+). BBR hoiab läbilaskevõime kõrgena ilma järjekordi suurendamata:

sysctl -w net.ipv4.tcp_congestion_control=bbr

Üks ohutusharjumus, kui konfigureerite kaugseadet SSH kaudu: avage teine sessioon ja hoidke tc qdisc del dev eth0 root valmis kleepimiseks. Vale filtrireegel võib teid koheselt välja lukustada.

Väljamineva liikluse kujundamine HTB abil

HTB võimaldab määrata igale teenusele garanteeritud miinimumi (rate) ja ülempiiri (ceil). Kasutamata ribalaius suunatakse sellele, kes seda vajab, prioriteetsuse järjekorras. Siin on toimiv kolmeastmeline seadistus 1 Gbps üleslingile.

Looge juur-HTB qdisc. default 30 saadab kõik klassifitseerimata paketid klassi 1:30 , selle asemel et lasta sellel teie reegleid mööda minna:

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

Piirata koguvõimsust 900 Mbps-ni. Kujundage alati veidi alla tegeliku ühenduse võimsuse, vastasel juhul moodustub järjekord ülesvoolu ruuteris või modemis, mida te ei kontrolli:

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

Määrake teenuse tasemed. Madalamad prio väärtused saavad kasutamata ribalaiuse esimesena:

# 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

Lisage fq_codel iga klassi lehe-qdisc-ina, nii et üks voog ei saaks oma taset domineerida:

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

Nüüd liigita liiklus. Lihtsa pordi sobitamise puhul u32 on kiireim:

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

Kõigi seisundipõhiste juhtumite puhul märgista iptablesis ja sobi märge kokku 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

Sissetuleva liikluse kujundamine IFB abil

Sissetulevat liiklust ei saa algselt kujundada, sest kui pakett saabub, on see juba teie ribalaiust kasutanud. Lahenduseks on suunata sissetulev liiklus Intermediate Functional Block (IFB) virtuaalse liidese poole, kus tuum käsitleb seda väljaminevana ja võimaldab teil rakendada klassipõhiseid qdisc-e.

Laadige moodul ja käivitage liides:

modprobe ifb numifbs=1
ip link set dev ifb0 up

Lisage füüsilisele liidesele sissetuleva liikluse qdisc ja suunake kõik ümber 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

Siit alates ifb0 käitub see nagu iga teine liides. Rakendage sellele oma HTB-puu täpselt nii, nagu teeksite väljamineva liikluse puhul:

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

Liikluse prioriseerimine DSCP abil

DSCP (Differentiated Services Code Point) märgistab pakette 6-bitise väärtusega TOS-baitis, nii et teie tc filtrid saaksid klassifitseerida märgise järgi, selle asemel et otsida reeglistikus porte. Kui sobitate DSCP-d tc, nihutage väärtust 2 bitti vasakule. DSCP EF (46) muutub 0xb8. Mask 0xfc eraldab 6 DSCP-bitti 2 ECN-bitist.

Mõistlik vaikimisi kaardistus serveri töökoormuste jaoks:

Liikluse tüüpDSCPTOS hexNäited
InteraktiivneEF0xb8SSH, DNS, VoIP
ÄriAF410x88HTTP, HTTPS, API-d
HulgimüükCS10x20Varukoopiad, FTP, pakettide uuendused
Parim tulemusCS00x00Kõik muu

Märgi väljaminevad paketid iptablesis enne, kui need jõuavad su tc filtritesse jõuavad:

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

Seejärel sobita silt tc ja suunake see õigesse HTB-klassi:

# 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

Jälgimine ja veaotsing

Kolm käsku, mida kasutate pidevalt:

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

Jälgi dropped ja overlimits loendureid. Kaotatud paketid tähendavad, et järjekord on ülekoormatud; piiride ületamine tähendab, et olete jõudnud klassi ülempiirini ja tuum pidi liiklust edasi lükkama või katkestama. Reaalajas vaate saamiseks:

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

Lisage -d sisemiste parameetrite jaoks (sihtmärk, intervall, kvant) ja -j JSON-väljundiks, kui suunad andmed mõõdikute kuhja. Kasuta koos ss -tin , et näha RTT-hinnanguid ja kordusülekandeid TCP-kihis.

Enamik rikkeid kuulub lühikesse nimekirja:

SümptomTõenäoline põhjusParandus
RTNETLINK answers: File existsRoot qdisc on juba konfigureeritudtc qdisc del dev eth0 root esimene
Reeglid kehtivad, kuid liiklust ei piirataVale liides või TSO/GSO on endiselt sisse lülitatudKinnita ip link show, keela offloadid käsuga ethtool -K
Filter ei sobi kunagiVale pordi/IP-süntaks või maski joondusLisa vastumeede ja kontrolli tabamuste arvu tc -s filter show
Reeglid kaovad pärast taaskäivitamistKonfiguratsioon asub ainult mälusPakenda skriptiks ja kutsu välja systemd või NetworkManageri dispetšerist
Suur latentsus prioriteetsel liikluselPuudub leaf qdisc või burst on liiga madalLiitke fq_codel leheklassidele, tõsta burst

Kui te kunagi lukustate end välja valesti konfigureerimise tõttu, on taastamine lihtne:

tc qdisc del dev eth0 root

tc ei saa luua ribalaiust, mida sul pole, kuid hästi varustatud üleslingil teeb see vahe, kas jõudlus on ennustatav või server kukub kokku kohe, kui üks klient alustab suurt andmeedastust. Kui vajad toor-ribalaiust ja vabadust seda kujundada just nii, nagu soovid, vaata FDC pühendatud servereid.

Blogi

Sel nädalal esile tõstetud

Rohkem artikleid
Linux Traffic Control (tc): praktiline juhend

Linux Traffic Control (tc): praktiline juhend

Kontrollige ribalaiust, seadke liiklus prioriteediks ja kujundage sisse- ja väljaminekuid Linuxis koos tc-ga. Töötav HTB, IFB, DSCP ja fq_codel konfigureerimine reaalsete serverite jaoks.

12 min lugemine - 5. juuni 2026

Miks on oluline, et VPS oleks võimas ja mittemeterdatud

7 min lugemine - 9. mai 2025

Rohkem artikleid
background image

Kas teil on küsimusi või vajate kohandatud lahendust?

icon

Paindlikud võimalused

icon

Ülemaailmne haare

icon

Kohene kasutuselevõtt

icon

Paindlikud võimalused

icon

Ülemaailmne haare

icon

Kohene kasutuselevõtt