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