calico 的 network policy 模式是使用 iptables 实现的?

31 阅读4分钟

✅ 是的,完全正确。
默认(非 eBPF)模式 下,Calico 的 NetworkPolicy 实现是基于 iptables 的
下面是更深入一点的解释:


🧩 Calico 的两种数据路径模式

模式默认情况实现机制特点
iptables 模式✅ 默认启用使用 Linux 内核 netfilter/iptables 实现安全策略稳定、兼容性好
eBPF 模式可选 (enableBPF: true)用 eBPF 程序替代 iptables,直接在内核 hook 中执行性能更高,功能更强(如原生负载均衡)

🔧 iptables 模式下的原理

在默认模式中,Calico 的组件(主要是 calico-node)会:

  1. 监控所有 Calico NetworkPolicy / GlobalNetworkPolicy;
  2. 翻译成一系列 iptables 规则
  3. 写入到主机的 filterraw 中。

常见的链包括:

  • calico-pi-<namespace>.<policy>:每条策略一个链;
  • calico-fip / calico-nat-outgoing:用于 SNAT;
  • calico-isolate / calico-from- / calico-to-:用于入站和出站流量匹配。

你可以通过以下命令查看:

iptables-save | grep calico

或:

iptables -L -n | grep calico

🧠 eBPF 模式的区别(仅补充)

calico-node 启用 BPFMode=true 时:

  • iptables 规则不再生成;
  • 数据包在 XDP / TC 层直接被 eBPF 程序过滤;
  • Calico 的 NetworkPolicy 会被编译为 eBPF map;
  • 可绕过 conntrack,提高性能;
  • 但需要 Linux 4.19+ 且宿主机支持 eBPF。

✅ 总结一句话

默认模式 = iptables 模式,Calico 的 NetworkPolicy 是通过在内核中动态编程 iptables 规则实现的。


图示

好的 👍
下面是一个 Calico 默认 iptables 模式 下的 流量路径示意图(TXT 版)
它展示了从 Pod → Pod 的流量如何经过 Linux 内核 + Calico 安全策略链。


🧩 Calico NetworkPolicy 流量路径 (iptables 模式)

        ┌──────────────────────────────┐
        │         Pod A (ns1)          │
        │   eth0: 10.198.0.11          │
        └──────────────┬───────────────┘
                       │
                       ▼
             [ Linux veth pair ]
                       │
                       ▼
┌────────────────────────────────────────────────────────────────┐
│                     Host Network Stack                         │
│                                                                │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │ iptables: mangle / raw / filter tables                   │  │
│  │                                                          │  │
│  │  (1) cali-OUTPUT       ← 出站流量                        │  │
│  │  (2) cali-from-<endpoint-id>                              │  │
│  │  (3) cali-pi-ns1.<policy> ← 匹配 Calico NetworkPolicy     │  │
│  │  (4) cali-tw-caliXXXX   ← 对应 veth 出口链                │  │
│  │                                                          │  │
│  │   若允许 → 转发到下一跳(veth/隧道接口)                   │  │
│  │   若拒绝 → DROP                                          │  │
│  └──────────────────────────────────────────────────────────┘  │
│                                                                │
│  ▼                                                             │
│  隧道 (vxlan/canal/flannel) → 另一节点                        │
│                                                                │
└────────────────────────────────────────────────────────────────┘
                       │
                       ▼
        ┌──────────────────────────────┐
        │         Pod B (ns2)          │
        │   eth0: 10.198.0.22          │
        └──────────────────────────────┘

🧱 主要链说明

链名作用
cali-FORWARD全局转发流量的入口链,Calico 会在此跳转到更细粒度链
cali-from-<ep>Pod 的入站方向安全策略链(匹配 ingress)
cali-to-<ep>Pod 的出站方向安全策略链(匹配 egress)
cali-pi-<ns>.<policy>每条 NetworkPolicy 生成一个对应的链
cali-nat-outgoing用于 SNAT 出公网或跨子网流量
cali-OUTPUT / cali-INPUT管理宿主机自身发往 Pod 的流量
cali-isolate防止非同网段的 Pod 直接通信

📜 规则匹配示例

一条 Calico NetworkPolicy(例如 ns1/policy-allow-web)会生成链:

