Che cos'è XDP (Express Data Path) in Linux

XDP (o Express Data Path) è un’utilità di rete disponibile nel kernel Linux. XDP è utilizzato in molte aziende popolari per risolvere problemi seri di networking che affrontano nel gestire milioni di richieste al secondo. Questo è un programma open source con licenza MIT integrato nel kernel Linux dalla versione 4.8.
XDP è un processore di pacchetti di dati di rete programmabile e ad alte prestazioni. È stato creato per mitigare alcuni gravi problemi lato server come attacchi DDoS (Distributed Denial-of-Service) o come bilanciatore di carico.
Indice
- Necessità di XDP
- Perché XDP è molto veloce
- Collegare lo stack di rete con XDP
- Tipi di operazioni che XDP esegue
- XDP e eBPF
- Casi d’uso comuni di XDP e eBPF
- Domande frequenti
Leggi anche: 5 suggerimenti utili quando compili il tuo kernel Linux
Necessità di XDP
La necessità di un percorso dati di rete performante è sempre una caratteristica richiesta per i server Linux. Ma la programmabilità di questi percorsi dati dovrebbe esserci affinché gli sviluppatori possano realizzare qualcosa di utilizzabile. Anche se XDP presenta un percorso di apprendimento piuttosto ripido, grazie allo sviluppo recente di molti strumenti e framework, scrivere codice XDP è diventato abbastanza accessibile oggigiorno.
Il grande vantaggio di XDP è la sua velocità. La funzionalità primaria di XDP è che gli sviluppatori possono costruire nuove funzionalità per filtrare i pacchetti senza modificare il kernel stesso.
Ci sono alcuni scenari in cui un pacchetto non deve viaggiare attraverso l’intero stack di rete solo per decidere se inoltrare o scartare il pacchetto. Questa operazione dovrebbe avvenire sul primo strato dello stack di rete posizionando alcuni filtri. Questi filtri devono essere programmati in modo da riconoscere facilmente un pacchetto malevolo e scartarlo all’inizio dello stack. Ciò può risparmiare molta potenza di elaborazione e tempo.
Con XDP, questa filtrazione è possibile direttamente all’inizio dello stack di rete.
Ora, utilizzando XDP, lo sviluppatore può filtrare qualsiasi pacchetto che potrebbe essere inviato da un hacker per effettuare un attacco DDoS. Questo può ridurre gran parte del carico nel normale stack di rete del kernel. Questa funzionalità è stata recentemente dimostrata da Cloudflare nella loro dimostrazione di protezione DDoS.

Alcune caratteristiche notevoli di XDP sono le seguenti:
- Non richiede hardware specializzato: XDP può funzionare su qualsiasi hardware che gli si presenta. Sì, la velocità può essere compromessa se non si dispone del dispositivo ottimizzato o dei suoi driver, ma per scopi di test non è necessario alcun hardware specializzato.
- Non richiede bypass del kernel: XDP funziona prima che il pacchetto colpisca lo stack di rete del kernel. Una funzione di callback viene attivata quando un pacchetto viene ricevuto e XDP lo elabora il più velocemente possibile.
- Non sostituisce lo stack TCP/IP: XDP è presente al livello più basso dello stack di rete. Quando passa il pacchetto, poi il pacchetto entra nello normale stack di rete del kernel che include lo stack TCP/IP.
- Funziona insieme a TCP/IP con tutte le funzionalità BPF (Berkeley Packet Filter): XDP non sostituisce nulla. Utilizza persino eBPF per elaborare i pacchetti e facilitare il lavoro di codifica dello sviluppatore.
Leggi anche: Come costruire e installare un kernel personalizzato su Ubuntu
Perché XDP è molto veloce
XDP è un percorso dati di rete programmabile ad alte prestazioni basato su eBPF nel kernel Linux. Il guadagno di prestazioni di XDP è dovuto all’elaborazione dei pacchetti in metallo nudo al livello più basso dello stack software. Ciò significa che il pacchetto di dati in arrivo dalla rete colpisce XDP per primo prima di qualsiasi altro processo del kernel.
Pertanto, gli ingegneri possono programmare XDP per ottimizzarlo per vari casi d’uso. Dalla protezione DDoS al bilanciatore di carico.
XDP viene caricato direttamente nello stack di rete. Quando un pacchetto viene ricevuto dallo stack di rete, ottiene una callback e elabora i pacchetti il più velocemente possibile. XDP può scartare 26 milioni di pacchetti al secondo per core su hardware commerciale.
La ragione principale per cui XDP è molto veloce è che l’utente è autorizzato a leggere direttamente o apportare modifiche ai dati del pacchetto di rete e prendere decisioni su come gestire il pacchetto in una fase precedente. Questo richiede un sovraccarico di processo molto ridotto e comporta una velocità migliore.
Collegare lo stack di rete con XDP
Puoi collegarti alla rete con XDP in vari modi, ma qui menziono alcuni metodi popolari.
- XDP generico: In questo processo, XDP viene caricato nel kernel, ma ottiene pochi benefici in termini di prestazioni. Questo è il modo più semplice per eseguire un programma XDP senza alcun supporto da parte dell’hardware.
- XDP nativo: L’XDP nativo viene caricato direttamente dal driver di rete. Richiede il supporto del driver della scheda di rete.
Leggi anche: Come risolvere l’errore di dati in pagina del kernel in Windows
Tipi di operazioni che XDP esegue
Alcune delle operazioni che XDP può eseguire una volta ricevuto un pacchetto dall’interfaccia di rete sono:
- XDP_DROP: Scarta i pacchetti e non li elabora. Utilizza un programma eBPF per analizzare il modello di traffico e può scartare pacchetti in tempo reale.
- XDP_PASS: Inoltra i pacchetti allo stack di rete per ulteriori elaborazioni. Può modificare il contenuto del pacchetto prima che accada.
- XDP_ABORTED: Scarta il pacchetto di dati di rete, lasciando un’eccezione di testamentazione.
- XDP_TX: Inoltra i pacchetti all’interfaccia di rete che li riceve. I pacchetti possono essere modificati o meno.
- XDP_REDIRECT: Reindirizza il pacchetto a un’altra NIC (controller di interfaccia di rete).

