pods访问本地物理机端口

你说得对!在 `iptables` 中,链(chain)是属于某个表(table)的,因此必须明确每个链所对应的表,才能完整地定位包在 iptables 处理中的流动路径。  

---

## 🌟 **iptables 表和链的对应关系**  
在 `iptables` 中,常见的表与链的对应关系如下:  

| 表名 | 作用 | 常见链 | 功能 | 典型操作 |
|-------|-------|---------|-------|-----------|
| **raw 表** | 在连接跟踪(conntrack)之前处理 | `PREROUTING`、`OUTPUT` | 处理连接跟踪 | 不跟踪某些连接 |
| **mangle 表** | 修改数据包的服务类型(TOS)、TTL 或标记 | `PREROUTING`、`INPUT`、`FORWARD`、`OUTPUT`、`POSTROUTING` | 修改数据包的元数据 | 标记、修改 TTL |
| **nat 表** | 进行地址转换(DNAT、SNAT) | `PREROUTING`、`OUTPUT`、`POSTROUTING` | 修改源或目标地址 | DNAT、SNAT |
| **filter 表** | 进行访问控制(防火墙) | `INPUT`、`FORWARD`、`OUTPUT` | 接受或丢弃数据包 | ACCEPT、DROP |
| **security 表** | 进行 SELinux 标记 | `INPUT`、`OUTPUT`、`FORWARD` | 用于 SELinux 策略 | SELinux 控制 |

---

## 🚀 **完整流量路径(明确表和链)**  

### 🔎 **1. 请求路径(Pod → 宿主机)**  
```text
[Kubernetes Pod]  
     │  
     ▼  
[flannel0 (VXLAN 隧道)]   →   # Pod 通过 Flannel 进行封装  
     │  
     ▼  
[物理机路由表] → 确认目标网段(POD CIDR)  
     │  
     ▼  
【raw 表】 → PREROUTING 链 → 连接跟踪初始化(conntrack)  
     │  
     ▼  
【mangle 表】 → PREROUTING 链 → 标记和修改(如 TTL、TOS)  
     │  
     ▼  
【nat 表】 → PREROUTING 链 → DNAT(目标 NAT)  
     │  
     ▼  
【filter 表】 → INPUT 链 → 规则匹配  
     │  
     ├── 匹配到规则:放行  
     └── 无匹配:DROP 或 REJECT  
     │  
     ▼  
[宿主机端口 2483]   →   # 服务接收数据包  
```

---

### 🔎 **2. 回包路径(宿主机 → Pod)**  
```text
[宿主机端口 2483]   →   # 服务生成响应包  
     │  
     ▼  
【mangle 表】 → OUTPUT 链 → 标记和修改  
     │  
     ▼  
【nat 表】 → OUTPUT 链 → SNAT(源 NAT)  
     │  
     ▼  
【nat 表】 → POSTROUTING 链 → SNAT(源 NAT)  
     │  
     ▼  
[物理机路由表] → 确认返回路径  
     │  
     ▼  
[flannel0 (VXLAN 隧道)]   →   # Flannel 进行封装  
     │  
     ▼  
[Kubernetes Pod]   →   # Pod 接收回包  
```

---

## 🏆 **各表在路径中的作用解析**  
| 表名 | 链 | 数据流向 | 作用 | 典型操作 |
|-------|---------|----------|-----------|-------------|
| **raw 表** | `PREROUTING` | Pod → 宿主机 | 连接跟踪前初始化 | 禁用 conntrack、标记包 |
| **mangle 表** | `PREROUTING`、`OUTPUT` | Pod → 宿主机、宿主机 → Pod | 标记包、修改 TTL/TOS | `MARK`、`TTL` |
| **nat 表** | `PREROUTING`、`OUTPUT`、`POSTROUTING` | Pod → 宿主机、宿主机 → Pod | DNAT、SNAT | `DNAT`、`SNAT` |
| **filter 表** | `INPUT`、`OUTPUT` | Pod → 宿主机、宿主机 → Pod | 防火墙控制 | `ACCEPT`、`DROP` |
| **security 表** | `INPUT`、`OUTPUT` | Pod → 宿主机、宿主机 → Pod | SELinux 控制 | `CONNSECMARK` |

