基于eBPF技術構建一種應用層網絡管控解決方案

引言

隨著網絡應用的不斷發展,在linux系統中對應用層網絡管控的需求也日益增加,而傳統的iptables、firewalld等工具難以針對應用層進行網絡管控。因此需要一種創新的解決方案來提升網絡應用的可管理性。

本文將探討如何使用eBPF技術構建一種應用層網絡管控解決方案,為linux系統上的網絡管控帶來一種新的可能。

相關技術介紹

eBPF

eBPF(Extended Berkeley Packet Filter)是一種在Linux內核中執行安全、可編程的字節碼的技術。它最初是作為傳統的Berkeley Packet Filter(BPF)的擴展而引入的,用于網絡數據包過濾和分析。然而,隨著時間的推移,eBPF已經演變成一種通用的可編程框架,不僅可以用于網絡管控,還可以應用于系統跟蹤、安全監控、性能分析等領域。

eBPF具有靈活性和可擴展性,通過編寫自定義的eBPF程序,開發人員可以根據特定的需求實現各種功能。同時,eBPF還支持動態加載和卸載,使得運行時可以根據需要加載不同的eBPF程序,而無需重新編譯內核。

eBPF的另一個重要特點,那就是它的安全性。eBPF的字節碼在內核中執行之前,會經過嚴格的驗證和限制,以確保它不會對系統的穩定性和安全性造成破壞。這種安全性保證了BPF的可編程性不會成為潛在的安全漏洞。

由于eBPF的這些特性,使其成為現在Linux系統上最炙手可熱的一項技術。例如,開源容器網絡方案Cilium、開源Linux動態跟蹤程序BCC、熟知的bpftrace等,都是基于eBPF技術實現的。換句話說,通過對eBPF字節碼進行驗證和限制,系統能夠保持穩定和安全,同時還能實現BPF的靈活編程能力。

下圖展示了eBPF所支持的所有追蹤點,可以發現eBPF可以探測幾乎所有的子系統:

KProbes

Kprobes是Linux內核中的一種動態跟蹤機制,它允許用戶在內核的關鍵代碼路徑上插入探針,以便在運行時捕獲和分析內核事件。Kprobes可以在內核函數的入口和出口處插入探針,以便觀察函數的調用和返回情況。通過在關鍵代碼路徑上插入探針,就可以收集各種內核事件的信息,如函數調用次數、參數值、返回值等。

eBPF程序可由Kprobes事件驅動,eBPF與Kprobes的結合可以實現內核級別的事件跟蹤和分析。

eBPF Maps

eBPF Maps是一種鍵值對數據結構,類似于傳統編程語言中的字典或哈希表。它由鍵(key)和值(value)組成,程序員可以根據需要定義鍵和值的類型,并在eBPF程序中進行讀取、寫入和更新操作。它可以在用戶空間和內核空間之間進行安全的數據傳輸,避免了傳統用戶空間和內核空間之間的數據拷貝和安全隱患。

NFQUEUE

NFQUEUE利用Netfilter框架中的hook機制,將選定的網絡數據包從內核空間傳遞到用戶空間進行處理。具體的工作流程如下:

配置規則:使用iptables或nftables等工具配置規則,將特定的網絡流量匹配到NFQUEUE。

注冊隊列:在用戶態程序中,通過libnetfilter_queue庫注冊一個NFQUEUE隊列,并指定一個唯一的隊列ID。

數據包傳遞:當匹配到與規則相符的網絡數據包時,內核將其放入相應的NFQUEUE隊列,并將隊列ID與網絡數據包相關聯。

用戶態處理:用戶態程序通過監聽注冊的NFQUEUE隊列,可以接收到內核傳遞的網絡數據包。程序可以對網絡數據包進行處理、修改、過濾或記錄等操作。

決策:在用戶態處理完網絡數據包后,可以根據需要決定是否接受、丟棄、修改或重定向網絡數據包。

有固應用層網絡管控實現

上面介紹了eBPF和NFQUEUE的基本概念,可以發現,eBPF和NFQUEUE都可以將內核中網絡協議棧的網絡數據包轉發到用戶態,下面說明在UOS系統有固中網絡管控方案的具體實現步驟:

使用iptables配置NFQUEUE規則,將系統中的網絡數據包轉發到NFQUEUE隊列,用戶態程序從隊列中獲取數據包,并對這些數據包進行研判,是ACCEPT 還是DROP。但是NFQUEUE隊列中的數據包并不包含應用層信息,無法針對應用層信息進行研判,那么就需要將每個網絡數據包與具體的應用關聯起來。

通過eBPF程序在內核網絡協議棧相關函數的入口和出口處插入Kprobes探針,這里將hook點設為tcp_v4_connect、tcp_v6_connect、security_socket_sendmsg。