XDP e eBPF
eBPF è la versione estesa del Berkeley Packet Filter. È simile a una macchina virtuale astratta che funziona all’interno del kernel Linux. eBPF viene utilizzato per eseguire un programma definito dall’utente all’interno di un ambiente sandbox nel kernel Linux. Generalmente, è utilizzato per eseguire strumenti di rete e monitoraggio sui server Linux per garantire prestazioni ottimali.
XDP è un framework utilizzato per scrivere elaborazione di pacchetti ad altissima velocità nelle applicazioni BPF. Per renderlo ancora più veloce, XDP esegue BPF immediatamente dopo che un pacchetto è ricevuto dallo stack di rete.
XDP ha una curva di apprendimento molto ripida. Pertanto, gli sviluppatori stanno creando strumenti e framework per facilitare la programmazione utilizzando eBPF. Questo rende molto semplice scrivere codice per l’elaborazione di reti ad alta frequenza utilizzando XDP e eBPF. Il vantaggio principale di XDP è che non richiede di modificare il kernel, cosa che rappresentava un enorme fastidio per gli ingegneri.
Ma come dicono le persone, grandi poteri comportano grandi responsabilità. Poiché XDP esegue eBPF il prima possibile, prima che i pacchetti vengano interpretati dal kernel stesso, i programmi eBPF devono eseguire tutta l’analisi da soli e non possono contare sul kernel per fare nulla per loro.
Come programmatore, la maggior parte del tuo tempo lo passi a lavorare con il terminale. Questa è una guida per decorare il prompt del tuo terminale. Controllala.
Leggi anche: Come eseguire il downgrade del kernel in Linux
Casi d’uso comuni di XDP e eBPF
- Attacco DDoS: Il principale caso d’uso di XDP è la protezione DDoS (Distributed Denial of Service). Durante l’attacco DDoS, l’attaccante cerca di utilizzare quante più risorse del server possibile, senza lasciare alcun processo per l’utente finale. Utilizzando XDP come strato molto veloce dello stack di rete, non ci sono costi di elaborazione associati per scartare un pacchetto di dati di rete. Dopo la filtrazione XDP, il pacchetto passa attraverso tutti gli altri metodi di filtrazione forniti dal kernel Linux.
- Bilanciatore di carico: XDP viene utilizzato anche come bilanciatore di carico per gestire una grande quantità di traffico verso il server. Tra cui Facebook, molte grandi aziende tecnologiche utilizzano questa tecnologia. In passato, gli ingegneri usavano un server dedicato come bilanciatore di carico. Che è molto difficile da gestire e deve funzionare molto bene per servire milioni di clienti. Ma immagina di utilizzare il livello XDP come bilanciatore di carico senza un server centrale, di conseguenza, nessun singolo punto di errore.
- Firewall: XDP con eBPF può essere utilizzato per scrivere varie regole di firewall per proteggere il sistema con un sovraccarico molto minimo.
Leggi anche: Come utilizzare il comando Rm in Linux
Domande frequenti
Cos’è BCC in eBPF?
BCC è costruito su eBPF. È un toolkit o framework per il tracciamento del kernel e programmi di manipolazione che viene fornito con un’interfaccia a riga di comando molto utile. BCC aiuta a scrivere istruzioni del kernel in C. Include anche un wrapper attorno a LLVM.
Cos’è libBPF?
LibBPF è un insieme alternativo di strumenti per creare un’applicazione BPF. È scritto in linguaggio di programmazione C.