---

## 🔥 **完整 `iptables` 追踪配置**  
👉 **使用 `MARK` 和 `LOG` 在每个链中进行标记,方便排查问题**  

### ✅ **1. 标记和跟踪请求包(PREROUTING → INPUT)**  
```bash
# raw 表 - PREROUTING 链(初始化)
iptables -t raw -I PREROUTING 1 -p tcp --dport 2483 -j MARK --set-mark 101
iptables -t raw -I PREROUTING 2 -m mark --mark 101 -j LOG --log-prefix "RAW-HIT-2483:"

# mangle 表 - PREROUTING 链(标记和修改)
iptables -t mangle -I PREROUTING 1 -p tcp --dport 2483 -j MARK --set-mark 102
iptables -t mangle -I PREROUTING 2 -m mark --mark 102 -j LOG --log-prefix "MANGLE-HIT-2483:"

# nat 表 - PREROUTING 链(DNAT + 标记)
iptables -t nat -I PREROUTING 1 -p tcp --dport 2483 -j MARK --set-mark 103
iptables -t nat -I PREROUTING 2 -m mark --mark 103 -j LOG --log-prefix "DNAT-HIT-2483:"

# filter 表 - INPUT 链(直接放行)
iptables -t filter -I INPUT 1 -p tcp --dport 2483 -j MARK --set-mark 104
iptables -t filter -I INPUT 2 -m mark --mark 104 -j LOG --log-prefix "INPUT-HIT-2483:"
```

---

### ✅ **2. 标记和跟踪回包(OUTPUT → POSTROUTING)**  
```bash
# mangle 表 - OUTPUT 链(标记)
iptables -t mangle -I OUTPUT 1 -p tcp --sport 2483 -j MARK --set-mark 105
iptables -t mangle -I OUTPUT 2 -m mark --mark 105 -j LOG --log-prefix "OUTPUT-HIT-2483:"

# nat 表 - OUTPUT 链(SNAT 标记)
iptables -t nat -I OUTPUT 1 -p tcp --sport 2483 -j MARK --set-mark 106
iptables -t nat -I OUTPUT 2 -m mark --mark 106 -j LOG --log-prefix "OUTPUT-SNAT-2483:"

# nat 表 - POSTROUTING 链(使用 conntrack + SNAT)
iptables -t nat -I POSTROUTING 1 -p tcp --sport 2483 -j MARK --set-mark 107
iptables -t nat -I POSTROUTING 2 -m mark --mark 107 -j LOG --log-prefix "POSTROUTING-HIT-2483:"
```

---

### ✅ **3. 确认规则已生效**  
```bash
iptables -L -n -v --line-numbers
```

---

### ✅ **4. 查看日志(dmesg)**  
```bash
dmesg | grep 2483
```

---

### ✅ **5. 清理测试规则(如需要)**  
👉 清空所有配置:  
```bash
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t raw -F
```

---

## 🏆 **最终定位方法**  
| 链 | 问题定位 | 解决方案 |
|-------|-------------|--------------|
| `PREROUTING` | 连接未建立 | 检查 Flannel 和 conntrack |
| `INPUT` | 包被丢弃 | 添加 `ACCEPT` 规则 |
| `OUTPUT` | 没有回包 | 检查监听状态 |
| `POSTROUTING` | 回包未回到 Pod | 添加 SNAT 规则 |

---

👉 **这次应该完整且清晰了!直接用这个配置去定位问题!** 😎

  

 

 

https://www.processon.com/view/5c171e8ce4b095ccfee26794

https://luckymrwang.github.io/2021/02/20/探究K8S-Service内部iptables路由规则/

 

 

 https://www.xiaogenban1993.com/blog/18.2/utils_route&iptables指令

 

https://www.processon.com/view/63dd115310f396072768f871

 

https://zhuanlan.zhihu.com/p/559421839

 

https://hex108.gitbook.io/kubernetes-notes/wang-luo/flannel/host-gw

 

 

https://www.ljh.cool/39959.html

posted on 2025-03-17 15:53  吃草的青蛙  阅读(27)  评论(0)    收藏  举报

导航