XDP και eBPF για επεξεργασία πακέτων Linux

14 λεπτά ανάγνωσης - 27 Μαΐου 2026

hero section cover
Πίνακας περιεχομένων
  • XDP και eBPF για επεξεργασία πακέτων υψηλής απόδοσης
  • Πώς συνεργάζονται το eBPF και το XDP
  • XDP έναντι iptables: Δείκτες απόδοσης
  • Μείωση επιπτώσεων DDoS και ασφάλεια
  • Εργαλεία, ανάπτυξη και απαιτήσεις υλικού
  • Ξεκινώντας με το XDP
Κοινοποίηση

Πώς το XDP και το eBPF επεξεργάζονται εκατομμύρια πακέτα ανά δευτερόλεπτο σε επίπεδο προγράμματος οδήγησης NIC. Σημεία αναφοράς, περιπτώσεις χρήσης DDoS, ρύθμιση της αλυσίδας εργαλείων και απαιτήσεις υλικού.

XDP και eBPF για επεξεργασία πακέτων υψηλής απόδοσης

Τα XDP (eXpress Data Path) και eBPF (extended Berkeley Packet Filter) επιτρέπουν στο Linux να επεξεργάζεται πακέτα δικτύου πριν εμπλακεί η κανονική στοίβα δικτύωσης του πυρήνα. Αντί να εκχωρεί δομές μνήμης για κάθε εισερχόμενο πακέτο, το XDP παρεμποδίζει την κίνηση ακριβώς στο πρόγραμμα οδήγησης NIC, αποφασίζει τι θα κάνει με αυτήν και είτε την απορρίπτει, είτε την προωθεί, είτε την ανακατευθύνει. Το αποτέλεσμα είναι επεξεργασία πακέτων με ρυθμό εκατομμυρίων πακέτων ανά δευτερόλεπτο ανά πυρήνα, με ένα κλάσμα του φόρτου της CPU που απαιτούν τα παραδοσιακά εργαλεία όπως iptables.


 

Πώς συνεργάζονται το eBPF και το XDP

Το eBPF είναι μια εικονική μηχανή μέσα στον πυρήνα του Linux. Εκτελεί προσαρμοσμένο bytecode που έχει επαληθευτεί ως προς την ασφάλειά του (χωρίς ατέρμονους βρόχους, χωρίς μη εξουσιοδοτημένη πρόσβαση στη μνήμη) και στη συνέχεια μεταγλωττίζεται JIT σε εγγενείς εντολές CPU. Τα προγράμματα έχουν περιορισμένο πεδίο εφαρμογής. Δεν μπορούν να καλέσουν αυθαίρετες συναρτήσεις πυρήνα, αλλά μόνο ένα σύνολο προκαθορισμένων βοηθητικών συναρτήσεων για εργασίες όπως αναζητήσεις χαρτών και ανακατεύθυνση πακέτων.

Για τη διαχείριση κατάστασης, το eBPF χρησιμοποιεί χάρτες, οι οποίοι είναι αποθηκευτικοί χώροι κλειδιού/τιμής (πίνακες κατακερματισμού, πίνακες, δέντρα LPM) που παραμένουν κατά τη διάρκεια της άφιξης πακέτων. Οι χάρτες είναι αναγνώσιμοι και εγγράψιμοι από το χώρο χρήστη, οπότε μπορείτε να ενημερώσετε λίστες αποκλεισμού ή κανόνες δρομολόγησης χωρίς να φορτώσετε εκ νέου το πρόγραμμα.

Το XDP είναι ένα σημείο σύνδεσης eBPF. Συνδέεται στη διαδρομή λήψης του προγράμματος οδήγησης NIC, πριν ο πυρήνας εκχωρήσει μια sk_buff δομή (το αντικείμενο μεταδεδομένων 200-300 byte ανά πακέτο από το οποίο εξαρτάται η παραδοσιακή στοίβα δικτύωσης). Η παράλειψη αυτής της εκχώρησης είναι η πηγή της βελτίωσης στην απόδοση.

