與EBPF相關的令人敬畏的項目的精心策劃列表。
BPF(如伯克利數據包過濾器中)是一種從用戶空間傳遞的內核虛擬機。最初在BSD,然後是Linux上實現的(現為遺產)“經典BPF”或CBPF計算機將與TCPDUMP之類的工具一起使用,用於過濾內核中的數據包,以避免使用用戶空間的無用副本。最近,Linux中的BPF基礎架構已完全重新設計,並賦予了“擴展的BPF”或EBPF的生命,該基礎架構獲得了新功能(安全性和終止檢查,用於程序,持久地圖,標準庫,硬件卸載支持等),現在用於許多任務。處理非常低級別(XDP)的處理數據包,系統上的跟踪和監視事件,或對CGROUP進行訪問控制只是EBPF帶來性能,可編程性和靈活性的一些示例。
最近,Cilium推出了一個關於EBPF的很棒的網站,稱為EBPF.IO。它具有與此列表相似的目的,並介紹了EBPF並鏈接到相關項目。
注意:EBPF是一項令人興奮的技術,其生態系統正在不斷發展。我們希望您能為您提供幫助,以使這一出色的列表保持最新狀態,並以我們可以提高其信噪比。請隨時留下任何反饋。
bpf(2) - 關於bpf()系統調用的手冊頁,用於管理BPF程序和用戶空間中的地圖。tc-bpf(8) - 有關將BPF與TC一起使用的手冊頁,包括示例命令和代碼示例。bpf-helpers(7)人頁 - 內核內幫手功能的描述,形成了BPF標準庫。IO遮陽板的非官方EBPF規格 - EBPF語法和操作代碼的摘要。
Jesper Dangaard Brouer的文檔 - 正在進行的工作,歡迎捐款。
從戴維·米勒(David Miller)到XDP紐比斯郵件列表的電子郵件:
每個內核版本的BPF功能列表
如果您是EBPF的新手,則可能需要嘗試本節中描述的“介紹”的鏈接。
簡要介紹XDP和EBPF-可訪問的簡介提供了上下文,歷史記錄以及有關EBPF功能的詳細信息。
EBPF概述 - Adrian Ratiu的博客系列,涵蓋EBPF基礎架構的許多方面:
Ferris Ellis關於EBPF的博客文章 - 他們有一些有關EBPF的文章:
BPF參考指南 - 關於BCC存儲庫的BPF C和BCC Python幫助者。
通過BPF和XDP使內核的網絡數據路徑可以編程 - 一組幻燈片涵蓋了有關EBPF和XDP的所有基礎知識(主要用於網絡處理)。
BSD數據包過濾器 - 簡介主要涵蓋了追踪方面。
BPF:跟踪等等 - 介紹主要涵蓋追踪方面。
Linux BPF SuperPowers-簡介主要涵蓋了帶有火焰圖的第一部分。
IO遮陽板 - 還介紹了IO遮陽板項目。
BPF-內核虛擬機 - 由EBPF的作者演示。
擴展了擴展BPF-從2014年開始的一篇博客文章,介紹了BPF的開發並通過將EBPF程序附加到套接字上,以使用狀態套接字過濾的示例來說明它可以做什麼。
格雷格·馬斯登(Greg Marsden)提供了一些有關EBPF的文件:
Linux內核通過EBPF的可觀察性 - 涵蓋EBPF的基礎知識的博客文章以及如何在如何構建和加載最小的EBPF程序中的代碼樣本中。
EBPF-從程序員的角度來看 - 一篇簡短的論文描述了EBPF的基礎知識以及如何開始編寫EBPF程序。
CloudFlare在EBPF上的博客文章 - 有關網絡用例和EBPF低級方面的不同博客文章。
Linux擴展BPF(EBPF)跟踪工具 - 圍繞使用EBPF的性能分析工具的示例的深入信息集合。在頁面末尾還包含有關其他資源的部分。
EBPF的初學者指南 - 一組實時編碼對話和隨附的代碼示例,使用各種庫和程序類型介紹EBPF編程。
丹尼爾·伯克曼(Daniel Borkmann)做了幾篇演講和論文,涵蓋了EBPF的內部,特別是關於與TC的使用。
IO遮陽板博客
Linux網絡解釋了 - Linux網絡內部設備,有關EBPF的一部分。
Express數據路徑 - 對XDP的非常易於訪問的介紹,提供了示例代碼以顯示如何處理數據包。
技術論文中的所有XDP詳細信息:Express數據路徑:操作系統內核中的快速可編程數據包處理,TokeHøiland-Jørgensen,Jesper Dangaard Brouer,Daniel Borkmann,John Fastabend,Tom Fastabend,Tom Herbert,David Ahern和David Ahern,都是必不可少的EBPF和XDP貢獻者。
XDP的進行工作文檔
BPF和XDP參考指南 - Cilium Project的指南。
XDP項目概述
Express Data Path(XDP) - 關於XDP的第一個介紹。
BOF- BPF可以為您做什麼?
Express數據路徑 - 包含使用MLX4驅動程序獲得的一些基準結果。
Jesper Dangaard Brouer有幾套幻燈片描述XDP的內部:
XDP研討會 - 簡介,經驗和未來開發(視頻)
Linux上的高速數據包過濾 - 關於Linux上的數據包過濾,DDOS保護,內核中的數據包處理,內核旁路,XDP和EBPF。
如何刪除每秒1000萬個數據包-Cloudflare的博客文章,談論他們使用XDP進行數據包過濾的轉移。
xt_bpf模塊的iptables使用BPF字節碼。tc ,以及用於管理XDP程序的ip 。與BPF相關的大多數代碼都在lib/bpf.c中。LLVM-包含EBPF工作流中使用的幾種工具。可以從此處檢索到Ubuntu/Debian的最新版本的快照。
cargo generate 。bpftool-也在內核樹中的其他一些工具,在Linux/Tools/net/for for 4.15之前的版本或Linux/Tools/bpf/之後:
bpftool可用於與用戶空間中的EBPF程序和地圖進行交互的通用實用程序,例如顯示,轉儲,加載,拆卸,固定,PIN程序,或顯示,創建,固定,更新,刪除地圖,或將程序連接和分離為Cgroups。bpf_asm最小CBPF組裝程序。bpf_dbg CBPF程序的小型調試器。bpf_jit_disasm兩種BPF口味的拆卸器,對於JIT調試可能非常有用。P4與EBPF有一些互動:
Cilium Project(GitHub存儲庫)是一項依靠BPF和XDP的技術,可以為基於Fly Fly生成的EBPF程序的容器提供“快速內核網絡和安全策略執行”。許多演示文稿可用(重疊):
Open Vswitch(OVS)及其相關項目開放虛擬網絡(OVN,開源網絡虛擬化解決方案)正在考慮在各個級別使用EBPF:
Katran-基於XDP的第4層負載 - 平衡器,由Facebook開源。
實踐中XDP:在我們的DDOS緩解管道中集成XDP - 在CloudFlare的XDP對DDOS的保護。
液滴:由BPF + XDP驅動的DDOS對策 - 在Facebook上使用XDP對DDOS進行保護。
DPDK具有基於AF_XDP的投票模式驅動程序(PMD)
CETH用於XDP-更快網絡I/O的常見以太網驅動程序框架,這是Mellanox發起的一項技術。
開源侵入檢測系統Suricata依靠EBPF組件的“捕獲旁路”功能:
Project Calico -Calico是用於容器,虛擬機和基於本機主機工作負載的開源網絡和網絡安全解決方案。 Calico的EBPF數據平面具有富含網絡安全策略模型的低潛伏期,高吞吐量數據平面。
MERBRIDGE-使用EBPF加快服務網格。 Merbridge用EBPF替換Iptables規則以攔截流量。它還結合了msg_redirect,以減少延遲,並在旁邊和服務之間縮短數據路徑。
PCApplusplus-一個開源C ++庫,用於捕獲,解析和製作網絡數據包。它具有用於創建AF_XDP插座的C ++接口,從而易於通過它們發送和接收數據包。
linux/include/linux/bpf.h-與linux/include/upli/uapi/bpf.h:與EBPF相關的定義,分別在內核中使用並與用戶空間程序進行交互。
linux/include/linux/filter.h-與linux/include/uapi/filter.h:用於運行BPF程序本身的信息。
linux/kernel/bpf/ - 此目錄包含大多數與BPF相關的代碼。特別是這些文件值得:
syscall.c系統調用允許的不同操作,例如程序加載或地圖管理。core.c -BPF解釋器。verifier.c -BPF驗證者。linux/net/core/filter.c-功能和與網絡有關的EBPF幫助者(TC,XDP等);還包含將CBPF字節遷移到EBPF的代碼(所有CBPF程序均在最近的內核中轉換為EBPF)。
linux/bernel/trace/bpf_trace.c-功能和EBPF幫助者與跟踪和監視有關(Kprobes,TracePoints等)。
JIT編譯器位於其各自架構的目錄下,例如File Linux/Arch/x86/net/bpf_it_comp.c for x86。對於用於硬件卸載的JIT編譯器,坐在驅動程序中,例如Linux/drivers/net/net/ethernet/netronome/nfp/nfp/bpf/jit.c,用於NetRonome NFP。
linux/net/sched/ - ,尤其是在文件中act_bpf.c (action)和cls_bpf.c (filter):與BPF操作和使用TC相關的代碼。
Linux/kernel/seccomp.c
linux/net/core/dev.c-包含函數dev_change_xdp_fd() ,該函數通過NetLink命令調用以將XDP程序掛接到設備,然後將IS從用戶空間加載到內核之後。依次使用此功能使用相關驅動程序的回調。
感謝Quentin Monnet和Daniel Borkmann在Dive In Toive中的最初工作:閱讀材料的清單,這成為了此列表的基礎。
歡迎捐款!首先閱讀貢獻指南。
根據法律的可能,Zoidbergwill放棄了所有版權以及這項工作的相關或鄰近權利。