3、网络观测基础:网络数据包路径、XDP与TC钩子、套接字过滤器、流追踪基础
在构建租户隔离的 eBPF 网络观测蓝图之前,必须深入理解数据包在内核中的完整生命周期。本章将拆解网络数据包从网卡到用户态的路径,并重点介绍 eBPF 在关键路径上的挂载点:XDP、TC、套接字过滤器(Socket Filter)以及流追踪(Flow Tracking)机制。这些是后续实现仪表盘对账与跨环境迁移的基石。
3.1 网络数据包内核路径全景
一个数据包从物理网卡到达用户态应用程序,需要经过多个内核子系统。理解这一路径有助于我们精准选择 eBPF 钩子。
核心路径速览: 网卡 → 驱动层 → XDP(早期处理) → GRO → 协议栈(IP/路由) → Netfilter(iptables/nftables) → TC(流量控制) → 套接字缓冲区(Socket Buffer) → 套接字过滤器 → 用户态。
下表总结了各阶段的关键特征与 eBPF 介入点:
| 阶段 | 位置 | eBPF 钩子 | 主要能力 |
|---|---|---|---|
| 网卡驱动 | 最早期,中断上下文 | XDP | 高速丢包、重定向、负载均衡 |
| 协议栈入口 | GRO 之后,IP 层之前 | TC ingress | 流量整形、过滤、隧道封装 |
| 协议栈出口 | IP 层之后,发送前 | TC egress | 出站流量控制、标记、限速 |
| 套接字层 | 数据包与进程交互处 | Socket Filter (BPF_PROG_TYPE_SOCKET_FILTER) | 按需过滤、抓包、统计 |
| 连接跟踪 | Netfilter 层 | Flow Tracking (conntrack + eBPF) | 会话级追踪、NAT 状态感知 |
3.2 XDP 与 TC 钩子:内核中的两大观测锚点
XDP(eXpress Data Path)和 TC(Traffic Control)是 eBPF 在网络观测中最常用的两个挂载点。它们分别位于数据路径的“最早”和“标准”位置。
3.2.1 XDP:最早的数据包处理点
XDP 程序在网卡驱动层、分配 sk_buff 结构体之前运行。它直接操作原始的 DMA 缓冲区(xdp_buff),具有极低的延迟和极高的吞吐量。
- 执行时机: 数据包被 DMA 写入内存后,GRO 合并前。
- 返回动作:
XDP_DROP(丢弃)、XDP_PASS(交给协议栈)、XDP_TX(从原网卡发送)、XDP_REDIRECT(重定向到其他网卡或 CPU)。 - 观测用途: 租户流量统计、DDoS 攻击检测、早期丢包原因分析。
租户隔离场景提示: 在 XDP 层,可以通过解析 VXLAN/Geneve 隧道 ID 或 VLAN Tag,直接对租户流量进行计数或标记,避免后续协议栈的复杂处理。
3.2.2 TC:标准协议栈的流量控制点
TC 钩子位于内核协议栈内部,分为 ingress(入站)和 egress(出站)两个方向。它工作在 sk_buff 结构体已分配、协议栈已处理部分数据之后。
- TC ingress: 在 IP 层处理之前,Netfilter 之前。适合做流量镜像、隧道解封装、策略过滤。
- TC egress: 在 IP 层处理之后,发送到网卡驱动之前。适合做流量整形、QoS 标记、出站审计。
- 与 XDP 的区别: TC 可以访问完整的
sk_buff元数据(如路由信息、socket 关联),而 XDP 只能访问原始帧。
下面的 SVG 图展示了 XDP 与 TC 在数据包路径中的相对位置:
3.3 套接字过滤器:用户态与内核态的观测接口
套接字过滤器(Socket Filter)是 eBPF 最早的应用之一,它允许用户态程序在内核套接字层挂载过滤逻辑,仅将匹配的数据包复制到用户态。这对于抓包工具(如 tcpdump)和租户级流量审计至关重要。
- 挂载方式: 通过
setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, ...)将 BPF 程序附加到指定套接字。 - 程序类型:
BPF_PROG_TYPE_SOCKET_FILTER。 - 数据来源: 内核协议栈已经处理完毕、准备放入套接字接收队列的
sk_buff。 - 观测粒度: 可以精确到单个进程、单个套接字,非常适合租户隔离场景下的“按需观测”。
性能注意: 套接字过滤器工作在协议栈末端,无法捕获被 XDP 或 Netfilter 丢弃的数据包。如果需要观测“全量丢包”,必须在 XDP 或 TC 层进行。
3.4 流追踪基础:从数据包到会话
流追踪(Flow Tracking)是将离散的数据包聚合为“流”或“会话”的过程。eBPF 通过结合 conntrack(连接跟踪)和 BPF 哈希映射,可以实现高效的流级观测。
3.4.1 流追踪的核心要素
| 要素 | 描述 | eBPF 实现方式 |
|---|---|---|
| 五元组 | 源IP、目的IP、源端口、目的端口、协议 | 作为 BPF 哈希映射的 Key |
| 流方向 | 原始方向与应答方向 | 通过 conntrack 状态机区分 |
| 统计指标 | 包数、字节数、开始时间、结束时间 | 存储在 BPF 映射的 Value 中 |
| 租户标签 | 租户 ID、命名空间、Pod 标签 | 通过辅助映射或元数据注入 |
3.4.2 流追踪的典型工作流程
- 捕获: 在 TC ingress 或 XDP 处捕获数据包,提取五元组。
- 查找: 以五元组为 Key,在 BPF 哈希映射中查找现有流记录。
- 更新: 如果找到,更新包计数、字节计数和时间戳;如果未找到,创建新流记录。
- 聚合: 用户态程序周期性地从 BPF 映射中读取流记录,按租户标签进行二次聚合。
- 对账: 将聚合后的流数据与租户的预期流量模型进行对比,生成仪表盘对账指标。
下面的 SVG 图展示了 eBPF 流追踪的完整数据流: