
Cilium 策略 BPF Map 查詢全指南cilium-dbg bpf policy get 命令詳解【免費下載鏈接】ciliumeBPF-based Networking, Security, and Observability項目地址: https://gitcode.com/GitHub_Trending/ci/cilium導讀cilium-dbg bpf policy get是 Cilium 數據面排障工具鏈中用于直接讀取策略 BPF MapPolicy BPF Map內容的核心命令它繞過用戶態 API直擊內核 eBPF Map 中實際生效的每一條策略條目。本文以 cilium-dbg_bpf_policy_get.md 為骨架結合 bpf_policy_get.go 及其底層 policymap 包 的源碼實現完整講解該命令的參數、輸出字段含義、源碼調用鏈與排障實戰用法。讀完本文你將能夠精準定位某個 Endpoint 上實際落盤到內核的策略條目區分 Allow/Deny、識別代理端口與認證要求并用 JSON/YAML 結構化輸出接入自動化排查流程。命令概覽什么是Policy BPF Map在 Cilium 的數據面架構中網絡策略并非只存在于 Kubernetes CRD 或用戶態內存中最終都會被編譯為 eBPF 程序與 eBPF Map。其中Policy Map策略 BPF Map是每個 Endpoint 獨立持有的一張哈希表鍵Key由流量方向 對端身份 端口/協議構成值Value描述該條策略的動作允許/拒絕、代理端口、認證要求與統計信息。cilium-dbg bpf policy get正是用于直接查看這張內核 Map 中的條目是判斷策略到底有沒有真正生效數據面與期望策略是否一致的最底層證據來源。其父命令為 cilium-dbg bpf policyManage policy related BPF maps同一子命令族還包括list、add、delete。命令基本語法如下cilium-dbg bpf policy get [flags]從源碼 bpf_policy_get.go 可以看到該命令的執行入口首先調用common.RequireRootPrivilege強制要求 root 權限因為需要直接打開 BPF Map隨后依據是否指定--all走兩條路徑--all遍歷并轉儲本節點所有 Endpoint 的策略 Map默認接收一個 Endpoint ID或保留身份名只轉儲該 Endpoint 的策略 Map。參數詳解專屬選項參數簡寫類型默認值說明--all—boolfalse轉儲本節點上全部策略 BPF Map等價于遍歷cilium_policy_*文件并逐個輸出--numeric-nboolfalse不解析身份 ID 對應的標簽直接以數字形式輸出身份標識--output-ostring—輸出格式json、yaml或jsonpath{}--help-h——查看命令幫助這些標志的注冊位于 bpf_policy_get.go 的init()中其中--numeric綁定到變量printIDs--all綁定到allList--output通過command.AddOutputOption注入。繼承自父命令的通用選項--config string 配置文件路徑默認 $HOME/.cilium.yaml -D, --debug 啟用調試消息 -H, --host string Server API 的 URI --log-driver strings 日志端點例如 syslog --log-opt map 日志驅動選項例如 formatjson這些選項由cilium-dbg根命令統一提供其中-H用于指定 Cilium Agent 的 API 地址當--numeric未開啟時命令會通過該 API 將身份 ID 解析為標簽集合。實戰用法1. 查詢單個 Endpoint 的策略 Map直接以 Endpoint ID 作為位置參數傳入cilium-dbg bpf policy get 1234輸出示例字段含義見下節POLICY DIRECTION LABELS (source:key[value]) PORT/PROTO PROXY PORT AUTH TYPE BYTES PACKETS PREFIX COOKIE Allow Ingress k8s:appfrontend 80/TCP NONE disabled - - 68 0 Allow Ingress reserved:host ANY NONE disabled - - 48 0Endpoint ID 同時支持兩種形式解析邏輯位于 helpers.go 的endpointToPolicyMapPath純數字 ID解析為uint16后拼出 Map 名如cilium_policy_v3_1234Map 名前綴常量MapName cilium_policy_v3_定義于 policymap.go保留身份名如host、world等轉換為cilium_policy_v3_reserved_N形式。若傳入的 ID 無法解析命令會以Failed to parse endpointID %q報錯退出見 bpf_policy_get.go。2. 轉儲所有 Endpoint 的策略 Mapcilium-dbg bpf policy get --alllistAllMapsbpf_policy_get.go會使用filepath.Glob匹配cilium_policy_*模式逐一打開并輸出每個 Map每個 Map 前會打印Endpoint ID與PathBPF Map 在文件系統中的掛載路徑。若本節點不存在任何策略 Map則輸出no maps found。該功能與cilium-dbg bpf policy listbpf_policy_list.go完全等價后者的Short描述即為 Dump all policy maps。3. 不解析標簽只看數字身份當 Cilium Agent API 不可用或希望獲得最原始的 Map 內容時加上-ncilium-dbg bpf policy get -n 1234此時身份列直接輸出數字身份 ID如104輸出表頭也從LABELS (source:key[value)]變為IDENTITY。4. 結構化輸出JSON / YAML / jsonpathcilium-dbg bpf policy get --all -o json cilium-dbg bpf policy get 1234 -o yaml cilium-dbg bpf policy get 1234 -o jsonpath{range .items[*]}{.Key.Identity}{\n}{end}--all模式下 JSON 輸出為包含EndpointID、Path、Content三字段的對象數組對應源碼中的policyMap結構體bpf_policy_get.go單 Endpoint 模式則直接輸出策略條目數組。結構化輸出由command.PrintOutput統一處理便于接入監控與自動化巡檢腳本。輸出字段逐列解讀輸出采用tabwriter對齊共 10 列表頭定義見 bpf_policy_get.go列名含義取值說明POLICY策略動作Allow或Deny由條目 Flags 中的 deny 位決定stat.IsDeny()DIRECTION流量方向Ingress/Egress對應策略編譯時的方向源碼中由 trafficdirection 包 的TrafficDirection.String()輸出IDENTITY/LABELS (source:key[value])對端身份默認解析為標簽列表如k8s:appfrontend-n時輸出數字 ID未解析到的保留身份顯示為ANY源碼中reserved:unknown會被替換為ANYbpf_policy_get.goPORT/PROTO目的端口/協議常見形式80/TCP完全匹配、ANY協議與端口均通配、4000-4999/TCP部分通配端口區間端口表示邏輯見PolicyKey.PortProtoString()policymap.goPROXY PORT代理端口若該條策略需要流量重定向到代理如 L7 策略顯示代理監聽端口否則為NONEAUTH TYPE認證要求如disabled該字段來源于AuthRequirement.AuthType()對應 Cilium 的 Mutual Authentication 能力BYTES累計字節數來自策略統計 Map不可用時顯示-StatNotAvailable即uint64最大值見 statsmap.goPACKETS累計包數同上不可用時顯示-PREFIX鍵前綴長度編碼端口/協議匹配范圍的位數如完全匹配端口時為 68僅匹配協議為 64 或 48 等見GetPrefixLenCOOKIE策略日志 Cookie用于策略審計日志關聯的 32 位標識未設置時為 0當一個身份對應多個標簽時該條策略會按標簽逐行展示首行含其余列后續行僅縮進補充標簽便于人工閱讀。源碼級原理剖析調用鏈cilium-dbg bpf policy get endpoint-id └─ common.RequireRootPrivilege 校驗 root └─ requireEndpointID 校驗/解析 Endpoint ID[helpers.go](https://link.gitcode.com/i/c08b2c905b8ea35b69bf23ddd521cf15) └─ endpointToPolicyMapPath ID → BPF Map 文件路徑[helpers.go](https://link.gitcode.com/i/865a0a18decf8c2c095750b8f39e6ca3) └─ mapContent ├─ policymap.OpenPolicyMap 打開內核 Map[policymap.go](https://link.gitcode.com/i/c6e7d72cc723c782f16b1a389bc2abcc#L472) └─ m.DumpToSlice() 遍歷鍵值對[policymap.go](https://link.gitcode.com/i/c6e7d72cc723c782f16b1a389bc2abcc#L380-L399) └─ sort.Slice(statsMap, statsMap.Less)按策略類型/方向/身份排序 └─ printTable / command.PrintOutput 文本或結構化輸出數據從內核到屏幕的流轉打開 MapmapContentbpf_policy_get.go通過policymap.OpenPolicyMap打開對應 Map 文件句柄隨后調用DumpToSlice使用DumpWithCallback逐條遍歷內核 Map 的 Key/Value組裝為PolicyEntryDump內含PolicyEntry、StatsValue與PolicyKey定義見 policymap.go。補充統計DumpToSlice隨后從策略統計 Mapcilium_policystats見 statsmap.go為每條策略條目回填 Packets/Bytes 計數統計不可用時以StatNotAvailable占位展示層將其渲染為-。穩定排序PolicyEntriesDump.Lesspolicymap.go保證輸出順序為Deny 優先于 Allow → 按方向 → 按身份 ID 升序方便人眼對比拒絕條目是否排在允許條目之前。標簽解析未開啟-n時命令會為每個數字身份調用 Agent 的IdentityGetAPI 拉取標簽bpf_policy_get.go若 API 不可用會向 stderr 打印Was impossible to retrieve label ID ...但仍會以數字 ID 形式繼續輸出不影響 Map 內容的完整性。空 Map 提示若 Map 中沒有任何條目命令會打印提示Policy stats empty. Perhaps the policy enforcement is disabled?bpf_policy_get.go提示排查方向——很可能該 Endpoint 的策略執行Policy Enforcement未啟用。測試驗證倉庫在 pkg/maps/policymap/policymap_privileged_test.go 中提供了特權級測試TestPrivilegedPolicyMapDumpToSlice與TestPrivilegedDenyPolicyMapDumpToSlice分別驗證普通策略條目與 Deny 條目經過DumpToSlice后的完整性可作為理解該命令數據來源的參考用例。與同族命令的協同使用策略 Map 的排障通常是一個閉環查詢cilium-dbg bpf policy get endpoint-id/cilium-dbg bpf policy list轉儲全部寫入調試用cilium-dbg bpf policy add 支持add endpoint id traffic-direction identity [port/proto]向 Map 注入條目可選--deny置為拒絕、--cookie設置審計 Cookie見 bpf_policy_add.go底層由updatePolicyKey完成 Key/Value 構造與寫入helpers.go刪除cilium-dbg bpf policy delete endpoint id identity [port/proto]見 bpf_policy_delete.go。典型用法是先用get確認現狀再用add/delete在最小范圍內驗證數據面行為最后通過get復查寫入結果。注意事項與排障要點必須 root 權限命令直接打開/sys/fs/bpf下的 Map 文件非特權用戶會因權限不足失敗。標簽解析依賴 Agent API若-H指定的 Agent 不可達輸出會退化到數字身份此時可結合cilium-dbg identity list對照身份 ID 與標簽的映射。reserved:unknown顯示為ANY這是策略通配所有對端的常見表現并非異常。空輸出先查策略執行開關Policy stats empty提示通常意味著該 Endpoint 的PolicyEnforcement處于default且無任何策略引用或策略尚未下發到數據面。端口區間表示策略 Map 中的端口是帶前綴長度編碼的對應PORT/PROTO列與PREFIX列4000-4999/TCP這類區間表示來源于前綴位掩碼展開見 policymap.go閱讀輸出時不要將其誤解為普通范圍語法。通過cilium-dbg bpf policy get運維與開發者可以繞開所有中間層直接審視 Cilium 數據面最終裁決的真實形態——這是定位策略未生效流量被莫名放行/拒絕類問題的最短路徑。【免費下載鏈接】ciliumeBPF-based Networking, Security, and Observability項目地址: https://gitcode.com/GitHub_Trending/ci/cilium創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考