ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Cilium 连接跟踪表清理指南:cilium-dbg bpf ct flush 命令的用法与底层实现解析

Cilium 连接跟踪表清理指南:cilium-dbg bpf ct flush 命令的用法与底层实现解析 Cilium 连接跟踪表清理指南cilium-dbg bpf ct flush 命令的用法与底层实现解析【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium本指南围绕 Cilium 的cilium-dbg bpf ct flush命令展开讲解如何一次性清空节点上所有连接跟踪Connection TrackingCT条目并结合仓库源码深入剖析其底层的 BPF map 结构、GC 过滤机制与 NAT 联动逻辑。读完本文你将掌握该命令的完整语法、参数含义、适用场景与注意事项并理解它为什么能在不重启 Cilium 的前提下彻底刷新 conntrack 状态。命令概览一次清空全部连接跟踪条目cilium-dbg bpf ct flush是 Cilium 调试工具集cilium-dbg中用于清空所有连接跟踪条目的命令。它属于cilium-dbg bpf ct命令组Connection tracking tables下的子命令。当节点上的 conntrack 状态异常、怀疑 CT 表数据损坏、或需要强制重置所有既有连接的跟踪状态时该命令可以快速将全局 CT map 中的所有条目一次性删除。完整的命令层级为cilium-dbg bpf ct flush其中bpf表示直接访问本地 BPF mapDirect access to local BPF mapsct即 Connection tracking管理连接跟踪表flush表示清空全部条目。官方命令参考文档位于 Documentation/cmdref/cilium-dbg_bpf_ct_flush.md命令组的完整子命令结构见 Documentation/cmdref/cilium-dbg_bpf_ct.md。命令语法与参数说明基本语法cilium-dbg bpf ct flush [flags]该命令不带任何位置参数直接执行即可清空当前节点上所有连接跟踪条目。执行成功后会逐张 map 输出被清理的条目数量具体输出格式见下文源码解析。命令专属选项-h, --help help for flush-h, --help用于查看flush子命令自身的帮助信息它是该命令唯一专属的 flag。继承自父命令的选项flush命令同时继承cilium-dbg根命令的全局选项常见的有选项说明--config string配置文件路径默认$HOME/.cilium.yaml-D, --debug启用调试信息输出-H, --host string指定要连接的 cilium-agent 服务端 API 的 URI--log-driver strings日志端点例如syslog--log-opt map日志驱动选项例如formatjson需要特别说明的是flush命令本身通过root 权限直接访问宿主机上的 BPF map 文件系统因此通常要求以 root 用户执行源码中通过common.RequireRootPrivilege(cilium bpf ct flush)强制校验见 bpf_ct_flush.go。源码实现flush 到底做了什么flush命令的完整逻辑集中在 cilium-dbg/cmd/bpf_ct_flush.go 的flushCt()函数中整个流程可以拆解为以下四步。第一步探测 IPv4 / IPv6 启用状态ipv4, ipv6 : getIpEnableStatuses()getIpEnableStatuses()定义于 cilium-dbg/cmd/helpers.go会优先通过 cilium-agent 的 API 查询EnableIPv4/EnableIPv6状态若 agent 未运行则回退读取运行时配置文件agent-runtime-config.json。这决定了 flush 需要操作哪些协议的 CT map。第二步打开对应的 NAT mapnat4, nat6 : nat.GlobalMaps(nil, ipv4, ipv6)flush 不只是删 CT 条目本身还会联动清理 NAT map。CT 表与 NAT 表存在强关联每个 CT 条目都可能携带 SNAT/DSR 映射删 CT 条目时必须同步删除对应的 NAT 条目否则会遗留孤儿NAT 条目源码注释称其为 orphan SNAT entries见 ctmap.go。第三步枚举并打开所有全局 CT mapmaps : ctmap.Maps(ipv4, ipv6)ctmap.Maps()见 ctmap.go按协议返回四张全局 CT mapmap 名称类型常量内容cilium_ct4_globalmapTypeIPv4TCPGlobalIPv4 TCP 连接跟踪表cilium_ct_any4_globalmapTypeIPv4AnyGlobalIPv4 非 TCP 连接跟踪表cilium_ct6_globalmapTypeIPv6TCPGlobalIPv6 TCP 连接跟踪表cilium_ct_any6_globalmapTypeIPv6AnyGlobalIPv6 非 TCP 连接跟踪表map 命名保留了 Cilium 1.0 以来的cilium_ct前缀见 ctmap.go以最小化升级过程中对存量连接的影响。每张 map 均为LRU_HASH类型ebpf.LRUHash默认容量为TCP 表2 18512Ki条、非 TCP 表2 17256Ki条见 pkg/option/config.go。注意若某张 map 不存在例如未启用 IPv6命令会打印Unable to open ... Skipping.并跳过而非报错退出。第四步对每张 map 执行 Flushfor _, m : range maps { path, err : ctmap.OpenCTMap(m) ... entries : m.Flush(next4, next6) fmt.Printf(Flushed %d entries from %s\n, entries, path) }核心调用链是Map.Flush()其实现位于 ctmap.go// Flush runs garbage collection for map m with the name mapType, deleting all // entries. The specified map must be already opened using bpf.OpenMap(). func (m *Map) Flush(next4, next6 func(GCEvent)) int { d, _ : m.doGC(GCFilter{ RemoveExpired: true, Time: MaxTime, }, next4, next6) return d }可以看到flush 在实现上并非直接清空 map而是复用了一整套 GC垃圾回收框架它构造了一个GCFilter{RemoveExpired: true, Time: MaxTime}过滤器。MaxTime math.MaxUint32是 CT 条目 Lifetime 字段的极限值因此任何条目的Lifetime Time恒成立等价于删除全部条目过滤判定逻辑见 ctmap.go 的doFiltering。命令执行完毕会输出类似Flushed N entries from /sys/fs/bpf/tc/globals/cilium_ct4_global的统计信息。联动清理NAT 条目如何被同步删除这是 flush 命令最容易被忽略、但对数据面一致性至关重要的机制。在执行 GC 时每条被删除的 CT 条目都会通过next4/next6回调事件流stream.Multicast[ctmap.GCEvent]发布出去observable4.Observe(context.Background(), ctmap.NatMapNext4, func(error) {}) observable6.Observe(context.Background(), ctmap.NatMapNext6, func(error) {})NatMapNext4/NatMapNext6见 ctmap.go是事件的消费者当 CT 条目的 tuple 类型为TUPLE_F_OUT时会进一步判断该条目是否为 DSR 内部条目isDsrInternalEntry即FlagsDSRInternal ! 0普通 egress 条目 → 调用nat.DeleteMapping4/6删除 NAT 映射DSR 内部条目 → 调用nat.DeleteSwappedMapping4/6删除交换方向的映射。同时GC 过程中会持有globalDeleteLock串行化删除操作见 ctmap.go避免与并发删除如scrubIPsInConntrackTableLocked互相干扰导致 BPF map 遍历被强制重启。实战建议flush 与 list 配套使用在清空之前通常建议先用cilium-dbg bpf ct list别名ls见 cilium-dbg/cmd/bpf_ct_list.go确认当前 CT 表的规模与内容以便评估 flush 的影响范围# 查看全部 CT 条目默认只列全局 map cilium-dbg bpf ct list # 查看指定集群的 CT 条目Clustermesh 场景 cilium-dbg bpf ct list cluster cluster-id # 查看每条目剩余存活时间 cilium-dbg bpf ct list --time-difflist支持--time-diff/-d打印剩余存活秒数、--time-diff-clocksource-mode与--time-diff-clocksource-hz手动指定时钟源模式与频率默认 250 Hz等参数并可输出 JSON/YAML 格式。而flush执行后原本由 CT 表承载的存量连接状态包括 NAT 映射会全部失效数据面将按新到报文重建跟踪条目。典型使用场景排查 conntrack 异常CT 表状态异常或数据不一致时先list观察、再flush重置节点维护与切换批量迁移或故障恢复后清理残留的过期连接状态验证 CT/GC 行为结合 pkg/maps/ctmap/ctmap_privileged_test.go 中的 GC 相关测试用例理解预期行为后用flush手动触发全量清理。注意事项必须 root 权限命令直接操作 BPF map 文件非 root 用户会被RequireRootPrivilege拒绝影响范围是节点级flush 只清理执行命令所在节点上的全局 CT map以及对应的全局 NAT map不会跨节点传播存量连接会受影响所有被清理条目的既有连接跟踪状态被删除后续报文需重新建立跟踪可能带来短暂的策略判定/连接重建开销不涉及 per-cluster CT mapflush 目前针对全局 mapcilium_ct*_globalClustermesh 场景下 per-cluster map 的清理请参考ctmap.GetClusterCTMaps相关代码ctmap.go与list cluster id的定位方式。总结cilium-dbg bpf ct flush表面上是清空连接跟踪表的一条简单命令其背后却复用了 Cilium 完整的 CT GC 框架从探测 IPv4/IPv6 状态、打开 NAT map到枚举四张全局 CT map、以RemoveExpired MaxTime过滤条件执行全量回收并在回收过程中通过事件流联动删除 NAT 映射保证 CT 与 NAT 数据的一致性。理解这条命令的实现路径bpf_ct_flush.go、ctmap.go不仅有助于安全地执行清空操作也能帮助你更深入地理解 Cilium 连接跟踪与垃圾回收的整体设计。【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进