Έλεγχος κυκλοφορίας 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. Συνδέστε το πάντα ως leaf 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 ως το leaf 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Για οτιδήποτε stateful, σημειώστε στο 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), όπου ο πυρήνας την αντιμετωπίζει ως εξερχόμενη και σας επιτρέπει να εφαρμόσετε classful 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 hex | Παραδείγματα |
|---|---|---|---|
| Διαδραστικό | 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 |
| Υψηλή καθυστέρηση στην κυκλοφορία προτεραιότητας | Δεν υπάρχει leaf qdisc ή το burst είναι πολύ χαμηλό | Συνδέστε fq_codel σε κατηγορίες leaf, αυξήστε burst |
Αν ποτέ κλειδωθείτε έξω λόγω λανθασμένης διαμόρφωσης, η επαναφορά είναι απλή:
tc qdisc del dev eth0 roottc δεν μπορείτε να δημιουργήσετε εύρος ζώνης που δεν διαθέτετε, αλλά σε μια καλά εξοπλισμένη ανερχόμενη σύνδεση κάνει τη διαφορά μεταξύ προβλέψιμης απόδοσης και ενός διακομιστή που καταρρέει τη στιγμή που ένας χρήστης ξεκινά μια μεγάλη μεταφορά. Εάν χρειάζεστε το ακατέργαστο εύρος ζώνης και την ελευθερία να το διαμορφώσετε όπως θέλετε, ρίξτε μια ματιά στους αποκλειστικούς διακομιστές της FDC.

Έλεγχος κυκλοφορίας Linux (tc): πρακτικός οδηγός
Ελέγξτε το εύρος ζώνης, δώστε προτεραιότητα στην κυκλοφορία και διαμορφώστε την είσοδο και την έξοδο στο Linux με το tc. Διαμόρφωση παραμέτρων HTB, IFB, DSCP και fq_codel σε λειτουργία για πραγματικούς διακομιστές.
12 λεπτά ανάγνωσης - 5 Ιουνίου 2026
Γιατί είναι σημαντικό να έχετε ένα ισχυρό και unmetered VPS
7 λεπτά ανάγνωσης - 9 Μαΐου 2025

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