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