每當系統中有網絡流量產生的時候,就可以截獲其中的網絡數據包送入eBPF程序處理。eBPF程序同時可以獲取此時的進程ID(PID),并將PID與數據包進行綁定,在之后處理數據包的時候就可以清晰的知道每個數據包是由哪個進程產生的了。通過eBPF Maps將綁定好PID的網絡流量包送入用戶空間,至此,eBPF程序完成了它的一次任務。當然,對于監控的每個數據包,eBPF程序都需要進行一次這樣的處理。

在用戶空間中,通過PID可以獲取到進程的相關信息,例如啟動時間、文件路徑、進程狀態等,將這些信息收集起來保存供后續使用。

用戶態程序通過數據包的 IP、端口、協議類型等信息將NFQUEUE隊列中的數據包與eBPF模塊捕獲的數據包關聯起來,這樣就知道NFQUEUE隊列中每個數據包對應的進程信息。

將NFQUEUE隊列中的數據包送入規則引擎,對比配置好的流量規則,對數據包作出研判。

優勢

傳統的linux網絡管控方案如iptables、firewalld等都只能工作在網絡層和傳輸層,而該網絡方案可以將網絡管控擴展到應用層。對比firewalld的XML模版,該方案在真正意義上實現了對應用層的網絡管控。

規則配置、網絡管控方式更加靈活,該方案可以針對單個應用進行規則配置,由于最后的處理過程是在應用態,而非內核中的netfilter,所以可以實現定制化的管控方式。

不足

由于NFQUEUE會將數據包轉發到用戶態處理,這犧牲了一部分的性能。

在linux的網絡協議棧中,并非所有的網絡流量都可以通過eBPF獲取到對應的進程信息,當前測試比較穩定的是應用程序的出口流量。

展望

eBPF是一項創新且強大技術,在過去的 eBPF summit 2022中,《The future of eBPF in the Linux Kernel》展望了 eBPF 的發展方向,其中包括:

更完備的編程能力:當前 eBPF 的編程能力存在一些局限性(比如不支持變量邊界的循環,指令數量受限等),演進目標提供圖靈完備的編程能力。

更強的安全性:支持類型安全,增強運行時 Verifier,演進目標是提供媲美 Rust 的安全編程能力。

更廣泛的移植能力:增強 CO-RE,加強 Helper 接口可移植能力,實現跨體系、平臺的移植能力。

更強的可編程能力:支持訪問/修改內核任意參數、返回值,實現更強的內核編程能力。

結合以上eBPF即將會實現的新特性,應用層的網絡管控可以在eBPF模塊中直接實現,這樣一來在降低性能開銷的同時,也提升了網絡管控的靈活性。未來,可以期待更多基于eBPF的應用層網絡管控方案出現,用于實現強大的應用層流量分析、智能的流量調度、自動化的安全防御和靈活的網絡管控。這將為網絡管理人員和開發人員提供更多的工具和技術,以應對不斷增長的網絡挑戰和需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38718.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38718.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38718.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【CSS】禁用元素鼠標事件(例如實現元素禁用效果)

文章目錄 基本用法 基本用法 pointer-events 屬性指定在什么情況下 (如果有) 某個特定的圖形元素可以成為鼠標事件。實際運用中可以通過對auto 和none動態控制,來動態實現元素的禁用效果。 屬性描述auto與pointer-events屬性未指定時的表現效果相同,對…

【筆試題心得】排序算法總結整理

排序算法匯總 常用十大排序算法_calm_G的博客-CSDN博客 以下動圖參考 十大經典排序算法 Python 版實現(附動圖演示) - 知乎 冒泡排序 排序過程如下圖所示: 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。對每一對相鄰…

【LeetCode-簡單】劍指 Offer 29. 順時針打印矩陣(詳解)

