Έλεγχος κυκλοφορίας Linux (tc): πρακτικός οδηγός

12 λεπτά ανάγνωσης - 5 Ιουνίου 2026

hero section cover
Πίνακας περιεχομένων
  • Έλεγχος κυκλοφορίας Linux (tc): ένας πρακτικός οδηγός
  • Πώς λειτουργεί το tc
  • Ρύθμιση του tc σε διακομιστή Linux
  • Διαμόρφωση της εξερχόμενης κίνησης με HTB
  • Διαμόρφωση εισερχόμενης κυκλοφορίας με IFB
  • Προτεραιοποίηση της κυκλοφορίας με DSCP
  • Παρακολούθηση και αντιμετώπιση προβλημάτων
Κοινοποίηση

Ελέγξτε το εύρος ζώνης, δώστε προτεραιότητα στην κυκλοφορία και διαμορφώστε την είσοδο και την έξοδο στο 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.

Μια λογική προεπιλεγμένη αντιστοίχιση για φόρτους εργασίας διακομιστών:

Τύπος κυκλοφορίαςDSCPTOS hexΠαραδείγματα
ΔιαδραστικόEF0xb8SSH, DNS, VoIP
ΕπιχειρήσειςAF410x88HTTP, HTTPS, API
ΜαζικήCS10x20Αντίγραφα ασφαλείας, FTP, ενημερώσεις πακέτων
Κατά βέλτιστο δυνατόCS00x00Όλα τα άλλα

Επισήμανση εξερχόμενων πακέτων στο 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 root

tc δεν μπορείτε να δημιουργήσετε εύρος ζώνης που δεν διαθέτετε, αλλά σε μια καλά εξοπλισμένη ανερχόμενη σύνδεση κάνει τη διαφορά μεταξύ προβλέψιμης απόδοσης και ενός διακομιστή που καταρρέει τη στιγμή που ένας χρήστης ξεκινά μια μεγάλη μεταφορά. Εάν χρειάζεστε το ακατέργαστο εύρος ζώνης και την ελευθερία να το διαμορφώσετε όπως θέλετε, ρίξτε μια ματιά στους αποκλειστικούς διακομιστές της FDC.

Blog

Προτεινόμενα αυτή την εβδομάδα

Περισσότερα άρθρα
Έλεγχος κυκλοφορίας Linux (tc): πρακτικός οδηγός

Έλεγχος κυκλοφορίας Linux (tc): πρακτικός οδηγός

Ελέγξτε το εύρος ζώνης, δώστε προτεραιότητα στην κυκλοφορία και διαμορφώστε την είσοδο και την έξοδο στο Linux με το tc. Διαμόρφωση παραμέτρων HTB, IFB, DSCP και fq_codel σε λειτουργία για πραγματικούς διακομιστές.

12 λεπτά ανάγνωσης - 5 Ιουνίου 2026

Γιατί είναι σημαντικό να έχετε ένα ισχυρό και unmetered VPS

7 λεπτά ανάγνωσης - 9 Μαΐου 2025

Περισσότερα άρθρα
background image

Έχετε ερωτήσεις ή χρειάζεστε μια προσαρμοσμένη λύση

icon

Ευέλικτες επιλογές

icon

Παγκόσμια εμβέλεια

icon

Άμεση ανάπτυξη

icon

Ευέλικτες επιλογές

icon

Παγκόσμια εμβέλεια

icon

Άμεση ανάπτυξη