
Cilium SRv6 路由规则管理cilium-dbg bpf srv6 命令与底层 BPF Map 全解析【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/ciliumCilium 将 SRv6Segment Routing over IPv6的路由决策下沉到 eBPF 数据面通过一组基于 LPM Trie 与 Hash 的 BPF Map 承载 VRF 映射、转发策略与 Segment IDSID表项。cilium-dbg bpf srv6命令族正是运维人员直接查看这些 SRv6 路由规则Policy、SID、VRF 三类表项的唯一 CLI 入口。本文以 cilium-dbg_bpf_srv6.md 命令参考文档为骨架结合cilium-dbg命令实现、pkg/maps/srv6map的 Map 封装与bpf/lib/srv6.h的数据面消费逻辑讲解每个子命令的用法、输出格式及其背后的数据结构帮助你快速定位与排查 SRv6 转发问题。一、背景Cilium 中的 SRv6 路由规则是什么SRv6 通过在 IPv6 报文中携带 Segment Routing HeaderSRH实现逐跳分段转发。在 Cilium 的实现中一个节点要参与 SRv6 转发需要维护三类规则VRF 映射VRF mappings把「源地址 目的 CIDR」映射到一个本地 VRF IDPolicy 条目Policy entries把「VRF ID 目的 CIDR」映射到一个目标 SID即该流量应封装到的 SegmentSID 条目SID entries把「SID 地址」映射回 VRF ID用于接收侧识别本地 SID 归属。这三类规则分别落在五张 BPF Map 中srv6_maps.hBPF Map 名称类型KeyValue含义cilium_srv6_vrf_v4LPM_TRIEsrv6_vrf_key4src IP dst CIDR__u32VRF IDIPv4 流量到 VRF 的映射cilium_srv6_vrf_v6LPM_TRIEsrv6_vrf_key6src IP dst CIDR__u32VRF IDIPv6 流量到 VRF 的映射cilium_srv6_policy_v4LPM_TRIEsrv6_policy_key4VRF ID dst CIDRunion v6addrSIDIPv4 目的地址的策略cilium_srv6_policy_v6LPM_TRIEsrv6_policy_key6VRF ID dst CIDRunion v6addrSIDIPv6 目的地址的策略cilium_srv6_sidHASHunion v6addrSID__u32VRF ID本地 SID → VRF 归属这些 Map 均由 srv6map 模块在 Agent 启动时创建并 pin 到 bpffs默认容量上限为 16384 条见 policy.go、sid.go、vrf.go 中的maxPolicyEntries/maxSIDEntries/maxVRFEntries。cilium-dbg bpf srv6命令就是这三类表项的只读巡检入口。二、命令树概览cilium-dbg bpf srv6cilium-dbg bpf srv6是cilium-dbg bpfDirect access to local BPF maps下的子命令组负责Manage the SRv6 routing rulesbpf_srv6.go。它本身不执行具体动作只挂载三个只读子命令cilium-dbg bpf srv6 ├── cilium-dbg bpf srv6 policy List SRv6 policy entries别名pol ├── cilium-dbg bpf srv6 sid List SRv6 SID entries └── cilium-dbg bpf srv6 vrf List SRv6 VRF mappings别名ctx全局选项cilium-dbg bpf srv6及全部子命令共享同一组父命令选项--config string 配置文件路径默认 $HOME/.cilium.yaml -D, --debug 开启调试消息 -H, --host string Server-side API 的 URI --log-driver strings 日志端点示例syslog --log-opt map 日志驱动选项示例formatjson其中-H/--host用于指定 API 端点由于命令直接读取本机 bpffs 上的 BPF Map实际操作时还需具备 root 权限源码中通过common.RequireRootPrivilege强制校验见 bpf_srv6_policy.go。子命令通用输出选项三个子命令都通过command.AddOutputOption注册了相同的-o/--output参数-o, --output string json| yaml| jsonpath{}未指定时输出为对齐的纯文本表格tabwriter渲染指定时输出为 JSON、YAML 或 jsonpath 表达式筛选结果便于脚本化采集与 Agent 解析。三、列出 SRv6 Policy 条目cilium-dbg bpf srv6 policyPolicy 条目定义「某 VRF 内去往某目的 CIDR 的流量应封装到哪个 SID」是 SRv6 封装决策的核心。cilium-dbg bpf srv6 policy [flags]选项-h, --help、-o, --output stringjson| yaml| jsonpath{}。该命令还注册了别名pol。执行流程bpf_srv6_policy.go以 root 权限打开两张 Policy Mapcilium_srv6_policy_v4与cilium_srv6_policy_v6srv6map.OpenPolicyMaps见 policy.go若 Map 不存在fs.ErrNotExist打印Cannot find SRv6 policy maps并退出——这通常意味着节点未启用 SRv6分别遍历 IPv4 与 IPv6 两张 Map将每条记录规整为VRFID / DestCIDR / SID三元组表格输出列头为VRF ID Destination CIDR SIDprintSRv6PolicyList。示例输出格式参照源码中tabwriter定义数据为示意VRF ID Destination CIDR SID 1 10.0.0.0/24 fd00::1 2 2001:db8::/32 fd00::2关键数据结构PolicyKey 使用 LPM Trie 键PrefixLen前 32 位固定为 VRF ID、后 32/128 位为 CIDR 掩码长度Go 侧见 policy.goC 侧见 srv6_maps.h 中srv6_policy_key4/6Value 即目标 SID 地址PolicyValue{SID types.IPv6}。四、列出 SRv6 SID 条目cilium-dbg bpf srv6 sidSID 条目标识本节点负责的 Segment ID用于接收侧判断这个 SID 是不是我的从而触发解封装。cilium-dbg bpf srv6 sid [flags]选项-h, --help、-o, --output string。执行流程bpf_srv6_sid.go以 root 权限打开cilium_srv6_sidHash Mapsrv6map.OpenSIDMap见 sid.goMap 不存在时输出Cannot find SRv6 SID map遍历全部键值对规整为SID / VRFID表格输出列头为SID VRF IDprintSRv6SIDList。示例输出SID VRF ID fd00::1 1 fd00::2 2该 Map 的 Key 是 128 位 SID 地址SIDKey{SID types.IPv6}Value 是所属 VRF IDSIDValue{VRFID uint32}详见 sid.go。五、列出 SRv6 VRF 映射cilium-dbg bpf srv6 vrfVRF 映射将「源 IP目的 CIDR」二元组关联到本地 VRF ID是策略查找的前置索引。该命令的别名是ctx。cilium-dbg bpf srv6 vrf [flags]选项-h, --help、-o, --output string。执行流程bpf_srv6_vrf.go以 root 权限打开cilium_srv6_vrf_v4与cilium_srv6_vrf_v6两张 LPM Mapsrv6map.OpenVRFMaps见 vrf.goMap 不存在时输出Cannot find SRv6 VRF mapping maps遍历两张 Map规整为SourceIP / DestCIDR / ID表格输出列头为Source IP Destination CIDR VRF IDprintSRv6VRFList。示例输出Source IP Destination CIDR VRF ID 10.1.0.0/16 0.0.0.0/0 1 fd00::/64 ::/0 2注意 VRFKey 的PrefixLen由源地址全宽IPv4 为 32 位、IPv6 为 128 位加目的 CIDR 掩码长度拼接而成vrf.go这也解释了为什么该键能同时匹配源前缀与目的前缀两个维度。六、底层原理Map 键值结构与数据面查找链三个命令输出的每一列都直接对应底层 BPF Map 的键值字段Go 侧结构体与 C 侧结构体的内存布局由 alignchecker 在构建期校验如srv6_vrf_key4、srv6_policy_key4、srv6_vrf_key6、srv6_policy_key6与SIDKey等必须与 BPF 侧对齐一致确保 CLI 读出的字段与数据面看到的是同一份布局。数据面消费链bpf_lxc.c、bpf_lxc.c、bpf_host.c发送侧封装在 Pod 出向bpf_lxc.c依据五元组查cilium_srv6_vrf_v4/v6得到 VRF ID再以 VRF ID 目的地址查cilium_srv6_policy_v4/v6得到目标 SID命中后经尾调用CILIUM_CALL_SRV6_ENCAP进入tail_srv6_encap由srv6_encapsulation执行 IPv6 外层封装可选携带 SRH见 srv6.h。接收侧解封装在主机入向bpf_host.c对疑似 SRv6 报文is_srv6_packet以目的地址查cilium_srv6_sid若命中本地 SID尾调用CILIUM_CALL_SRV6_DECAP执行srv6_decapsulation剥离外层头后交给 IPv4/IPv6 入向处理srv6.h。因此cilium-dbg bpf srv6 policy/sid/vrf输出的正是数据面每次封装/解封装决策所依赖的三级索引内容。当流量未按预期封装时可以按「vrf → policy → sid」顺序逐张 Map 核对快速定位缺失条目。七、启用前提与适用限制SRv6 相关命令只有在 Agent 启用了 SRv6 后才可能看到数据开关--enable-srv6对应 pkg/option/config.go 的EnableSRv6选项绑定于 daemon_main.go 附近关闭时srv6map模块不会创建任何 Map见 policy.go 中的if !dc.EnableSRv6提前返回逻辑命令因此报Cannot find ... maps。封装模式--srv6-encap-mode取值srh携带 SRH即完整封装或reduced简化封装仅外层 IPv6 头默认reduceddefaults.go。该模式影响数据面宏ENABLE_SRV6_SRH_ENCAP是否定义config.go进而决定 srv6.h 中封装时是否追加 SRH。容量限制三类 Map 均以 16384 为最大条目数超过后更新会失败排查大批量路由时可结合该上限判断。八、测试与验证仓库为 Map 层提供了基于 hive 的权限测试例如 sid_test.go在EnableSRV6: true下启动 hive 模块验证 Map 被创建并 pinMapPath上文件存在、写入fd00::1 → VRFID 1后能通过IterateWithCallback完整读回并确认停止 hive 后 Map 仍保持 pin。policy_test.go与vrf_test.go覆盖同类行为。这套测试同样验证了 CLI 命令所依赖的OpenSIDMap/OpenPolicyMaps/OpenVRFMaps路径的可用性可作为功能回归的参考。九、小结cilium-dbg bpf srv6提供policy别名pol、sid、vrf别名ctx三个只读子命令分别巡检 SRv6 策略、SID 与 VRF 映射全部子命令均需 root 权限并支持-o json|yaml|jsonpath结构化输出适合脚本与自动化巡检命令内容直接映射 srv6map 管理的五张 BPF Map两 VRF 两 Policy 一 SID与 srv6.h 中的 eBPF 查找逻辑一一对应若命令提示找不到 Map请先确认 Agent 已配置--enable-srv6若条目缺失按「VRF → Policy → SID」链路逐级比对即可定位转发异常。【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考