Linux forgalomirányítás (tc): gyakorlati útmutató

12 perc olvasás - 2026. június 5.

hero section cover
Tartalomjegyzék
  • Linux Traffic Control (tc): gyakorlati útmutató
  • Hogyan működik a tc
  • A tc beállítása Linux szerveren
  • A kimenő forgalom alakítása HTB segítségével
  • A bejövő forgalom alakítása IFB-vel
  • A forgalom prioritásainak meghatározása DSCP segítségével
  • Felügyelet és hibaelhárítás
Megosztás

A sávszélesség szabályozása, a forgalom priorizálása és a be- és kilépő forgalom alakítása Linuxon a tc-vel. Működő HTB, IFB, DSCP és fq_codel konfiguráció valós szerverekhez.

Linux Traffic Control (tc): gyakorlati útmutató

A Linux tc parancs segítségével közvetlenül szabályozhatja, hogy a szerver hogyan kezeli a hálózati forgalmat. Egyetlen eszközzel korlátozhatja a sávszélességet szolgáltatásonként, biztosíthatja az interaktív munkamenetek (pl. SSH) reagálóképességét nagy adatátviteli csúcsok esetén, valamint alakíthatja a kimenő és bejövő adatforgalmat. Ez az útmutató bemutatja az alapvető fogalmakat, egy működő HTB-beállítást, az IFB-vel történő bejövő forgalom alakítását, a DSCP-alapú prioritáskezelést, valamint a hibakeresés módját, ha valami nem működik.


 

Hogyan működik a tc

Minden tc beállítás négy mozgó részből áll:

  • qdisc (sorbaállítási szabály). A hálózati interfészhez kapcsolódó ütemező. Ez határozza meg, hogy a csomagok hogyan kerülnek be a sorba és hogyan kerülnek ki onnan.
  • Osztály. Egy osztályalapú qdisc-en belüli alosztály. Képzelje el úgy, mint egy saját sebességkorlátozással rendelkező sávot.
  • Szűrő. Ellenőrzi a csomagfejléceket (IP-címek, portok, jelölések) és minden csomagot egy osztályhoz rendel.
  • Művelet. Mi történik a csomaggal, ha megfelel a feltételeknek: továbbítás, elvetés, átirányítás.

Ezek egy fát alkotnak. A csomagok a gyökér qdisc-be lépnek be, eljutnak a szűrőkhöz, egy major:minor kezelő alapján osztályokba, és végül a leveles qdisc-ben kerülnek sorba az átvitelre.

A portalapú egyezésnél bonyolultabb esetekben jelölje meg a csomagokat az iptables vagy az nftables segítségével a mangle táblában, majd használja a fw filter-t tc a jelölés szerinti osztályozáshoz. Sokkal jobban skálázódik, mint a nyers u32 szabályok láncolása minden forgalomtípushoz.

Kimenő vs. bejövő

Az irány számít. A kernel képes pufferelni és késleltetni a kimenő csomagokat, ami teszi lehetővé a valódi alakítást. A bejövő csomagok már átjutottak a vezetéken, mire meglátja őket, így csak ellenőrizni tudja őket (küszöbérték felett eldobni), hacsak nem irányítja át őket előbb egy IFB-eszközre.

FunkcióKimenőBejövő
IrányKimenőBejövő
AlakításNatívIFB szükséges
FelügyeletTámogatottTámogatott
Jellemző felhasználásQoS, sávszélesség-megosztás, sebességszabályozásSebességkorlátozás, alapvető DDoS-csökkentés

A qdisc-ek, amelyeket ténylegesen használni fog

  • HTB (Hierarchical Token Bucket). Osztályalapú. Használja akkor, ha garantált minimális sávszélességet szeretne szolgáltatásonként, azzal a lehetőséggel, hogy más osztályoktól kölcsönözhessen kihasználatlan kapacitást.
  • TBF (Token Bucket Filter). Osztály nélküli. Használja, ha csak egy teljes interfészt kell egyetlen sebességre korlátoznia.
  • fq_codel (Fair Queuing Controlled Delay). Ötvözi a forgalomra vonatkozó méltányosságot az aktív sorkezeléssel a bufferbloat kiküszöbölése érdekében. A systemd 217 óta ez az alapértelmezett qdisc a legtöbb Linux-disztribúcióban, és az RHEL 9-ben is alapértelmezettként szerepel. Mindig csatlakoztassa HTB-osztályok alá, mint leaf qdisc-et, ellenkező esetben egyetlen kapzsi forgalom is elfoglalhatja az egész osztályt.

