Έλεγχος κυκλοφορίας στο Linux (tc): ένας πρακτικός οδηγός
12 λεπτά ανάγνωσης - 5 Ιουνίου 2026

Έλεγχος εύρους ζώνης, ιεράρχηση της κυκλοφορίας και διαμόρφωση εισερχόμενης και εξερχόμενης κίνησης σε Linux με το tc. Λειτουργικές ρυθμίσεις HTB, IFB, DSCP και fq_codel για πραγματικούς διακομιστές.
Έλεγχος κυκλοφορίας στο Linux (tc): ένας πρακτικός οδηγός
Η εντολή tc σας παρέχει άμεσο έλεγχο του τρόπου με τον οποίο ο διακομιστής σας διαχειρίζεται την κυκλοφορία του δικτύου. Μπορείτε να περιορίσετε το εύρος ζώνης ανά υπηρεσία, να διατηρήσετε την ανταπόκριση διαδραστικών συνεδριών όπως το SSH όταν παρατηρούνται απότομες αυξήσεις στις μαζικές μεταφορές δεδομένων και να διαμορφώσετε τόσο τις εξερχόμενες όσο και τις εισερχόμενες ροές από ένα μόνο εργαλείο. Ο οδηγός αυτός καλύπτει τις βασικές έννοιες, μια λειτουργική ρύθμιση HTB, τη διαμόρφωση εισερχόμενης κίνησης με IFB, την ιεράρχηση βάσει DSCP και τον τρόπο εντοπισμού σφαλμάτων όταν παρουσιάζεται κάποιο πρόβλημα.
Πώς λειτουργεί το tc
Κάθε tc ρύθμιση αποτελείται από τέσσερα κινούμενα μέρη:
- qdisc (queuing discipline). Ο χρονοπρογραμματιστής που συνδέεται με μια διεπαφή δικτύου. Αποφασίζει πώς τα πακέτα εισάγονται και εξάγονται από την ουρά.
- Class. Μια υποδιαίρεση μέσα σε ένα qdisc με κλάσεις. Σκεφτείτε το σαν μια λωρίδα κυκλοφορίας με δικό της όριο ταχύτητας.
- Φίλτρο. Ελέγχει τις κεφαλίδες των πακέτων (IP, θύρες, σημάδια) και αντιστοιχίζει κάθε πακέτο σε μια κλάση.
- Action. Τι συμβαίνει σε ένα πακέτο όταν ανταποκρίνεται στα κριτήρια: προώθηση, απόρριψη, ανακατεύθυνση.
Αυτά σχηματίζουν ένα δέντρο. Τα πακέτα εισέρχονται στο ριζικό qdisc, περνούν από φίλτρα, ταξινομούνται σε κλάσεις από ένα major:minor χειριστή και καταλήγουν σε ουρά σε ένα qdisc φύλλου για μετάδοση.
Για οτιδήποτε πιο περίπλοκο από την αντιστοίχιση βάσει θύρας, επισημάνετε τα πακέτα με iptables ή nftables στον πίνακα mangle και, στη συνέχεια, χρησιμοποιήστε το fw φίλτρο tc για να τα ταξινομήσετε βάσει της σήμανσης. Έχει πολύ καλύτερη επεκτασιμότητα από την αλυσιδωτή εφαρμογή u32 κανόνων για κάθε τύπο κίνησης.
Εξερχόμενη έναντι εισερχόμενης
Η κατεύθυνση έχει σημασία. Ο πυρήνας μπορεί να αποθηκεύσει προσωρινά και να καθυστερήσει τα εξερχόμενα πακέτα, κάτι που επιτρέπει την πραγματική διαμόρφωση της κυκλοφορίας. Τα εισερχόμενα πακέτα έχουν ήδη διανύσει το δίκτυο τη στιγμή που τα βλέπετε, οπότε μπορείτε μόνο να τα ελέγξετε (να τα απορρίψετε αν υπερβούν ένα όριο) εκτός αν τα ανακατευθύνετε πρώτα σε μια συσκευή IFB.
| Χαρακτηριστικό | Εξερχόμενη | Εισερχόμενη |
|---|---|---|
| Κατεύθυνση | Εξερχόμενα | Εισερχόμενη |
| Διαμόρφωση | Εγγενής | Απαιτεί IFB |
| Πολιτική | Υποστηρίζεται | Υποστηρίζεται |
| Τυπική χρήση | QoS, κατανομή εύρους ζώνης, ρύθμιση ρυθμού | Περιορισμός ρυθμού, βασική αντιμετώπιση DDoS |
Τα qdiscs που θα χρησιμοποιήσετε στην πράξη
- HTB (Hierarchical Token Bucket). Με κατηγορίες. Χρησιμοποιήστε το όταν θέλετε εγγυημένο ελάχιστο εύρος ζώνης ανά υπηρεσία με τη δυνατότητα να δανειστείτε αχρησιμοποίητη χωρητικότητα από άλλες κατηγορίες.
- TBF (Token Bucket Filter). Χωρίς κλάσεις. Χρησιμοποιήστε το όταν απλώς χρειάζεστε να περιορίσετε ολόκληρη τη διεπαφή σε έναν ενιαίο ρυθμό.
- fq_codel (Fair Queuing Controlled Delay). Συνδυάζει τη δικαιοσύνη ανά ροή με την ενεργή διαχείριση ουρών για την εξάλειψη του bufferbloat. Αποτελεί το προεπιλεγμένο qdisc στις περισσότερες διανομές Linux από την έκδοση systemd 217 και παρέχεται ως προεπιλογή στο RHEL 9. Να το συνδέετε πάντα ως τελικό qdisc κάτω από κλάσεις HTB, διαφορετικά μια μεμονωμένη «άπληστη» ροή μπορεί να μονοπωλήσει ολόκληρη την κλάση.
Εγκατάσταση του tc σε διακομιστή Linux
tc διατίθεται μαζί με το πακέτο iproute2. Στα Debian και Ubuntu, εγκαταστήστε το με την εντολή apt-get install iproute2. Στα RHEL και τα παράγωγά τους, yum install iproute. Θα χρειαστείτε δικαιώματα root ή sudo.
Βρείτε πρώτα το σωστό όνομα της διεπαφής. Η λανθασμένη ονομασία της διεπαφής είναι ο πιο συνηθισμένος λόγος για τον οποίο μια ρύθμιση δεν έχει κανένα αποτέλεσμα:
ip link showΕλέγξτε τι υπάρχει ήδη στη διεπαφή, συμπεριλαμβανομένων των μετρητών σε πραγματικό χρόνο:
tc -s qdisc show dev eth0Διαγράψτε οποιοδήποτε υπάρχον root qdisc πριν εφαρμόσετε μια νέα ρύθμιση, για να αποφύγετε RTNETLINK answers: File exists σφάλματα:
tc qdisc del dev eth0 root 2>/dev/null || trueΑν ενημερώνετε έναν υπάρχοντα κανόνα αντί να ξεκινάτε από το μηδέν, χρησιμοποιήστε replace αντί για add για μια ατομική αντικατάσταση.
Η εκφόρτωση υλικού, όπως τα TSO και GSO, ομαδοποιεί τα πακέτα με τρόπους που παρεμβαίνουν στη διαμόρφωση. Απενεργοποιήστε τα στη διαμορφωμένη διεπαφή:
sudo ethtool -K eth0 tso off gso offΟρίστε fq_codel ως το προεπιλεγμένο qdisc σε επίπεδο συστήματος για νέες διεπαφές:
sysctl -w net.core.default_qdisc=fq_codelΓια διακομιστές με υψηλό φόρτο εργασίας, συνδυάστε το με τον αλγόριθμο ελέγχου συμφόρησης BBR (πυρήνας 4.9+). Το BBR διατηρεί υψηλή απόδοση χωρίς να αυξάνει τις ουρές:
sysctl -w net.ipv4.tcp_congestion_control=bbrΜια συνήθεια ασφαλείας αν διαμορφώνετε ένα απομακρυσμένο σύστημα μέσω SSH: ανοίξτε μια δεύτερη συνεδρία και έχετε tc qdisc del dev eth0 root έτοιμο για επικόλληση. Ένας λανθασμένος κανόνας φίλτρου μπορεί να σας αποκλείσει αμέσως.
Διαμόρφωση της εξερχόμενης κίνησης με το HTB
Το HTB σας επιτρέπει να ορίσετε για κάθε υπηρεσία ένα εγγυημένο ελάχιστο (rate) και ένα ανώτατο όριο (ceil). Το αχρησιμοποίητο εύρος ζώνης κατευθύνεται σε όποιον το χρειάζεται, με σειρά προτεραιότητας. Ακολουθεί μια λειτουργική ρύθμιση τριών επιπέδων για μια ανερχόμενη σύνδεση 1 Gbps.
Δημιουργήστε το ριζικό qdisc HTB. Το default 30 στέλνει κάθε μη ταξινομημένο πακέτο στην κλάση 1:30 αντί να το αφήσει να παρακάμψει τους κανόνες σας:
tc qdisc add dev eth0 root handle 1: htb default 30Περιορίστε τη συνολική διακίνηση στα 900 Mbps. Ρυθμίζετε πάντα τη διαμόρφωση ελαφρώς κάτω από την πραγματική χωρητικότητα της σύνδεσης, διαφορετικά δημιουργείται ουρά σε κάποιον ανάντη δρομολογητή ή μόντεμ που δεν ελέγχετε:
tc class add dev eth0 parent 1: classid 1:1 htb rate 900mbit ceil 900mbitΟρίστε τα επίπεδα υπηρεσιών. Οι χαμηλότερες prio τιμές λαμβάνουν πρώτα το αχρησιμοποίητο εύρος ζώνης:
# 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Προσθέστε fq_codel ως το qdisc «φύλλου» σε κάθε κλάση, ώστε μια μεμονωμένη ροή να μην μπορεί να κυριαρχήσει στο επίπεδό της:
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Τώρα ταξινομήστε την κίνηση. Για απλή αντιστοίχιση θυρών, u32 είναι η ταχύτερη μέθοδος:
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
match ip dport 443 0xffff flowid 1:10Για οτιδήποτε εξαρτάται από την κατάσταση, προσθέστε σήμανση στα iptables και αντιστοιχίστε τη σήμανση με 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Διαμόρφωση της εισερχόμενης κίνησης με IFB
Δεν είναι δυνατή η εγγενής διαμόρφωση της εισερχόμενης κυκλοφορίας, καθώς τη στιγμή που ένα πακέτο φτάνει, έχει ήδη καταναλώσει το εύρος ζώνης σας. Η λύση είναι να ανακατευθύνετε την εισερχόμενη κυκλοφορία σε μια εικονική διεπαφή Intermediate Functional Block (IFB), όπου ο πυρήνας την αντιμετωπίζει ως εξερχόμενη και σας επιτρέπει να εφαρμόσετε qdiscs με κατηγορίες.
Φορτώστε το module και ενεργοποιήστε τη διεπαφή:
modprobe ifb numifbs=1
ip link set dev ifb0 upΠροσθέστε ένα qdisc εισερχόμενης κίνησης στη φυσική διεπαφή και ανακατευθύνετε τα πάντα προς 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Από εδώ, ifb0 συμπεριφέρεται όπως οποιαδήποτε άλλη διεπαφή. Εφαρμόστε το δέντρο HTB σας σε αυτήν ακριβώς όπως θα κάνατε στην εξερχόμενη κίνηση:
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Προτεραιοποίηση της κυκλοφορίας με DSCP
Το DSCP (Differentiated Services Code Point) επισημαίνει τα πακέτα με μια τιμή 6 bit στο byte TOS, οπότε τα tc φίλτρα σας να μπορούν να ταξινομούν βάσει ετικέτας αντί να αναζητούν θύρες σε όλο το σύνολο κανόνων. Κατά την αντιστοίχιση του DSCP στο tc, μετατοπίστε την τιμή προς τα αριστερά κατά 2 bit. Το DSCP EF (46) γίνεται 0xb8. Η μάσκα 0xfc απομονώνει τα 6 bit του DSCP από τα 2 bit του ECN.
Μια λογική προεπιλεγμένη αντιστοίχιση για φορτία εργασίας διακομιστών:
| Τύπος κυκλοφορίας | DSCP | TOS δεκαεξαδικό | Παραδείγματα |
|---|---|---|---|
| Διαδραστικό | EF | 0xb8 | SSH, DNS, VoIP |
| Επιχειρήσεις | AF41 | 0x88 | HTTP, HTTPS, API |
| Μαζική | CS1 | 0x20 | Αντίγραφα ασφαλείας, FTP, ενημερώσεις πακέτων |
| Κατά βέλτιστο δυνατό τρόπο | CS0 | 0x00 | Όλα τα άλλα |
Επισήμανση εξερχόμενων πακέτων στο iptables πριν φτάσουν στα tc φίλτρα σας:
iptables -t mangle -A OUTPUT -p tcp --dport 22 -j DSCP --set-dscp 46Στη συνέχεια, αντιστοιχίστε την ετικέτα στο tc και δρομολογήστε το στη σωστή κατηγορία HTB:
# 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Παρακολούθηση και αντιμετώπιση προβλημάτων
Οι τρεις εντολές που θα χρησιμοποιείτε συνεχώς:
tc -s qdisc show dev eth0
tc -s class show dev eth0
tc -s filter show dev eth0Παρακολουθήστε το dropped και overlimits μετρητές. Τα πακέτα που χάνονται σημαίνουν ότι η ουρά έχει κορεστεί· η υπέρβαση των ορίων σημαίνει ότι φτάσατε στο ανώτατο όριο της κατηγορίας και ο πυρήνας αναγκάστηκε να καθυστερήσει ή να απορρίψει κίνηση. Για ζωντανή προβολή:
watch -n 1 'tc -s class show dev eth0'Προσθέστε -d για εσωτερικές παραμέτρους (target, interval, quantum) και -j για έξοδο JSON αν διοχετεύετε τα δεδομένα σε μια στοίβα μετρήσεων. Συνδυάστε το με ss -tin για να δείτε εκτιμήσεις RTT και επαναμεταδόσεις στο επίπεδο TCP.
Οι περισσότερες αστοχίες εμπίπτουν σε μια σύντομη λίστα:
| Σύμπτωμα | Πιθανή αιτία | Λύση |
|---|---|---|
RTNETLINK answers: File exists | Το root qdisc έχει ήδη ρυθμιστεί | tc qdisc del dev eth0 root πρώτα |
| Οι κανόνες εφαρμόζονται, αλλά η κίνηση δεν περιορίζεται | Λάθος διεπαφή ή το TSO/GSO παραμένει ενεργοποιημένο | Επιβεβαιώστε με ip link show, απενεργοποιήστε τις εκφορτώσεις με το ethtool -K |
| Το φίλτρο δεν ταιριάζει ποτέ | Λανθασμένη σύνταξη θύρας/IP ή ευθυγράμμιση μάσκας | Προσθέστε μια αντίμετρο και ελέγξτε τον αριθμό των εμφανίσεων στο tc -s filter show |
| Οι κανόνες εξαφανίζονται μετά την επανεκκίνηση | Η διαμόρφωση βρίσκεται μόνο στη μνήμη | Ενσωματώστε το σε ένα σενάριο και καλέστε το από το systemd ή έναν διαχειριστή του NetworkManager |
| Υψηλή καθυστέρηση στην κυκλοφορία προτεραιότητας | Δεν υπάρχει qdisc τύπου «leaf» ή το όριο ράφτας είναι πολύ χαμηλό | Συνδέστε fq_codel σε κατηγορίες leaf, αυξήστε burst |
Αν ποτέ κλειδωθείτε έξω λόγω λανθασμένης διαμόρφωσης, η επαναφορά είναι απλή:
tc qdisc del dev eth0 roottc δεν μπορείτε να δημιουργήσετε εύρος ζώνης που δεν διαθέτετε, αλλά σε μια καλά εξοπλισμένη ανερχόμενη σύνδεση αυτό κάνει τη διαφορά μεταξύ προβλέψιμης απόδοσης και ενός διακομιστή που καταρρέει τη στιγμή που ένας χρήστης ξεκινά μια μεγάλη μεταφορά δεδομένων. Αν χρειάζεστε το ακατέργαστο εύρος ζώνης και την ελευθερία να το διαμορφώσετε όπως θέλετε, ρίξτε μια ματιά στους αποκλειστικούς διακομιστές της FDC.

Οδηγός χρήσης του iperf3: Δοκιμή ταχύτητας δικτύου σε Linux και Windows
Εγκαταστήστε το iperf3, εκτελέστε δοκιμές εύρους ζώνης και ρυθμίστε τα buffer TCP για ακριβή αποτελέσματα σε Linux και Windows. Καλύπτει δοκιμές UDP, αμφίδρομες δοκιμές και δοκιμές 10GbE+.
10 λεπτά ανάγνωσης - 7 Μαΐου 2026
Προσαρμοσμένα προφίλ για τη βελτιστοποίηση του φόρτου εργασίας διακομιστών Linux
16 λεπτά ανάγνωσης - 9 Ιουνίου 2026

Έχετε ερωτήσεις ή χρειάζεστε μια προσαρμοσμένη λύση
Ευέλικτες επιλογές
Παγκόσμια εμβέλεια
Άμεση ανάπτυξη
Ευέλικτες επιλογές
Παγκόσμια εμβέλεια
Άμεση ανάπτυξη