題目 輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數字。 示例 1: 輸入:matrix [[1,2,3],[4,5,6],[7,8,9]] 輸出:[1,2,3,6,9,8,7,4,5]示例 2: 輸入:matrix [[1,2,3,4],[5,6,7,8],[9,10,1…

互聯網發展歷程:速度與效率,交換機的登場

互聯網的演進就像一場追求速度與效率的競賽,每一次的技術升級都為我們帶來更快、更高效的網絡體驗。然而,在網絡的初期階段,人們面臨著數據傳輸速度不夠快的問題。一項關鍵的技術應運而生,那就是“交換機”。 速度不足的困境&…

CloudEvents—云原生事件規范

我們的系統中或多或少都會用到如下兩類業務技術: 異步任務,用于降低接口時延或削峰,提升用戶體驗,降低系統并發壓力;通知類RPC,用于微服務間狀態變更,用戶行為的聯動等場景; 以上兩種…

Go和Java實現解釋器模式

Go和Java實現解釋器模式 下面通過一個四則運算來說明解釋器模式的使用。 1、解釋器模式 解釋器模式提供了評估語言的語法或表達式的方式,它屬于行為型模式。這種模式實現了一個表達式接口,該接口 解釋一個特定的上下文。這種模式被用在 SQL 解析、符…

規劃性和可擴展性,助力企業全面預算管理的推進

對于當今社會經濟市場的不穩定狀況和不斷變化的消費者行為,企業業務也從未像今天這樣不可預測過。面對變化和變革,企業需要具備規劃性的預測能力,才能使得自身在競爭中保持領先地位。那些具備前瞻性的企業都嘗試在現階段通過更好的規劃不斷提…

基于Mysqlrouter+MHA+keepalived實現高可用半同步 MySQL Cluster項目

目錄 項目名稱: 基于Mysqlrouter MHA keepalived實現半同步主從復制MySQL Cluster MySQL Cluster: 項目架構圖: 項目環境: 項目環境安裝包: 項目描述: 項目IP地址規劃: 項目步驟: 一…

windows11下配置vscode中c/c++環境

本文默認已經下載且安裝好vscode,主要是解決環境變量配置以及編譯task、launch文件的問題。 自己嘗試過許多博客,最后還是通過這種方法配置成功了。 Linux(ubuntu 20.04)配置vscode可以直接跳轉到配置task、launch文件,不需要下載mingw與配…

寬度有限搜索BFS搜索數及B3625 迷宮尋路 P1451 求細胞數量 B3626 跳躍機器人

寬度有限搜索BFS搜索 B3625 迷宮尋路 題面 題目描述 機器貓被困在一個矩形迷宮里。 迷宮可以視為一個 nm 矩陣,每個位置要么是空地,要么是墻。機器貓只能從一個空地走到其上、下、左、右的空地。 機器貓初始時位于 (1,1) 的位置,問能否…

localhost:8080 is already in use

報錯原因:本機的8080端口號已經被占用。因為機器的空閑端口號是隨機分配的,而idea默認啟動的端口號是8080,所以是存在這種情況。 對于這個問題,我們只需要重啟idea或者修改項目的啟動端口號即可。 更推薦第二種。對于修改項目啟動端口號&…

Python 程序設計入門(020)—— 循環結構程序設計(1):for 循環

Python 程序設計入門(020)—— 循環結構程序設計(1):for 循環 目錄 Python 程序設計入門(020)—— 循環結構程序設計(1):for 循環一、for 循環的語法二、for …

ZDH-wemock模塊

本次介紹基于版本v5.1.1 目錄 項目源碼 預覽地址 安裝包下載地址 wemock模塊 wemock模塊前端 配置首頁 配置mock wemock服務 下載地址 打包 運行 效果展示 項目源碼 zdh_web: https://github.com/zhaoyachao/zdh_web zdh_mock: https://github.com/zhaoyachao/z…

TCGA數據下載推薦:R語言easyTCGA包

#使用easyTCGA獲取數據 #清空 rm(listls()) gc() # 安裝bioconductor上面的R包 options(BioC_mirror"https://mirrors.tuna.tsinghua.edu.cn/bioconductor") if(!require("BiocManager")) install.packages("BiocManager") if(!require("TC…

怎樣讓音頻速度變慢?請跟隨以下方法進行操作

怎樣讓音頻速度變慢?在會議錄音過程中,經常會遇到主講人語速過快,導致我們無法清晰聽到對方說的內容。如果我們能夠減慢音頻速度,就能更好地記錄對方的講話內容。此外,在聽到快速播放的外語或方言時,我們也…

LA@2@1@線性方程組和簡單矩陣方程有解判定定理

文章目錄 矩陣方程有解判定定理線性方程組有解判定特化:齊次線性方程組有解判定推廣:矩陣方程 A X B AXB AXB有解判定證明推論 矩陣方程有解判定定理 線性方程組有解判定 線性方程組 A x b A\bold{x}\bold{b} Axb有解的充分必要條件是它的系數矩陣A和增廣矩陣 ( A , b ) (A,…

機器人的運動范圍

聲明 該系列文章僅僅展示個人的解題思路和分析過程,并非一定是優質題解,重要的是通過分析和解決問題能讓我們逐漸熟練和成長,從新手到大佬離不開一個磨練的過程,加油! 原題鏈接 機器人的運動范圍https://leetcode.c…

高等數學教材重難點題型總結(二)導數與微分

本章重點題目較少,除了*標題頁沒什么特別難的,本帖出于總結性的角度考慮并未囊概全部的*標,最后會出一期*標題的全部內容整理,在攻克重難點的基礎上更上一層樓。 1.根據定義求某點處的導數值 2.通過定義證明導數 3.左右導數的相關…

【數據庫】P4 過濾數據 WHERE

過濾數據 WHERE 簡介WHERE 子句操作符檢測單個值案例范圍值檢查 BETWEEN AND空值檢查 NULL 簡介 數據庫表一般包含大量的數據,很少需要檢索表中的所有行。我們只檢索所需數據需要指定搜索條件(search criteria),搜索條件也稱為過濾條件(filter conditio…

完全備份、增量備份、差異備份、binlog日志

Top NSD DBA DAY06 案例1:完全備份與恢復案例2:增量備份與恢復案例3:差異備份與恢復案例4:binlog日志 1 案例1:完全備份與恢復 1.1 問題 練習物理備份與恢復練習mysqldump備份與恢復 1.2 方案 在數據庫服務器192…