BPF程式型別

2021-10-21 10:09:59 字數 2499 閱讀 3235

跟蹤類程式可以提供系統行為和系統硬體的直接資訊。它們可以訪問特定記憶體區域,從執行程序中提取執行跟蹤資訊。還可以直接訪問為每個特定程序分配的資源,包括檔案描述符、cpu和記憶體。

網路類程式可以檢測和控制系統的網路流量。它們可以對網路介面的資料報進行過濾,甚至可以完全拒絕資料報。可以將bpf程式附加到網路驅動程式接受資料報的網路事件上,也可以將bpf程式附加到資料報傳遞給使用者空間的網路事件上。

bpf kprobe程式型別允許使用bpf程式作為kprobe的處理程式,當被檢測核心函式觸發時,執行bpf程式,程式型別被定義為bpf_prog_type_kprobe。kprobe 是動態附加到核心呼叫點的函式,編寫附加到kprobe模組上的bpf程式時,需要確定bpf程式的執行時機,也就是確定bpf程式是在核心函式呼叫開始時執行,還是核心函式呼叫結束返回時執行。

tracepoint 程式是核心**的靜態標記,允許注入跟蹤和除錯相關的任意**,它會附加到核心提供的跟蹤點處理程式上,程式型別被定義為bpf_prog_type_tracepoint。因為tracepoint需要在核心中預先定義,所以靈活性不如kprobe,但是tracepoint引入核心後,可以保證穩定性,而且除錯核心時,可以提供更高的可**性。

系統中所有的跟蹤點都定義在/sys/kernel/debug/traceing/events目錄中:

xdp程式定義了一些對資料報控制的操作,用於決定如何處理資料報。當網路包到達核心時,xdp程式會在早期被執行,程式型別被定義為bpf_prog_type_xdp。資料報控制情況:

perf事件程式將bpf**附加到perf事件上,當perf產生分析資料時,執行bpf程式,程式型別定義為bpf_prog_type_perf_event。perf是核心的內部分析器,可以產生硬體和軟體的效能資料事件,我們可以用perf事件程式監控系統很多資訊。

cgroup 套接字bpf程式可以將bpf邏輯附加到控制組(cgroup)上,該程式允許cgroup在其包含的程序中控制網路流量,程式型別定義為bpf_prog_type_cgroup_skb。該型別的bpf程式附加到cgroup上對於容器環境很有用,在容器環境中,容器程序組收到cgroup限制,可以對所有容器程序使用相同策略,無需單獨識別每個程序。

cgroup開啟套接字bpf程式允許cgroup內的任何程序開啟網路套接字時執行**,它不是訪問網路資料報,而是程序開啟新套接字時進行控制,程式型別定義為bpf_prog_cgroup_sock。該型別的bpf程式可以對開啟套接字的程式組提供訪問控制和增加安全性,而不必單獨限制每個程序的功能。

套接字選項bpf程式在資料報通過核心網路棧的多個階段中轉時,允許執行時修改套接字連線選項,它可以在套接字連線的生命週期中被多次呼叫,程式型別定義為bpf_prog_type_sock_ops。當建立該型別的bpf程式時,函式呼叫會收到op引數,該引數表示核心在套接字連線上將執行的操作。通過這個引數,可以知道程式被呼叫時發生在連線生命週期的哪個階段,進而可以訪問網路ip位址和連線埠號等資料,還可以修改連線選項、設定超時、更改給定資料報的往返延時時間等。

套接字對映bpf程式可以訪問套接字對映和套接字重定向,該型別定義為bpf_prog_type_sk_skb。該型別bpf程式可以實現負載平衡功能,通過跟蹤多個套接字,可以在核心空間多個套接字之間**網路資料報,還可以控制網路流量。

cgroup裝置bpf程式可以決定是否能在給定裝置商執行cgroup操作,型別定義為bpf_prog_typpe_cgroup_device。可以編寫該型別bpf程式,從而更加靈活地設定許可權。

套接字訊息傳遞bpf程式可以控制是否將訊息傳送到套接字,程式型別定義為bpf_prog_type_sk_msg。

原始跟蹤點以核心原始格式訪問跟蹤點引數,這種格式提供了核心正在執行任務的更多詳細資訊,但它會有少許效能開銷,程式型別定義為bpf_prog_type_raw_trace。

cgroup 套接字位址bpf程式允許操作cgroup控制的使用者空間程式的ip位址和埠號,程式型別定義為bpf_prog_cgroup_sock_addr。

核心中有個選項叫做so_reuseport,它允許相同主機上多個程序繫結相同的埠。該選項可以使可接受的網路連線提高,從而獲得較高的效能。

套接字重用埠bpf程式掛鉤到核心用來確定是否要重用埠,該型別定義為bpf_prog_type_sk_reuseport。bpf程式邏輯修改重用埠情況:

核心中有個元件叫做流量解析器,用於跟蹤網路資料報經過的不同層,從網路資料報到達系統再到網路資料報傳送給使用者空間程式,它允許使用不同分類方法對資料報進行控制。

流量解析bpf程式將程式邏輯掛鉤到流量解析路徑上,提供核心解析器沒有的安全保證,可以修改核心網路資料報流,型別定義為bpf_prog_type_flow_dissector。

網路分類bpf程式:

bpf_prog_type_sched_cls和bpf_prog_type_sched_act這兩類bpf程式允許對網路流量進行分類,並修改套接字緩衝區中資料報某些屬性。

還有輕量級隧道bpf程式、紅外裝置bpf程式等。

基於c語言的BPF程式

當你在使用bpf程式時,你需要去指定哪種型別的程式在執行。型別將會告訴程式,你的 將在核心的哪個地方被執行。同時,它也會告訴bpf虛擬機器的verifier,哪種型別的bpf helper將會被允許使用。當你選擇了程式型別,你同時也選擇了你的 要實現的相關介面。該介面將確保你可以訪問你想要的資料 想...

BPF高階 使用BPF過濾固定特徵報文

這篇文章主要介紹如何使用bpf過濾固定特徵報文 參考文章 4.7 release 前兩篇文章分別介紹了bpf在android中的運用例項,以及bpf規則指令的解析,相信大家對bpf及其規則都有了大致的了解。現在我們來看看如何運用bpf來過濾固定特徵的報文,從這個過程中加深對bpf規則的了解和運用。i...

BPF技術學習分享

bpf is a highly flexible and efficientvirtual machine like constructin thelinux kernelallowing toexecute bytecodeat varioushook pointsin a safe manner...