免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

Cilium 数据面策略 BPF Map 管理指南:cilium-dbg bpf policy 命令详解

Cilium 数据面策略 BPF Map 管理指南:cilium-dbg bpf policy 命令详解 Cilium 数据面策略 BPF Map 管理指南cilium-dbg bpf policy 命令详解【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium导读cilium-dbg bpf policy是 Cilium 提供给运维与网络工程师的一组底层调试命令用于直接查看、增删位于内核中的策略PolicyBPF Map。与通过 Kubernetes CRD 或 Cilium API 下发的高级策略不同这些命令绕开控制面抽象直击数据面事实每一个 Endpoint 都对应一张独立的策略 mapmap 中的每条记录都决定了某个安全身份Identity以何种方向、端口和协议与当前 Endpoint 通信的放行或拒绝结果。阅读完本文你将掌握策略 BPF Map 的命名与键值结构、add/get/list/delete四个子命令的完整参数与输出格式以及如何利用这些命令在排障时确认数据面到底执行了哪条策略。命令总览Manage policy related BPF mapscilium-dbg bpf policy [flags]该命令组用于管理查看与维护Cilium 数据面中与策略相关的 BPF Maps。它的帮助文本定义在 Documentation/cmdref/cilium-dbg_bpf_policy.md属于cilium-dbg bpfDirect access to local BPF maps的子命令组完整命令链为cilium-dbg bpf policy。命令组自身仅有一个帮助参数参数说明-h, --help显示 policy 命令组的帮助信息从父命令继承的通用参数所有cilium-dbg bpf policy子命令都继承自cilium-dbg的通用参数参数说明--config string配置文件路径默认$HOME/.cilium.yaml-D, --debug开启调试信息输出-H, --host stringcilium-agent 服务端 API 的 URI--log-driver strings日志输出端点如syslog--log-opt map日志驱动选项如formatjson子命令一览子命令用途cilium-dbg bpf policy addAdd/update policy entrycilium-dbg bpf policy deleteDelete a policy entrycilium-dbg bpf policy getGet contents of a policy BPF mapcilium-dbg bpf policy listDump all policy maps背景为什么存在策略 BPF Map在 Cilium 的数据面中策略裁决并非由用户态进程逐包完成而是由插入内核的 eBPF 程序执行。策略本身以 LPMLongest Prefix Match三态映射即放行 / 拒绝 / 未知的形式存放在 per-endpoint 的 BPF map 中。每个 Endpoint 的 BPF 程序通过尾调用tail call跳转到该 Endpoint 专属的策略程序并查询这张 map 来完成这个身份能否以该方向访问该端口/协议的裁决。map 的命名前缀定义在 pkg/maps/policymap/policymap.go// MapName is the prefix for endpoint-specific policy maps which map // identityportsdirection to whether the policy allows communication // with that identity on that port for that direction. MapName cilium_policy_v3_即每个 Endpoint 的策略 map 实际名称为cilium_policy_v3_endpoint-id本地命名实际路径前缀由 cilium-agent 的 BPF 目录决定。从源码注释可以看出该前缀经历过两轮语义升级_v2_移除了策略计数accounting字段并引入优先级precedence字段_v3_则因策略身份聚合policy identity aggregation发生了语义变更。这意味着 map 名称与 BPF 程序的格式/语义强绑定升级格式时必须重命名 map 以获得与旧 map、旧程序的干净隔离。键结构PolicyKey每个 map 条目以 PolicyKey 为键其布局必须与 bpf/lib/policy.h 中的struct policy_key严格一致type PolicyKey struct { Prefixlen uint32 align:lpm_key Identity uint32 align:sec_label TrafficDirection uint8 align:egress Nexthdr uint8 align:protocol DestPortNetwork uint16 align:dport // In network byte-order }字段含义PrefixlenLPM 前缀长度决定协议端口通配程度0 表示所有端口16 表示单端口精确匹配Identity对端安全身份的数字 IDsecurity labelTrafficDirection流量方向INGRESS1 / EGRESS2源码常量见 pkg/policy/trafficdirectionNexthdrL4 协议号TCP/UDP/SCTP/ICMP 等DestPortNetwork目的端口网络字节序主机字节序读取通过GetDestPort()完成。值结构PolicyEntry值结构 PolicyEntry 与 bpf/lib/policy.h 中的struct policy_entry对齐type PolicyEntry struct { ProxyPortNetwork uint16 align:proxy_port // In network byte-order Flags policyEntryFlags align:deny AuthRequirement policyTypes.AuthRequirement align:auth_type Precedence policyTypes.Precedence align:precedence Cookie uint32 align:cookie }其中Flags低位用于标记 Deny 模式policyFlagDeny 1 iota高位承载 LPM 前缀长度policyFlagMaskLPMPrefixLen当 Flags 标记 Deny 时该条目即为显式拒绝条目IsDeny()判断见 pkg/maps/policymap/policymap.go。添加与更新策略条目cilium-dbg bpf policy addcilium-dbg bpf policy add endpoint id traffic-direction identity [port/proto] [flags]命令实现位于 cilium-dbg/cmd/bpf_policy_add.go核心逻辑经由 cilium-dbg/cmd/helpers.go 的parsePolicyUpdateArgs→updatePolicyKey完成。位置参数参数必填说明endpoint id是Endpoint ID数字用于定位cilium_policy_v3_idmaptraffic-direction是流量方向ingress或egressidentity是对端安全身份的数字 ID通过cilium-dbg identity list查询[port/proto]否可选端口与协议如80/tcp省略表示所有端口AllPorts0Flags参数说明--deny设置 Deny 模式插入的是显式拒绝条目而非放行条目--cookie uint32设置策略日志 Cookiepolicy log cookie-h, --help帮助信息参数解析细节源码视角从 helpers.go 的parsePolicyUpdateArgsHelper可以确认以下行为至少需要 3 个位置参数否则报错endpoint id, traffic-direction, and identity required方向参数通过parseTrafficString解析为trafficdirection.Ingress或trafficdirection.Egress若省略port/proto端口默认为 0即AllPorts协议列表为{0}全协议若提供端口而未指定协议则遍历u8proto.ProtoIDs为所有协议各插入一条若提供port/proto格式为port[/protocol]协议支持 tcp/udp/sctp/icmp/icmpv6/any大小写不敏感见parseL4PortsSlice也接受 IANA 服务名如http插入时按先身份聚合、再方向、再端口/协议构造 LPM 键policyTypes.KeyForDirection(...).WithIdentity(...).WithPortProto(...)并通过mapEntry.WithDeny(isDeny)决定 Allow/Deny。示例# 允许身份 42 从 ingress 方向访问 endpoint 241 的所有端口 cilium-dbg bpf policy add 241 ingress 42 # 允许身份 42 从 egress 方向访问 endpoint 241 的 80/tcp cilium-dbg bpf policy add 241 egress 42 80/tcp # 拒绝身份 9000 访问 endpoint 241 的 443/tcpdeny 模式 cilium-dbg bpf policy add 241 ingress 9000 443/tcp --deny注意add是Add/update同一键重复添加会覆盖已有条目包括把 Allow 覆盖为 Deny 或反之。删除策略条目cilium-dbg bpf policy deletecilium-dbg bpf policy delete endpoint id identity [port/proto] [flags]命令实现位于 cilium-dbg/cmd/bpf_policy_delete.go。与add相比delete的用法去掉了traffic-direction参数且不提供--deny/--cookieflags。位置参数参数必填说明endpoint id是Endpoint ID数字identity是要删除的对端安全身份数字 ID[port/proto]否与 add 相同的端口/协议格式省略则删除该身份对应的全端口条目示例# 删除 endpoint 241 中身份 42 的全部策略条目 cilium-dbg bpf policy delete 241 42 # 删除 endpoint 241 中身份 42 的 80/tcp 条目 cilium-dbg bpf policy delete 241 42 80/tcp从 helpers.go 的updatePolicyKey(pa, false)可以看到删除同样按协议列表逐条DeleteKey若键不存在会输出Cannot delete policy key ...错误。查看单个 Endpoint 的策略 mapcilium-dbg bpf policy getcilium-dbg bpf policy get [flags]命令实现位于 cilium-dbg/cmd/bpf_policy_get.go。不带参数时默认需要提供 endpoint ID 作为位置参数get会打开对应 map 并 dump 其内容listMap→mapContent→OpenPolicyMapDumpToSlice。Flags参数说明--all遍历 dump 全部策略 map等价于list-n, --numeric不解析 ID直接以数字形式输出 Identity-o, --output string输出格式json、yaml或jsonpath{}-h, --help帮助信息输出列含义默认表格输出包含以下列见 bpf_policy_get.go 的formatMap列含义POLICYAllow或Deny依据 Flags 中的 deny 位DIRECTIONIngress或EgressIDENTITY对端身份数字 ID不带-n时解析为LABELS (source:key[value])标签PORT/PROTO如80/TCP0/ANY表示所有端口PROXY PORT若条目经过代理则显示代理端口号否则为NONEAUTH TYPE认证要求类型如无需认证时为disabledBYTES / PACKETS命中该条目的流量统计不可用时显示-PREFIX端口/协议 LPM 前缀长度0~24COOKIE策略日志 Cookie另外当 map 为空时输出提示Policy stats empty. Perhaps the policy enforcement is disabled?这是排查为什么策略不生效时的第一信号——先确认该 Endpoint 是否开启了策略强制执行。示例# 查看 endpoint 241 的策略 map cilium-dbg bpf policy get 241 # 以数字 ID 形式查看不做标签解析 cilium-dbg bpf policy get 241 -n # 以 JSON 输出便于脚本处理 cilium-dbg bpf policy get 241 -o json # 一次 dump 所有 endpoint 的策略 map cilium-dbg bpf policy get --all批量 dump 全部策略 mapcilium-dbg bpf policy listcilium-dbg bpf policy list [flags]命令实现位于 cilium-dbg/cmd/bpf_policy_list.go并提供了ls别名。list与get --all行为一致通过filepath.Glob(bpf.TCGlobalsPath() /cilium_policy_*)扫描全部策略 map逐个 dump 后按 Endpoint ID 分组打印见 bpf_policy_get.go 的listAllMaps。Flags参数说明-o, --output string输出格式json、yaml或jsonpath{}-h, --help帮助信息示例# 列出所有 endpoint 的策略 map 内容 cilium-dbg bpf policy list # 以 JSON 输出全部策略供 jq 等工具做聚合分析 cilium-dbg bpf policy list -o json在非表格输出下list的结果是一个对象数组每个对象包含EndpointID、Pathmap 的完整路径和Content策略条目列表三个字段policyMap结构见 bpf_policy_get.go。权限与运行前提所有四个子命令在执行时都会调用common.RequireRootPrivilege(...)见各命令源码因此必须以 root 或具备相应能力的用户运行命令要求所在主机上运行着 cilium-agent且 BPF map 存在于默认路径由bpf.TCGlobalsPath()决定通常在/sys/fs/bpf/tc/globals/下get/list在解析 Identity 标签时需要访问 cilium-agent 的 APIclient.IdentityGet若 agent 不可达标签列会退化为数字 ID 并输出告警Was impossible to retrieve label ID ...此时可加-n直接使用数字。典型排障流程确认策略是否下发到数据面cilium-dbg bpf policy list若某 Endpoint 的 map 为空且提示Policy stats empty...说明该 Endpoint 可能未启用策略强制执行核对单条裁决cilium-dbg bpf policy get endpoint-id -n结合cilium-dbg identity list将源/目的 IP 解析为身份 ID再比对 map 中对应方向与端口的条目是 Allow 还是 Deny临时干预数据面在确认控制面策略有问题而需要快速止血时可用add --deny插入临时拒绝条目或add插入放行条目使用delete撤销手工改动注意持久性cilium-dbg bpf policy add/delete只改动内核 BPF map属于数据面瞬时操作。agent 或节点重启后 map 会依据控制面策略重建手工条目不会保留也不应与正式的 CiliumNetworkPolicy / CiliumClusterwideNetworkPolicy 混淆。总结cilium-dbg bpf policy命令组为深入数据面排障提供了四个基础工具add与delete直接读写 per-endpoint 策略 map 的 Allow/Deny 条目get与list分别按单个 Endpoint 或全局批量 dump 策略内容并支持json/yaml结构化输出。理解其底层的cilium_policy_v3_idmap、PolicyKey/PolicyEntry结构以及 LPM 键的匹配语义是把这些命令从会敲提升到会用的关键也是排查控制面有策略、数据面不生效类问题的必备技能。相关源码入口集中在 cilium-dbg/cmd/bpf_policy_add.go、cilium-dbg/cmd/bpf_policy_get.go、cilium-dbg/cmd/bpf_policy_list.go、cilium-dbg/cmd/bpf_policy_delete.go 与 pkg/maps/policymap/policymap.go。【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表