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

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ány | Kimenő | Bejövő |
| Alakítás | Natív | IFB szükséges |
| Felügyelet | 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-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 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, 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 || trueHa 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_codelForgalmas 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=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ü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 30Korlá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 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, 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_codelMost 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: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-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 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 ifb0Innen 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 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í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 |
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 46Ezutá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: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 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ünet | Valószínű ok | Javítá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, tiltsa le az offloadokat a ethtool -K |
| A szűrő soha nem talál egyezést | Hibás 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écserbő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 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.

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.

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