3. 网络观测核心概念:网络命名空间、虚拟以太网对、网桥、路由表在租户隔离中的基础作用
在构建多租户云原生环境时,网络隔离是安全与性能的基石。eBPF 网络观测的核心任务之一,就是准确捕获并呈现这些隔离机制在数据路径上的真实行为。本章深入剖析四个基础网络抽象——网络命名空间、虚拟以太网对(veth)、网桥与路由表——并阐明它们在租户隔离蓝图中的协同作用。
3.1 网络命名空间:隔离的第一道边界
网络命名空间(Network Namespace)是 Linux 内核提供的一种轻量级虚拟化机制,它让每个命名空间拥有独立的网络栈:包括自己的网络设备、IP 地址、路由表、防火墙规则(iptables/nftables)以及套接字(socket)实例。在 Kubernetes 或容器化场景中,每个 Pod 或租户容器通常被分配一个独立的网络命名空间,从而实现网络层面的完全隔离。
sk_lookup 或 sk_skb 钩子捕获数据包时,利用 bpf_get_ns_current_pid_tgid() 或 bpf_skc_to_tcp6_sock 等辅助函数,提取数据包所属的网络命名空间 ID(netns ID)。这是将流量归属到特定租户的关键元数据。
| 特性 | 网络命名空间 | 进程命名空间(PID NS) |
|---|---|---|
| 隔离对象 | 网络栈(设备、路由、防火墙) | 进程 ID 树 |
| 默认共享 | 主机命名空间(init_net) | 父命名空间 |
| eBPF 观测关键字段 | skc_net 指针 → net->ns.inum |
pid_ns_id |
| 租户隔离价值 | 确保租户 A 无法直接访问租户 B 的网卡或路由 | 辅助进程级审计 |
3.2 虚拟以太网对(veth):跨命名空间的管道
虚拟以太网对(veth pair)总是成对出现,像一根虚拟网线连接两个网络命名空间。数据包从一端进入,立即从另一端原样流出。在 Kubernetes 中,每个 Pod 的 eth0 接口通常就是 veth 对的一端,另一端则连接到宿主机或网桥的命名空间。
Pod A 的 eth0(veth 端) → 宿主机侧的 veth 端 → 网桥或路由决策 → 目标设备。
eBPF 在 veth 设备上可以挂载 tc(traffic control)或 XDP 钩子,直接观测或修改经过该虚拟链路的数据包。由于 veth 对是成对出现的,通过 eBPF 程序可以追踪数据包从哪个命名空间出发,进入哪个命名空间,形成跨命名空间的流量拓扑。
3.3 网桥:二层转发与租户广播域
Linux 网桥(bridge)是一个虚拟的二层交换机,它根据 MAC 地址表在连接到同一网桥的多个网络接口之间转发数据帧。在租户隔离场景中,网桥常被用来连接同一租户内的多个 Pod 或容器,形成一个共享的二层广播域,同时通过 VLAN 或 eBPF 规则与其他租户隔离。
3.4 路由表:三层转发与策略隔离
每个网络命名空间都拥有独立的路由表。当数据包需要跨越子网或访问外部网络时,内核根据路由表进行三层转发决策。在租户隔离蓝图中,路由表不仅负责将流量导向正确的网关,还可以通过策略路由(Policy Routing)实现更细粒度的隔离:例如,根据数据包的源 IP、源端口或 fwmark 标记选择不同的路由表。
fib_lookup 辅助函数在数据包处理路径中实时验证路由决策的正确性。
3.5 四者协同:租户隔离的数据路径
一个典型的租户隔离数据路径如下:
- 源 Pod 在自身网络命名空间内发出数据包。
- 数据包通过 veth 对 穿越命名空间边界,到达宿主机侧。
- 宿主机侧的 网桥 根据 MAC 地址表决定是否在同一二层域内转发。
- 若需要跨子网或出宿主机,则查询该命名空间的 路由表 决定下一跳。
- 最终数据包通过物理网卡或隧道设备离开宿主机。
eBPF 可以在上述每一个步骤中插入观测点:
| 步骤 | eBPF 钩子位置 | 观测内容 |
|---|---|---|
| 1. 源 Pod 发出 | tc_ingress 或 XDP 在 Pod veth 端 |
源 IP、源端口、进程 PID、netns ID |
| 2. veth 对穿越 | tc_egress 在宿主机侧 veth 端 |
数据包大小、方向、时间戳 |
| 3. 网桥转发 | br_handle_frame 或 tc 在网桥端口 |
MAC 地址学习、广播/多播流量 |
| 4. 路由查询 | fib_lookup 辅助函数或 tc 钩子 |
路由表命中、下一跳、出接口 |
| 5. 物理出口 | tc_egress 在物理网卡 |
最终封装、VLAN 标签、隧道信息 |