#server-performance

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

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

hero section cover

Sávszélesség-szabályozás, forgalomprioritizálás, valamint bejövő és kimenő forgalom alakítása Linux rendszeren a tc segítségével. Működő HTB, IFB, DSCP és fq_codel konfigurációk valódi szerverekhez.

Linux forgalomirányítás (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 (például az SSH) válaszadóképességét a nagy mennyiségű adatátvitel idején, valamint alakíthatja mind a kimenő, mind a bejövő adatforgalmat. Ez az útmutató bemutatja az alapvető fogalmakat, egy működőképes HTB-beállítást, az IFB-vel történő bejövő forgalom alakítását, a DSCP-alapú prioritásbeállítást, valamint azt, hogyan lehet hibakeresést végezni, ha valami nem működik megfelelően.


 

Hogyan működik a tc?

Minden tc konfiguráció négy mozgó elemből épül fel:

  • qdisc (sorbaállítási szabály). A hálózati interfészhez kapcsolódó ütemező. Ez határozza meg, hogyan kerülnek a csomagok 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. Az, ami a csomaggal történik, 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-nél lépnek be, eljutnak a szűrőkhöz, egy major:minor kezelő alapján osztályokba rendezik őket, végül pedig egy levél qdisc sorába kerülnek továbbításra.

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 szűrőt a tc a jelölés szerinti osztályozáshoz. Ez 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 forgalomformázást. A bejövő csomagok már átjutottak a hálózaton, mire meglátod őket, így azokat csak ellenőrizni tudod (küszöbérték felett eldobni), hacsak nem irányítod át őket előbb egy IFB-eszközre.

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

A valójában használni fogott qdisc-ek

  • HTB (Hierarchical Token Bucket). Osztályalapú. Használd akkor, ha szolgáltatásonként garantált minimális sávszélességet szeretnél, azzal a lehetőséggel, hogy más osztályoktól kölcsönözz fel nem használt kapacitást.
  • TBF (Token Bucket Filter). Osztálymentes. Akkor használja, ha egyszerűen csak egy teljes interfészt szeretne egyetlen sebességre korlátozni.
  • fq_codel (Fair Queuing Controlled Delay). Ötvözi az áramlásonkénti méltányosságot az aktív sorkezeléssel a bufferbloat kiküszöbölése érdekében. A systemd 217 verziója óta ez az alapértelmezett qdisc a legtöbb Linux-disztribúcióban, és az RHEL 9-ben is alapértelmezettként szerepel. Mindig csatlakoztasd HTB-osztályok alá, mint végső qdisc-et, különben egyetlen kapzsi áramlás is elfoglalhatja az egész osztályt.

A tc beállítása Linux-kiszolgálón

tc az iproute2 csomaggal együtt érkezik. Debian és Ubuntu rendszereken a következő paranccsal telepíthető apt-get install iproute2parancsot. RHEL és származékos rendszereken yum install iprouteparancs segítségével. Ehhez root jogosultságra vagy sudo-ra lesz szükség.

Először ellenőrizze, hogy a megfelelő interfész nevet adta-e meg. Az interfész helytelen megnevezé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 az új konfiguráció alkalmazása előtt, hogy elkerülje RTNETLINK answers: File exists a hibákat:

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

Ha nem teljesen új szabályt hoz létre, hanem egy meglévőt frissít, használja 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 az alakítást. Kapcsolja ki őket az alakított interfészen:

sudo ethtool -K eth0 tso off gso off

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

sysctl -w net.core.default_qdisc=fq_codel

Forró szerver esetén párosítsa a BBR torlódásvezérlő algoritmussal (kernel 4.9+). A BBR magas átviteli sebességet biztosít anélkül, hogy a sorok megnövekednének:

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ítse elő a beillesztésre. Egy hibás szűrőszabály azonnal kizárhatja Önt a rendszerből.

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

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

Hozzuk 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 a tényleges kapcsolatkapacitásnál kissé alacsonyabb értékre állítsa be a sebességszabályozást, különben a sor az Ön által nem ellenőrzött felmenő útválasztón vagy modemen alakul ki:

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 leaf qdisc-ként, így egyetlen adatfolyam sem uralhatja 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 ez 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 segítségével

A bejövő forgalmat natívan nem lehet alakítani, mert mire egy 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 osztályalapú qdisc-ek alkalmazását.

Töltsük be a modult, és indítsuk 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

Ettől kezdve 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 prioritizálása DSCP segítségével

A DSCP (Differentiated Services Code Point) a TOS-bájtban egy 6 bites értékkel címkézi a csomagokat, í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

Jelöld meg a kimenő csomagokat az iptables-ben, mielőtt eljutnának a tc szűrőidbe:

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

Ezután keresse meg a címkét az tc és irányítsd 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 elveszett csomagok azt jelzik, 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 elvetnie 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 stackbe továbbítod az adatokat. Használd együtt a ss -tin parancsot, hogy megtekintse az RTT becsléseket és az újraküldéseket a TCP rétegben.

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

TünetValószínű okMegoldá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, és tiltsa le az offloadokat a ethtool -K
A szűrő soha nem talál egyezéstHelytelen 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écserébő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 jelenti a különbséget a kiszámítható teljesítmény és egy olyan szerver között, amely összeomlik abban a pillanatban, amikor egy bérlő nagy adatátvitelt indít. Ha szüksége van a nyers sávszélességre és a szabadságra, hogy azt tetszése szerint alakítsa, nézze meg az FDC dedikált szervereit.

Blog

Kiemelt ezen a héten

További cikkek
iperf3 útmutató: Hálózati sebesség tesztelése Linuxon és Windowson
#bandwidth#server-performance

iperf3 útmutató: Hálózati sebesség tesztelése Linuxon és Windowson

Telepítse az iperf3 programot, futtasson sávszélesség-teszteket, és állítsa be a TCP-puffereket a pontos eredmények érdekében Linux és Windows rendszereken. Kiterjed az UDP, a kétirányú és a 10GbE+ tesztelésre is.

10 perc olvasás - 2026. május 7.

#server-performance

Beállított profilok a Linux-kiszolgálók terhelésének optimalizálásához

16 perc olvasás - 2026. június 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