Chain cali-pi-ns1.policy-allow-web (1 references)
target     prot opt source      destination
ACCEPT     tcp  --  10.198.0.0/21  anywhere  tcp dpt:80

Pod 对应的入口链中包含:

-A cali-from-ep-abc123 -j cali-pi-ns1.policy-allow-web

即:

  • 流量匹配 ingress 规则 → 允许;
  • 否则 → 最终被 DROP。

✅ 总结一句话

在 Calico 默认模式下,每条 NetworkPolicy 都会被翻译成一组 iptables 链
流量经过这些链时,按 ingress/egress 匹配,决定是否放行。


是否希望我再画一个对应的 eBPF 模式对照图(展示两种模式的区别)? 好的 👍
下面是一个对比图,展示 Calico iptables 模式 vs eBPF 模式数据路径差异(TXT 图)


🧩 Calico 网络策略数据路径对比图

================================================================================
      🧱 iptables 模式(默认)                ⚙️ eBPF 模式(BPF dataplane)
================================================================================

   ┌────────────────────────────┐           ┌────────────────────────────┐
   │         Pod A (ns1)        │           │         Pod A (ns1)        │
   │     eth0: 10.198.0.11      │           │     eth0: 10.198.0.11      │
   └──────────────┬─────────────┘           └──────────────┬─────────────┘
                  │                                        │
                  ▼                                        ▼
          [ veth pair 到 host ]                    [ veth pair 到 host ]
                  │                                        │
   ┌──────────────────────────────────┐         ┌──────────────────────────────────┐
   │        Linux Network Stack       │         │        Linux Network Stack       │
   │                                  │         │                                  │
   │   iptables hook 执行顺序:       │         │   eBPF hook 执行顺序:           │
   │                                  │         │                                  │
   │   PREROUTING ─┐                 │          │   XDP (ingress) ──────┐         │
   │                │                 │          │                        │         │
   │ → cali-from-ep-XXXX (ingress)   │          │ → BPF policy: ingress  │         │
   │ → cali-to-ep-XXXX (egress)      │          │ → conntrack bypass     │         │
   │ → cali-pi-ns1.policy-web        │          │ → BPF NAT / LB         │         │
   │ → cali-nat-outgoing (SNAT)      │          │ → eBPF tail call       │         │
   │ → 内核转发 / VXLAN              │          │ → 直接封装 VXLAN       │         │
   │                                  │         │                                  │
   │  ⚙️ 通过 netfilter decision     │         │  ⚙️ 通过 eBPF 程序逻辑判断       │
   │  🚫 每个包都进入 conntrack      │         │  ✅ 无需 conntrack (可选 bypass)  │
   │  🔁 iptables 链跳转多层         │         │  ⚡ BPF map 查询效率更高          │
   └──────────────────────────────────┘         └──────────────────────────────────┘
                  │                                        │
                  ▼                                        ▼
          [ vxlan 隧道到另一节点 ]                [ VXLAN / Geneve eBPF 封装发送 ]
                  │                                        │
   ┌────────────────────────────┐           ┌────────────────────────────┐
   │         Pod B (ns2)        │           │         Pod B (ns2)        │
   │     eth0: 10.198.0.22      │           │     eth0: 10.198.0.22      │
   └────────────────────────────┘           └────────────────────────────┘

================================================================================

🧠 关键区别总结

特性iptables 模式(默认)eBPF 模式
策略实现方式通过 iptables 链通过 eBPF 程序
流量路径进入 netfilter 层在内核 hook 直接处理
NAT/SNATiptables 实现eBPF NAT map 实现
conntrack必经 conntrack可绕过 conntrack
性能中等更高(少跳转)
调试方式iptables-savebpftool map/show
兼容性所有内核需 Linux ≥ 4.19 且启用 eBPF 支持
kube-proxy 依赖需要 kube-proxy可替代 kube-proxy

✅ 总结一句话

iptables 模式:稳定、兼容好;
eBPF 模式:性能高、可替代 kube-proxy,但依赖新内核。


是否希望我帮你补一张 Calico eBPF 模式下策略匹配逻辑(ingress/egress 判定) 的文字图?(展示 BPF map、endpoint、policy 之间关系)