## 🚀 **Kubernetes Pod 通信完整路径(发包 + 回包)**
👉 本流程覆盖:
✅ Pod → Pod(同节点)
✅ Pod → Pod(跨节点)
✅ 涉及完整的 iptables 表和链
✅ 涉及 Flannel VXLAN 封装和解封
---
## 🌟 **完整通信流程总览**
```text
[Pod A] → [Flannel VXLAN 封装] → [物理机路由表] →
[iptables: PREROUTING → INPUT] → [Pod B]
[Pod B] → [iptables: OUTPUT → POSTROUTING] → [Flannel VXLAN 封装] →
[物理机路由表] → [Pod A]
```
---
## ✅ **1. 发包路径(Pod A → Pod B)**
👉 **流量方向:Pod A → Pod B**
👉 **同节点通信** 和 **跨节点通信** 的区别:
- **同节点**:直接通过本地网络路由
- **跨节点**:通过 Flannel VXLAN 隧道封装
---
### 🚀 **(1) Pod A → Pod B(同节点)**
```text
[Pod A]
│
▼
[flannel0(VXLAN 隧道)] → 本地路由表直接送达
│
▼
【raw 表】 → PREROUTING 链 → 连接跟踪初始化(conntrack)
│
▼
【mangle 表】 → PREROUTING 链 → 标记和修改
│
▼
【nat 表】 → PREROUTING 链 → DNAT(目标 NAT)
│
▼
【filter 表】 → INPUT 链 → 规则匹配
│
├── 匹配到规则:放行
└── 无匹配:DROP 或 REJECT
│
▼
[Pod B] → # Pod B 接收数据包
```
---
### 🚀 **(2) Pod A → Pod B(跨节点)**
```text
[Pod A]
│
▼
[flannel0(VXLAN 隧道)] → 隧道封装
│
▼
[物理机路由表] → 通过 VXLAN 发送到目标节点
│
▼
【raw 表】 → PREROUTING 链 → 连接跟踪初始化
│
▼
【mangle 表】 → PREROUTING 链 → 标记和修改
│
▼
【nat 表】 → PREROUTING 链 → DNAT(目标 NAT)
│
▼
【filter 表】 → INPUT 链 → 规则匹配
│
├── 匹配到规则:放行
└── 无匹配:DROP 或 REJECT
│
▼
[Pod B] → # Pod B 接收数据包
```
---
### 🏆 **完整 iptables 规则(发包路径)**
👉 **(1) `raw` 表 - PREROUTING 链(初始化)**
```bash
iptables -t raw -I PREROUTING 1 -p tcp --dport 80 -j MARK --set-mark 101
iptables -t raw -I PREROUTING 2 -m mark --mark 101 -j LOG --log-prefix "RAW-HIT-80:"
```
👉 **(2) `mangle` 表 - PREROUTING 链(标记和修改)**
```bash
iptables -t mangle -I PREROUTING 1 -p tcp --dport 80 -j MARK --set-mark 102
iptables -t mangle -I PREROUTING 2 -m mark --mark 102 -j LOG --log-prefix "MANGLE-HIT-80:"
```
👉 **(3) `nat` 表 - PREROUTING 链(DNAT)**
> DNAT 将目标 IP 替换为目标 Pod IP
```bash
iptables -t nat -I PREROUTING 1 -p tcp --dport 80 -j DNAT --to-destination 10.244.1.5:80
iptables -t nat -I PREROUTING 2 -m mark --mark 102 -j LOG --log-prefix "DNAT-HIT-80:"
```
👉 **(4) `filter` 表 - INPUT 链(放行)**
```bash
iptables -t filter -I INPUT 1 -p tcp --dport 80 -j ACCEPT
iptables -t filter -I INPUT 2 -m mark --mark 102 -j LOG --log-prefix "INPUT-HIT-80:"
```
---
## ✅ **2. 回包路径(Pod B → Pod A)**
👉 **流量方向:Pod B → Pod A**
👉 **同节点通信** 和 **跨节点通信** 的区别:
- **同节点**:直接通过本地路由表
- **跨节点**:需要通过 VXLAN 隧道封装
---
### 🚀 **(1) Pod B → Pod A(同节点)**
```text
[Pod B]
│
▼
【mangle 表】 → OUTPUT 链 → 标记和修改
│
▼
【nat 表】 → POSTROUTING 链 → 直接返回(不封装)
│
▼
[物理机路由表] → 直接路由回 Pod A
│
▼
[Pod A] → # Pod A 接收回包
```
---
### 🚀 **(2) Pod B → Pod A(跨节点)**
```text
[Pod B]
│
▼
【mangle 表】 → OUTPUT 链 → 标记和修改
│
▼
【nat 表】 → POSTROUTING 链 → SNAT + VXLAN 封装
│
▼
[物理机路由表] → 通过 VXLAN 发送到源节点
│
▼
[flannel0(VXLAN 隧道)] → 封装解析
│
▼
[Pod A] → # Pod A 接收回包
```
---
### 🏆 **完整 iptables 规则(回包路径)**
👉 **(1) `mangle` 表 - OUTPUT 链(标记)**
```bash
iptables -t mangle -I OUTPUT 1 -p tcp --sport 80 -j MARK --set-mark 201
iptables -t mangle -I OUTPUT 2 -m mark --mark 201 -j LOG --log-prefix "OUTPUT-HIT-80:"
```
👉 **(2) `nat` 表 - OUTPUT 链(记录日志)**
```bash
iptables -t nat -I OUTPUT 1 -p tcp --sport 80 -j MARK --set-mark 202
iptables -t nat -I OUTPUT 2 -m mark --mark 202 -j LOG --log-prefix "OUTPUT-SNAT-80:"
```
👉 **(3) `nat` 表 - POSTROUTING 链(SNAT + VXLAN 封装)**
> 如果是跨节点通信,需要通过 `flannel.1` 接口封装
```bash
iptables -t nat -A POSTROUTING -p tcp --sport 80 -j MARK --set-mark 203
iptables -t nat -A POSTROUTING -m mark --mark 203 -j LOG --log-prefix "POSTROUTING-HIT-80:"
iptables -t nat -A POSTROUTING -o flannel.1 -p tcp --sport 80 -j MASQUERADE
```
---
## ✅ **3. Flannel VXLAN 路由配置**
👉 **配置路由规则**
```bash
ip route add 10.244.2.0/24 via 192.168.1.12 dev flannel.1
```
✅ **解释:**
- `10.244.2.0/24` → 目标 Pod 的 CIDR
- `192.168.1.12` → 目标节点 IP
- `flannel.1` → VXLAN 接口
---
## 🏆 **完整了!发包路径 + 回包路径 + Flannel 封装,全链路覆盖!** 😎