尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Cilium SRv6 策略表查询指南:cilium-dbg bpf srv6 policy 命令全解析

Cilium SRv6 策略表查询指南:cilium-dbg bpf srv6 policy 命令全解析 Cilium SRv6 策略表查询指南cilium-dbg bpf srv6 policy 命令全解析【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/ciliumcilium-dbg bpf srv6 policy是 Cilium 提供的用于列出内核 BPF 中 SRv6Segment Routing over IPv6策略policy条目的命令行工具属于cilium-dbg bpf srv6命令族。它直接读取 eBPF mapcilium_srv6_policy_v4与cilium_srv6_policy_v6将 VRF ID 到目的 CIDR、Segment IdentifierSID的映射关系以人类可读的表格或机器可解析的 JSON/YAML 形式输出是排查 SRv6 数据面转发规则、验证策略下发是否正确时的核心诊断手段。读完本文你将掌握该命令的完整语法、输出格式、底层 map 结构设计以及它在 SRv6 数据面中所扮演的角色。命令定位SRv6 管理命令族中的策略查询入口在cilium-dbg中所有与 SRv6 相关的管理命令统一挂载在cilium-dbg bpf srv6父命令之下其 Short 描述为Manage the SRv6 routing rules管理 SRv6 路由规则。从源码 cilium-dbg/cmd/bpf_srv6.go 可以看到BPFSRv6Cmd再被注册到更上层的BPFCmd即bpf命令之下形成如下命令层级cilium-dbg bpf srv6 ├── cilium-dbg bpf srv6 policy # 列出 SRv6 策略条目本文主题 ├── cilium-dbg bpf srv6 sid # 列出 SRv6 SID 条目 └── cilium-dbg bpf srv6 vrf # 列出 SRv6 VRF 映射条目在cilium-dbg/cmd/bpf_srv6_policy.go的init()函数中策略子命令通过BPFSRv6Cmd.AddCommand(bpfSRv6PolicyListCmd)完成注册并同时声明了别名pol因此cilium-dbg bpf srv6 pol与cilium-dbg bpf srv6 policy等价。命令的完整命令族参考可见 Documentation/cmdref/cilium-dbg_bpf_srv6.md。命令语法与选项该命令的完整语法为cilium-dbg bpf srv6 policy [flags]专用选项选项类型说明-h, --help布尔显示policy子命令的帮助信息-o, --output string字符串指定输出格式支持json、yaml、jsonpath{}不指定时默认输出对齐的文本表格继承自父命令的全局选项选项类型说明--config string字符串指定配置文件默认为$HOME/.cilium.yaml-D, --debug布尔启用调试信息输出-H, --host string字符串指定访问服务端 API 的 URI--log-driver strings字符串切片设置日志输出端点示例syslog--log-opt mapmap设置日志驱动选项示例formatjson三种输出格式详解默认表格输出不带-o选项时命令通过tabwriter将对齐的表格打印到标准输出表头为三列VRF ID、Destination CIDR、SID。从 cilium-dbg/cmd/bpf_srv6_policy.go 中printSRv6PolicyList的实现看输出形如VRF ID Destination CIDR SID 1 10.0.0.0/8 fd00::1 1 fd00::/16 fd00::2当策略 map 中没有任何条目时命令会在标准错误输出打印No entries found.提示而不是输出空表格。结构化输出JSON / YAML通过-o json或-o yaml命令会将内部定义的srv6Policy结构体序列化输出type srv6Policy struct { VRFID uint32 DestCIDR string SID string }因此 JSON 输出的每条记录形如[ { VRFID: 1, DestCIDR: 10.0.0.0/8, SID: fd00::1 } ]该结构化输出适合与jq等工具链结合用于自动化巡检或写入监控脚本-o jsonpath{}则允许用户按 JsonPath 表达式精确提取字段。底层原理SRv6 策略 eBPF map 结构策略查询命令读取的是两个内核 eBPF map其定义位于 pkg/maps/srv6map/policy.gomap 名称类型KeyValue最大条目数cilium_srv6_policy_v4LPM TriePolicyKey4PolicyValue16384cilium_srv6_policy_v6LPM TriePolicyKey6PolicyValue16384Key 设计LPM Trie 与复合前缀两张 map 均使用ebpf.LPMTrie最长前缀匹配树key 由固定前缀部分与可变前缀部分组成PolicyKey4PrefixLenuint32 VRF ID 的 32 bit DestCIDR 掩码位数、VRFIDuint32、DestCIDRtypes.IPv4PolicyKey6结构相同DestCIDR为types.IPv6getDestCIDR()方法将原始PrefixLen减去固定前缀位数policyStaticPrefixBits 32即 VRF ID 占用的位数还原出目的网络的真实掩码长度。这意味着一条策略记录本质上描述的是属于某个 VRF 的流量若其目的地址落在某 CIDR 内则应用对应的 SID 进行 SRv6 封装转发。Value 设计SIDPolicyValue仅包含一个SID字段types.IPv6即该策略关联的 Segment Identifier是 SRv6 数据面用于寻址与封装的核心标识。map 生命周期与标志在 pkg/maps/srv6map/policy.go 的newPolicyMaps中两张 map 通过 Cilium 的 Hive 框架创建并附加BPF_F_NO_PREALLOC | BPF_F_RDONLY_PROG标志即内核侧程序对该 map 只读仅用户态可写OnStart时调用OpenOrCreate()OnStop时关闭。该构造器还通过defines.NodeOut向 datapath 下发编译期常量SRV6_POLICY_MAP_SIZE16384供 BPF 程序使用。值得注意的是map 的创建受dc.EnableSRv6对应 agent 配置项enable-srv6见 pkg/option/config.go控制当 SRv6 功能未启用时构造器直接返回空的MapOut不会创建任何 map——此时查询命令将报 Cannot find SRv6 policy maps。源码级调用链从命令到内核 map执行cilium-dbg bpf srv6 policy时cilium-dbg/cmd/bpf_srv6_policy.go 的Run函数按以下流程工作权限检查调用common.RequireRootPrivilege(cilium bpf srv6 policy)要求以 root 身份运行因为需要直接访问 bpffs 上的 map打开 map调用srv6map.OpenPolicyMaps(log)通过bpf.OpenMap(bpf.MapPath(logger, policyMapName4/6), ...)在 bpffs 上定位并打开两张策略 map见 pkg/maps/srv6map/policy.go。若 map 不存在fs.ErrNotExist打印Cannot find SRv6 policy maps并退出其他打开错误则直接Fatalf遍历与解析分别对 IPv4 与 IPv6 两张 map 调用IterateWithCallback。回调内将内核侧 key/value 转换为用户态可读形式——key 还原出VRFID与DestCIDRnetip.Prefixvalue 取出SID字符串输出若指定了-o输出选项通过command.OutputOption()判断则调用command.PrintOutput输出 JSON/YAML否则按No entries found.或表格两种分支处理。测试方面pkg/maps/srv6map/policy_test.go 中的TestPrivilegedPolicyMapsHive需要特权环境由testutils.PrivilegedTest门控覆盖了 map 的创建、通过IterateWithCallback遍历以及 key 的还原正确性——例如插入VRFID: 1, DestCIDR: 10.0.0.0/8IPv4与VRFID: 1, DestCIDR: fd00::/16IPv6后断言遍历结果能完整命中这两个PolicyKey。与 VRF、SID map 的关系完整诊断视角策略 map 只是 SRv6 数据面的三块核心拼图之一与之配套的还有详见 pkg/maps/srv6map/vrf.go 与 pkg/maps/srv6map/sid.gomap 名称类型Key → Value作用cilium_srv6_vrf_v4/cilium_srv6_vrf_v6LPM Trie(SourceIP, DestCIDR)→VRFID将源地址目的网段映射到 VRF IDcilium_srv6_sidHashSID→VRFID将 SID 映射回所属 VRF ID这三张表共同构成了 SRv6 的转发决策链数据包先按 (srcIP, destCIDR) 查 VRF map 得到 VRF ID再以 (VRF ID, destCIDR) 查 policy map 得到 SID最后按 SID 执行封装与转发。因此排查 SRv6 转发异常时应把cilium-dbg bpf srv6 vrf、cilium-dbg bpf srv6 policy、cilium-dbg bpf srv6 sid三个命令的输出对照查看对应文档见 cilium-dbg_bpf_srv6_vrf.md 与 cilium-dbg_bpf_srv6_sid.md。此外所有 SRv6 map 的最大条目数均为 16384且均带BPF_F_RDONLY_PROG标志只允许用户态如cilium-dbg写入datapath 仅读。使用前提与注意事项需要 root 权限命令直接读取 bpffs 上的内核 map非 root 用户将因权限检查失败而无法执行需启用 SRv6 功能仅当 Cilium agent 以--enable-srv6true启动并配合--srv6-encap-mode指定封装模式见 pkg/option/config.go时策略 map 才会被创建否则命令输出Cannot find SRv6 policy mapsIPv4 与 IPv6 分别存储查询结果合并展示两张 map 的内容同一 VRF ID 下 IPv4 与 IPv6 的策略会同时出现在表格中注意通过 Destination CIDR 的地址族区分空表提示策略未配置时默认输出模式会在 stderr 打印No entries found.而 JSON/YAML 模式则输出空数组[]在编写自动化脚本时需区分这两种行为。小结cilium-dbg bpf srv6 policy虽是一条简短的查询命令但其背后连接着 Cilium SRv6 数据面的策略决策核心——基于 LPM Trie 的cilium_srv6_policy_v4/v6双栈策略 map。理解命令的选项、输出格式与 map 结构再结合 VRF 与 SID 两张配套表你就能对 SRv6 的封装转发决策形成完整的诊断视图快速定位策略未下发VRF 匹配错误SID 缺失等典型问题。【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表