A tc beállítása Linux szerveren

tc az iproute2 csomaggal érkezik. Debian és Ubuntu rendszereken a következő paranccsal telepítheti apt-get install iproute2. RHEL és származékos rendszereken yum install iproute. Root vagy sudo jogosultságra lesz szüksége.

Először szerezze be a megfelelő interfész nevet. Az interfész helytelen elnevezése a leggyakoribb oka annak, hogy a konfiguráció láthatatlanul nem működik:

ip link show

Ellenőrizze, mi található már az interfészen, beleértve az élő számlálókat is:

tc -s qdisc show dev eth0

Töröljön minden meglévő root qdisc-et, mielőtt új konfigurációt alkalmazna, hogy elkerülje RTNETLINK answers: File exists a hibákat:

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

Ha nem nulláról kezded, hanem egy meglévő szabályt frissítesz, használd a replace helyett add az atomikus cseréhez.

A TSO és GSO típusú hardveres terheléscsökkentés olyan módon csomagolja a csomagokat, ami zavarja a forgalomformálást. Kapcsolja ki őket a formált interfészen:

sudo ethtool -K eth0 tso off gso off

Állítsa be fq_codel -t rendszer-szintű alapértelmezett qdisc-ként az új interfészekhez:

sysctl -w net.core.default_qdisc=fq_codel

Forgalmas szerverek esetén párosítsa a BBR torlódásvezérlő algoritmussal (kernel 4.9+). A BBR magas átviteli sebességet biztosít a sorok növekedése nélkül:

sysctl -w net.ipv4.tcp_congestion_control=bbr

Egy biztonsági szokás, ha SSH-n keresztül konfigurál egy távoli gépet: nyisson meg egy második munkamenetet, és tartsa tc qdisc del dev eth0 root készüljön fel a beillesztésre. Egy rossz szűrőszabály azonnal kizárhatja Önt.

A kimenő forgalom alakítása HTB segítségével

Az HTB lehetővé teszi, hogy minden szolgáltatásnak garantált minimumot (rate) és egy felső határt (ceil). A fel nem használt sávszélesség prioritási sorrendben áramlik oda, ahol szükség van rá. Íme egy működő háromszintű beállítás 1 Gbps-es felkapcsoláshoz.

Hozza létre a gyökér HTB qdisc-et. A default 30 minden osztályozatlan csomagot a 1:30 osztályba, ahelyett, hogy megkerülné a szabályait:

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

Korlátozza a teljes átviteli sebességet 900 Mbps-re. Mindig kissé a tényleges kapcsolat kapacitása alatt alakítsa ki a sávszélességet, ellenkező esetben a sor egy olyan upstream útválasztón vagy modemen alakul ki, amelyet nem Ön irányít:

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

Határozza meg a szolgáltatási szinteket. Az alacsonyabb prio értékek kapják meg elsőként a fel nem használt sávszélességet:

# 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

Csatlakoztassa fq_codel minden osztályhoz, hogy egyetlen adatfolyam se tudja uralni a saját szintjét:

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

Most osztályozza a forgalmat. Egyszerű port-egyeztetés esetén u32 a leggyorsabb:

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

Bármilyen állapotfüggő esetben jelölje meg az iptables-ben, és illessze össze a jelölést a 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

A bejövő forgalom alakítása IFB-vel

A bejövő forgalmat natívan nem lehet alakítani, mert mire a csomag megérkezik, már felhasználta a sávszélességet. A megoldás az, hogy a bejövő forgalmat átirányítjuk egy Intermediate Functional Block (IFB) virtuális interfészre, ahol a kernel kimenő forgalomként kezeli, és lehetővé teszi a classful qdisc-ek alkalmazását.

Töltse be a modult, és indítsa el az interfészt:

modprobe ifb numifbs=1
ip link set dev ifb0 up

Adjon hozzá egy bejövő qdisc-et a fizikai interfészhez, és irányítson át mindent az 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

Innen ifb0 úgy viselkedik, mint bármely más interfész. Alkalmazzuk rá a HTB-fát pontosan úgy, ahogyan a kimenő forgalomra tennénk:

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