Το XDP λειτουργεί σε τρεις λειτουργίες:

  • Εγγενής λειτουργία: εκτελείται μέσα στον οδηγό NIC. Βέλτιστη απόδοση.
  • Λειτουργία εκφόρτωσης: εκτελείται στο ASIC της κάρτας δικτύου. Απελευθερώνει πλήρως την CPU.
  • Γενική λειτουργία: εκτελείται μετά sk_buff την εκχώρηση. Χρήσιμη για δοκιμές σε μη υποστηριζόμενο υλικό, αλλά χωρίς όφελος απόδοσης.

Μετά την επεξεργασία κάθε πακέτου, το πρόγραμμα XDP επιστρέφει μια απόφαση:

ΑπόφασηΕνέργεια
XDP_DROPΑπόρριψη του πακέτου σε επίπεδο προγράμματος οδήγησης
XDP_PASSΠροώθηση στο κανονικό δίκτυο
XDP_TXΑποστολή πίσω στην ίδια διεπαφή
XDP_REDIRECTΑνακατεύθυνση σε άλλη κάρτα δικτύου ή υποδοχή χώρου χρήστη AF_XDP
XDP_ABORTEDΑπόρριψη λόγω σφάλματος προγράμματος, καταγραφή συμβάντος ανίχνευσης

XDP έναντι iptables: Δείκτες απόδοσης

Τα νούμερα είναι αποκαλυπτικά. iptables χειρίζεται περίπου 200.000 πακέτα ανά δευτερόλεπτο ανά πυρήνα. nftables βελτιώνει αυτό το νούμερο σε περίπου 400.000 pps. Το XDP σε native mode επεξεργάζεται 10 έως 40 εκατομμύρια pps ανά πυρήνα στο ίδιο υλικό.

Ο λόγος είναι απλός: ένα XDP_DROP κοστίζει έναν έλεγχο ορίων και μια τιμή επιστροφής. Ένα iptables DROP απαιτεί sk_buff εκχώρηση, διάσχιση αλυσίδας netfilter, αναζήτηση παρακολούθησης σύνδεσης, την ίδια την ενέργεια DROP και, στη συνέχεια, αποδέσμευση. Στα 100 Gbps με πακέτα 64 byte, ένας διακομιστής αντιμετωπίζει 148 εκατομμύρια πακέτα ανά δευτερόλεπτο, αφήνοντας περίπου 100 νανοδευτερόλεπτα ανά πακέτο. Σε αυτή την κλίμακα, sk_buff η εκχώρηση γίνεται το σημείο συμφόρησης.

Η εξοικονόμηση CPU είναι εξίσου σημαντική. Η μετακίνηση μιας λίστας αποκλεισμού από iptables στο XDP σε ένα τεστ απόδοσης μείωσε τη χρήση της CPU από διακοπές λογισμικού από 28% σε 3% στα 1 εκατομμύριο pps. Αυτός ο ελεύθερος χώρος που απελευθερώθηκε μπορεί να εκτελέσει διεργασίες εφαρμογών, βάσεις δεδομένων ή εικονικές μηχανές στον ίδιο διακομιστή.

Μείωση επιπτώσεων DDoS και ασφάλεια

Η ισχυρότερη εφαρμογή φιλοξενίας του XDP είναι η αντιμετώπιση DDoS. Επειδή λειτουργεί σε επίπεδο προγράμματος οδήγησης, τα κακόβουλα πακέτα απορρίπτονται πριν φτάσουν στο δίκτυο του πυρήνα. Ένας μόνο πυρήνας που εκτελεί XDP μπορεί να απορρίψει 26 εκατομμύρια πακέτα ανά δευτερόλεπτο.

