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