✅ 是的,完全正确。
在 默认(非 eBPF)模式 下,Calico 的 NetworkPolicy 实现是基于 iptables 的。
下面是更深入一点的解释:
🧩 Calico 的两种数据路径模式
| 模式 | 默认情况 | 实现机制 | 特点 |
|---|---|---|---|
| iptables 模式 | ✅ 默认启用 | 使用 Linux 内核 netfilter/iptables 实现安全策略 | 稳定、兼容性好 |
| eBPF 模式 | 可选 (enableBPF: true) | 用 eBPF 程序替代 iptables,直接在内核 hook 中执行 | 性能更高,功能更强(如原生负载均衡) |
🔧 iptables 模式下的原理
在默认模式中,Calico 的组件(主要是 calico-node)会:
- 监控所有 Calico NetworkPolicy / GlobalNetworkPolicy;
- 翻译成一系列 iptables 规则;
- 写入到主机的
filter表 和raw表 中。
常见的链包括:
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/SNAT | iptables 实现 | eBPF NAT map 实现 |
| conntrack | 必经 conntrack | 可绕过 conntrack |
| 性能 | 中等 | 更高(少跳转) |
| 调试方式 | iptables-save | bpftool map/show |
| 兼容性 | 所有内核 | 需 Linux ≥ 4.19 且启用 eBPF 支持 |
| kube-proxy 依赖 | 需要 kube-proxy | 可替代 kube-proxy |
✅ 总结一句话
iptables 模式:稳定、兼容好;
eBPF 模式:性能高、可替代 kube-proxy,但依赖新内核。
是否希望我帮你补一张 Calico eBPF 模式下策略匹配逻辑(ingress/egress 判定) 的文字图?(展示 BPF map、endpoint、policy 之间关系)