在計(jì)算機(jī)網(wǎng)絡(luò)中,Hook鉤子在操作系統(tǒng)中用于在調(diào)用前或執(zhí)行過程中攔截網(wǎng)絡(luò)數(shù)據(jù)包。Linux內(nèi)核中暴露了多個(gè)鉤子,BPF程序可以連接到這些鉤子上,實(shí)現(xiàn)數(shù)據(jù)收集和自定義事件處理。
Linux內(nèi)核中的鉤子點(diǎn)很多,比如說網(wǎng)絡(luò)子系統(tǒng)中存在兩個(gè)鉤子:XDP和TC。它們結(jié)合在一起,可以用來處理RX和TX上兩個(gè)鏈路上靠近NIC的數(shù)據(jù)包,從而實(shí)現(xiàn)了許多網(wǎng)絡(luò)應(yīng)用的開發(fā)。今天我們簡單介紹下XDP。
XDP全稱為eXpress Data Path,是Linux內(nèi)核網(wǎng)絡(luò)棧的最底層。它只存在于RX路徑上,允許在網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)內(nèi)部網(wǎng)絡(luò)堆棧中數(shù)據(jù)來源最早的地方進(jìn)行數(shù)據(jù)包處理,在特定模式下可以在操作系統(tǒng)分配內(nèi)存(skb)之前就已經(jīng)完成處理。 XDP暴露了一個(gè)可以加載BPF程序的網(wǎng)絡(luò)鉤子。在這個(gè)鉤子中,程序能夠?qū)魅氲臄?shù)據(jù)包進(jìn)行任意修改和快速?zèng)Q策,避免了內(nèi)核內(nèi)部處理帶來的額外開銷。這使得XDP在性能速度方面成為最佳鉤子,例如緩解DDoS攻擊等 DPDK Intel DPDK全稱Intel Data Plane Development Kit,是intel提供的數(shù)據(jù)平面開發(fā)工具集,為Intel architecture(IA)處理器架構(gòu)下用戶空間高效的數(shù)據(jù)包處理提供庫函數(shù)和驅(qū)動(dòng)的支持,它不同于Linux系統(tǒng)以通用性設(shè)計(jì)為目的,而是專注于網(wǎng)絡(luò)應(yīng)用中數(shù)據(jù)包的高性能處理。 DPDK應(yīng)用程序是運(yùn)行在用戶空間上利用自身提供的數(shù)據(jù)平面庫來收發(fā)數(shù)據(jù)包,繞過了Linux內(nèi)核協(xié)議棧對(duì)數(shù)據(jù)包處理過程。Linux內(nèi)核將DPDK應(yīng)用程序看作是一個(gè)普通的用戶態(tài)進(jìn)程,包括它的編譯、連接和加載方式和普通程序沒有什么兩樣。DPDK程序啟動(dòng)后只能有一個(gè)主線程,然后創(chuàng)建一些子線程并綁定到指定CPU核心上運(yùn)行。
XDP 相對(duì)于DPDK,XDP具有以下優(yōu)點(diǎn):
無需第三方代碼庫和許可
同時(shí)支持輪詢式和中斷式網(wǎng)絡(luò)
無需分配大頁
無需專用的CPU
無需定義新的安全網(wǎng)絡(luò)模型
XDP的使用場(chǎng)景包括:
DDoS防御
防火墻
基于XDP_TX的負(fù)載均衡
網(wǎng)絡(luò)統(tǒng)計(jì)
復(fù)雜網(wǎng)絡(luò)采樣
高速交易平臺(tái)
XDP輸入參數(shù)XDP暴露的鉤子具有特定的輸入上下文,它是單一輸入?yún)?shù)。它的類型為 struct xdp_md,在內(nèi)核頭文件bpf.h 中定義,具體字段如下所示:
程序執(zhí)行時(shí),data和data_end字段分別是數(shù)據(jù)包開始和結(jié)束的指針,它們是用來獲取和解析傳來的數(shù)據(jù),第三個(gè)值是data_meta指針,初始階段它是一個(gè)空閑的內(nèi)存地址,供XDP程序與其他層交換數(shù)據(jù)包元數(shù)據(jù)時(shí)使用。最后兩個(gè)字段分別是接收數(shù)據(jù)包的接口和對(duì)應(yīng)的RX隊(duì)列的索引。當(dāng)訪問這兩個(gè)值時(shí),BPF代碼會(huì)在內(nèi)核內(nèi)部重寫,以訪問實(shí)際持有這些值的內(nèi)核結(jié)構(gòu) struct xdp_rxq_info。
XDP輸出參數(shù)在處理完一個(gè)數(shù)據(jù)包后,XDP程序會(huì)返回一個(gè)動(dòng)作(Action)作為輸出,它代表了程序退出后對(duì)數(shù)據(jù)包應(yīng)該做什么樣的最終裁決,也是在內(nèi)核頭文件bpf.h 定義了以下5種動(dòng)作類型:
可以看出這個(gè)動(dòng)作的本質(zhì)是一個(gè)int值。前面4個(gè)動(dòng)作是不需要參數(shù)的,最后一個(gè)動(dòng)作需要額外指定一個(gè)NIC網(wǎng)絡(luò)設(shè)備名稱,作為轉(zhuǎn)發(fā)這個(gè)數(shù)據(jù)包的目的地。
XDP的位置
最顯而易見的是,竟然可以在如此低的層面上把數(shù)據(jù)包丟棄或者回彈回去,如果面臨DDoS攻擊,采用這種方式的話,數(shù)據(jù)包就沒有必要上升到Netfilter層面再被丟棄了。說白了,XDP允許數(shù)據(jù)包在進(jìn)入Linux協(xié)議棧之前就能受到判決。這相當(dāng)于在網(wǎng)卡驅(qū)動(dòng)層面運(yùn)行了一個(gè)eBPF程序,該程序決定數(shù)據(jù)包何去何從。 而且,假設(shè)我們經(jīng)過目標(biāo)網(wǎng)絡(luò)設(shè)備的Ingress流量被我們的XDP程序drop了,專業(yè)術(shù)語叫RX流向。那么Egress流量是否也會(huì)被drop掉呢? 答案是,不會(huì)。XDP hook不會(huì)作用到Egress流量,也就是TX流向。
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1378瀏覽量
40339 -
Linux
+關(guān)注
關(guān)注
87文章
11326瀏覽量
209961 -
網(wǎng)絡(luò)設(shè)備
+關(guān)注
關(guān)注
0文章
317瀏覽量
29706
原文標(biāo)題:崔鵬程: 初識(shí)XDP
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論