cilium的eBPF网络特性解析

在 Cilium 的 eBPF 数据平面中,bpf.masqueradebpf.hostRoutingbpf_redirect_neigh() 和 bpf_redirect_peer() 是紧密相关的核心网络特性,它们共同构建了高效、可编程的网络转发路径。

以下是它们的详细解析和相互关系:

一、数据流程

 

二、核心概念解析

bpf.masquerade (IP 伪装)

  • 作用:实现源地址转换(SNAT),将 Pod 的私有 IP 转换为节点的公有 IP

  • 场景:Pod 访问集群外部资源时

  • 优势:替代 iptables MASQUERADE 规则,性能提升 5-10 倍

bpf.hostRouting (主机路由)

  • 作用:绕过内核网络栈,直接在 eBPF 层进行路由决策

  • 场景: Pod 与其他node节点之间的通信

  • 性能优势

    • 减少内核上下文切换

    • 跳过 Netfilter/iptables 处理链

bpf_redirect_neigh() (跨节点重定向)

  • 函数原型int bpf_redirect_neigh(int ifindex, struct bpf_redir_neigh *params)

  • 作用:重定向数据包到指定接口,自动处理 L2/L3 邻居信息

  • 工作流程

    1. 查询目标 IP 的 MAC 地址

    2. 维护邻居表缓,存若缓存不存在,触发异步 ARP 请求

    3. 填充以太网帧头

    4. 直接发送到目标接口,支持跨节点通信

bpf_redirect_peer() (同节点重定向)

  • 函数原型int bpf_redirect_peer(int ifindex, u64 flags)

  • 作用:将数据包重定向到另一网络命名空间的接口

  • 关键特性

    • 直接进入目标命名空间(跳过主机 netns)

    • 零拷贝传输

    • 超低延迟(< 100ns)

 

三、工作流程

场景 1:同节点 Pod 间通信

  1. 流量到达 eBPF 程序

  2. bpf.hostRouting 识别目标为同节点 Pod

  3. 调用 bpf_redirect_peer() 直通目标 Pod

    bpf_redirect_peer(target_pod_ifindex, 0);
  4. 完全跳过主机网络栈

  5. 流程图:

场景 2:跨节点 Pod 通信

  1. bpf.hostRouting 识别目标为远程 Pod

  2. 确定目标节点 IP 和 MAC

  3. 调用 bpf_redirect_neigh()

    struct bpf_redir_neigh params = {
        .nh_family = AF_INET,
        .ipv4_nh = remote_node_ip
    };
    bpf_redirect_neigh(egress_ifindex, &params);
  4. 自动处理 ARP/NDP 解析

  5. 流程图:

场景 3:Pod 访问互联网

  1. bpf.hostRouting 识别外部流量

  2. bpf.masquerade 执行 SNAT:

    iph->saddr = node_ip;
    recalc_csum(iph);
  3. 调用 bpf_redirect_neigh() 到网关

  4. 流程图:

四、关系总结

特性 依赖关系 协同作用 网络层级
bpf.hostRouting 基础路由决策 调度其他组件 L3
bpf_redirect_peer() 依赖 hostRouting 同节点加速 L2
bpf_redirect_neigh() 依赖 hostRouting 跨节点转发 L2/L3
bpf.masquerade 可与两者协同 出口 NAT L3/L4

四者共同构建了 Cilium eBPF 数据平面的核心:

  1. bpf.hostRouting 作为决策引擎,确定流量路径

  2. bpf_redirect_peer 实现节点内超高速通信

  3. bpf_redirect_neigh 处理跨节点智能路由

  4. bpf.masquerade 提供高效的出口网络地址转换