A forgalom prioritásainak meghatározása DSCP segítségével

A DSCP (Differentiated Services Code Point) 6 bites értékkel címkézi a csomagokat a TOS-bájtban, így a tc szűrők a címke alapján tudjanak osztályozni, ahelyett, hogy a szabálykészletben a portokat kellene keresniük. A DSCP-vel való egyezéskor tc, az értéket 2 bittel balra kell eltolni. A DSCP EF (46) így 0xb8. A maszk 0xfc elkülöníti a 6 DSCP-bitet a 2 ECN-bittől.

Ésszerű alapértelmezett leképezés szerveres terhelésekhez:

ForgalomtípusDSCPTOS hexPéldák
InteraktívEF0xb8SSH, DNS, VoIP
ÜzletiAF410x88HTTP, HTTPS, API-k
TömegesCS10x20Biztonsági mentések, FTP, csomagfrissítések
Legjobb erőfeszítésCS00x00Minden egyéb

Címkézd meg a kimenő csomagokat az iptables-ben, mielőtt elérnék a tc szűrőidbe:

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

Ezután illessze a címkét az tc és irányítsa a megfelelő HTB osztályba:

# 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

Felügyelet és hibaelhárítás

A három parancs, amelyet folyamatosan használni fog:

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

Figyelje a dropped és overlimits számlálókat. Az eldobott csomagok azt jelentik, hogy a sor telített; a határértékek túllépése azt jelenti, hogy elérted az osztály felső határát, és a kernelnak késleltetnie vagy eldobnia kellett a forgalmat. Élő nézethez:

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

Adja hozzá -d a belső paraméterekhez (target, interval, quantum), és -j a JSON kimenethez, ha egy metrikus verembe továbbítja az adatokat. Párosítsa a ss -tin parancsot, hogy megtekintse az RTT becsléseket és az újraküldéseket a TCP rétegen.

A legtöbb hiba egy rövid listába sorolható:

TünetValószínű okJavítás
RTNETLINK answers: File existsA root qdisc már be van állítvatc qdisc del dev eth0 root első
A szabályok érvényesek, de a forgalom nem korlátozottHelytelen interfész, vagy a TSO/GSO még mindig be van kapcsolvaEllenőrizze a ip link show, tiltsa le az offloadokat a ethtool -K
A szűrő soha nem talál egyezéstHibás port/IP szintaxis vagy maszk igazításAdjon hozzá egy ellenintézkedést, és ellenőrizze a találatok számát a tc -s filter show
A szabályok újraindítás után eltűnnekA konfiguráció csak a memóriában találhatóCsomagolja be egy szkriptbe, és hívja meg a systemd-ből vagy a NetworkManager diszpécserből
Nagy késleltetés a prioritásos forgalombanNincs leaf qdisc, vagy a burst túl alacsonyCsatlakoztassa fq_codel a leaf osztályokhoz, emelje burst

Ha valaha is kizárja magát egy hibás konfiguráció miatt, a visszaállítás egyszerű:

tc qdisc del dev eth0 root

tc nem lehet olyan sávszélességet előállítani, amivel nem rendelkezik, de egy jól ellátott felkapcsoláson ez a különbséget jelenti a kiszámítható teljesítmény és egy olyan szerver között, amelyik összeomlik abban a pillanatban, amikor egy bérlő nagy adatátvitelt indít. Ha nyers sávszélességre és a szabad alakítás lehetőségére van szüksége, nézze meg az FDC dedikált szervereit.

Blog

Kiemelt ezen a héten

További cikkek
Linux forgalomirányítás (tc): gyakorlati útmutató

Linux forgalomirányítás (tc): gyakorlati útmutató

A sávszélesség szabályozása, a forgalom priorizálása és a be- és kilépő forgalom alakítása Linuxon a tc-vel. Működő HTB, IFB, DSCP és fq_codel konfiguráció valós szerverekhez.

12 perc olvasás - 2026. június 5.

Miért fontos egy nagy teljesítményű és mérő nélküli VPS

7 perc olvasás - 2025. május 9.

További cikkek
background image

Kérdése van, vagy egyedi megoldásra van szüksége?

icon

Rugalmas lehetőségek

icon

Globális elérés

icon

Azonnali telepítés

icon

Rugalmas lehetőségek

icon

Globális elérés

icon

Azonnali telepítés