Linux forgalomirányítás (tc): gyakorlati útmutató
12 perc olvasás - 2026. június 5.

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ány | Kimenő | Bejövő |
| Alakítás | Natív | IFB szükséges |
| Ellenőrzés | Támogatott | Támogatott |
| Jellemző felhasználás | QoS, sávszélesség-megosztás, sebességszabályozás | Sebessé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 showEllenőrizze, mi található már az interfészen, beleértve az élő számlálókat is:
tc -s qdisc show dev eth0Tö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 || trueHa 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_codelForró 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=bbrEgy 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 30Korlá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 900mbitHatá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 3Csatlakoztassa 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_codelMost 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:10Bá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:20A 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 upAdjon 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 ifb0Ettő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 1A 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ípus | DSCP | TOS hex | Példák |
|---|---|---|---|
| Interaktív | EF | 0xb8 | SSH, DNS, VoIP |
| Üzleti | AF41 | 0x88 | HTTP, HTTPS, API-k |
| Tömeges | CS1 | 0x20 | Biztonsági mentések, FTP, csomagfrissítések |
| Legjobb erőfeszítés | CS0 | 0x00 | Minden 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 46Ezutá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:30Felü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 eth0Figyelje 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ünet | Valószínű ok | Megoldás |
|---|---|---|
RTNETLINK answers: File exists | A root qdisc már be van állítva | tc qdisc del dev eth0 root első |
| A szabályok érvényesek, de a forgalom nem korlátozott | Helytelen interfész, vagy a TSO/GSO még mindig be van kapcsolva | Ellenőrizze a ip link show, és tiltsa le az offloadokat a ethtool -K |
| A szűrő soha nem talál egyezést | Helytelen port/IP szintaxis vagy maszk igazítás | Adjon 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űnnek | A 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 forgalomban | Nincs leaf qdisc, vagy a burst túl alacsony | Csatlakoztassa 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 roottc 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.

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.
Beállított profilok a Linux-kiszolgálók terhelésének optimalizálásához
16 perc olvasás - 2026. június 9.

Kérdése van, vagy egyedi megoldásra van szüksége?
Rugalmas lehetőségek
Globális elérés
Azonnali telepítés
Rugalmas lehetőségek
Globális elérés
Azonnali telepítés