Η Cloudflare χρησιμοποιεί ένα σύστημα βασισμένο στο XDP που ονομάζεται L4Drop για την αντιμετώπιση ογκομετρικών επιθέσεων DDoS τουλάχιστον από το 2018. Το σύστημα επεξεργάζεται και απορρίπτει την κυκλοφορία των επιθέσεων στο πλαίσιο του XDP, εμποδίζοντας την να φτάσει στο επίπεδο της εφαρμογής. Το Katran της Meta, ένας ανοιχτού κώδικα εξισορροπητής φορτίου XDP Layer 4, διαχειρίζεται την κυκλοφορία για το Facebook και το Instagram με ρυθμό άνω των 10 εκατομμυρίων pps ανά πυρήνα.

Για δυναμικό φιλτράρισμα, χάρτες eBPF όπως το BPF_MAP_TYPE_LPM_TRIE σας επιτρέπουν να διαχειρίζεστε λίστες αποκλεισμένων IP που καλύπτουν μεμονωμένες IP και υποδίκτυα CIDR με μία μόνο αναζήτηση. Οι ενημερώσεις γίνονται από το χώρο χρήστη σε πραγματικό χρόνο, χωρίς να απαιτείται επανεκκίνηση του προγράμματος. Κατά τη διάρκεια μιας ενεργής επίθεσης, μπορείτε να προωθήσετε νέες υπογραφές σε χιλιοστά του δευτερολέπτου χρησιμοποιώντας bpftool:

bpftool map update id <MAP_ID> key <KEY_VALUE> value <VALUE>

Για παρατηρησιμότητα, το eBPF συλλέγει μετρήσεις ανά εφαρμογή, ανά IP και ανά ροή απευθείας από τη διαδρομή δεδομένων του πυρήνα. Το xdp_md πλαίσιο παρέχει τηλεμετρία όπως ingress_ifindex και rx_queue_index, ώστε να μπορείτε να προσδιορίσετε ποια διεπαφή ή ουρά βρίσκεται υπό πίεση. Για μακροπρόθεσμη παρακολούθηση, εργαλεία όπως το ebpf_exporter μετατρέπουν τα ακατέργαστα δεδομένα χάρτη eBPF σε μετρήσεις συμβατές με το Prometheus για οπτικοποίηση στο Grafana.

Εργαλεία, ανάπτυξη και απαιτήσεις υλικού

Η αλυσίδα εργαλείων ξεκινά με τα Clang και LLVM για τη μεταγλώττιση περιορισμένου C σε bytecode eBPF. Από εκεί, χρειάζεστε μια βιβλιοθήκη φορτωτή:

  • libbpf: η τυπική βιβλιοθήκη C για χρήση σε παραγωγή. Υποστηρίζει CO-RE (Compile Once, Run Everywhere) για φορητότητα μεταξύ πυρήνων.
  • libxdp: ειδική για XDP, υποστηρίζει την εκτέλεση πολλαπλών προγραμμάτων XDP σε μία μόνο διεπαφή.
  • cilium/ebpf: μια καθαρή βιβλιοθήκη Go για στοίβες βασισμένες σε Go.

Για τη διαχείριση, bpftool σας επιτρέπει να επιθεωρείτε ζωντανά προγράμματα και να χαρτογραφείτε περιεχόμενο. xdp-loader (από τη xdp-tools σουίτας) χειρίζεται τη φόρτωση και την εκφόρτωση. Το BCC είναι χρήσιμο για την κατασκευή πρωτοτύπων με front-ends Python/Lua, αλλά libbpf με το CO-RE είναι η καλύτερη επιλογή για παραγωγή.

Ενεργοποιήστε τον μεταγλωττιστή BPF JIT πριν από την ανάπτυξη:

sysctl -w net.core.bpf_jit_enable=1

Για ενημερώσεις χωρίς διακοπή λειτουργίας, χρησιμοποιήστε την XDP_FLAGS_REPLACE σημαία για να αντικαταστήσετε ατομικά ένα πρόγραμμα που εκτελείται. Κλειδώστε τους χάρτες στο /sys/fs/bpf/ ώστε να παραμένουν μετά την έξοδο του φορτωτή.

Συμβατότητα υλικού και πυρήνα

Το XDP εισήχθη στον πυρήνα 4.8, αλλά συνιστάται η έκδοση 5.x ή νεότερη για το πλήρες σύνολο λειτουργιών. Ελέγξτε τον πυρήνα σας με uname -r και βεβαιωθείτε ότι το σύστημα αρχείων BPF υπάρχει στο /sys/fs/bpf/.

Το πρόγραμμα οδήγησης της κάρτας δικτύου σας καθορίζει ποιες λειτουργίες του XDP είναι διαθέσιμες:

Πρόγραμμα οδήγησηςΒασικό XDPΑνακατεύθυνσηΜηδενική αντιγραφή (AF_XDP)
mlx5_coreΝαιΝαιΝαι
i40eΝαιΝαιΝαι
ixgbeΝαιΝαιΝαι
virtio_netΝαιΝαιΌχι
ena (Amazon)ΝαιΝαιΌχι

Ελέγξτε το πρόγραμμα οδήγησης με ethtool -i <interface>. Εάν η εγγενής λειτουργία δεν υποστηρίζεται, το σύστημα επιστρέφει στη γενική λειτουργία, η οποία εκτελείται μετά sk_buff την εκχώρηση και δεν προσφέρει κανένα πλεονέκτημα απόδοσης.

Απενεργοποιήστε τα GRO και LRO πριν συνδέσετε ένα πρόγραμμα XDP, καθώς δημιουργούν σύγκρουση:

ethtool -K <iface> gro off lro off

Το τυπικό XDP απαιτεί τα πακέτα να χωράνε σε μία μόνο σελίδα μνήμης 4.096 byte. Στο i40e και ice οδηγούς, το όριο MTU x86 είναι 3.046 byte.

Ξεκινώντας με το XDP

Ξεκινήστε αξιολογώντας το περιβάλλον σας. Εκτελέστε uname -r για να επιβεβαιώσετε ότι ο πυρήνας είναι 4.8+ (προτιμάται 5.x) και ethtool -i <interface> για να ελέγξετε αν υπάρχει εγγενής υποστήριξη για το πρόγραμμα οδήγησης XDP.

Ξεκινήστε με την παρατηρησιμότητα, όχι με την επιβολή. Χρησιμοποιήστε χάρτες eBPF για να ταξινομήσετε και να μετρήσετε την κίνηση, ώστε να έχετε μια βάση αναφοράς για τη φυσιολογική δραστηριότητα. Μόλις κατανοήσετε τα μοτίβα της κίνησης, προχωρήστε στην επιβολή: δοκιμάστε πρώτα με τη xdpgeneric τη λειτουργία και, στη συνέχεια, μεταβείτε στη xdpdrv (εγγενή) για την παραγωγή.

Λάβετε υπόψη ότι το XDP χειρίζεται το φιλτράρισμα σε επίπεδο πακέτων, όχι το ακατέργαστο εύρος ζώνης. Για επιθέσεις μεγάλης κλίμακας στα 100 Gbps, συνδυάστε το με υποδομή bare-metal και BGP FlowSpec για να διαχειριστείτε την ανάντη κίνηση πριν φτάσει στον διακομιστή.

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

Blog

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

Περισσότερα άρθρα
XDP και eBPF για επεξεργασία πακέτων Linux

XDP και eBPF για επεξεργασία πακέτων Linux

Πώς το XDP και το eBPF επεξεργάζονται εκατομμύρια πακέτα ανά δευτερόλεπτο σε επίπεδο προγράμματος οδήγησης NIC. Σημεία αναφοράς, περιπτώσεις χρήσης DDoS, ρύθμιση της αλυσίδας εργαλείων και απαιτήσεις υλικού.

14 λεπτά ανάγνωσης - 27 Μαΐου 2026

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

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

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

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

icon

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

icon

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

icon

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

icon

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

icon

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

icon

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