路由表 和 NAT 的关系是什么?
它们都是 Linux 网络栈中处理 IP 包 的重要机制,但属于两个不同的阶段、目的不同:
✅ 路由表:决定 包往哪走
- 路由表是操作系统的“导航图”。
- 它根据 IP 包的 目标地址(Dst IP) 查找该往哪个接口(网卡)、哪个下一跳(gateway)发。
- NAT和路由表的顺序:
-
- 入站方向:必须先做 DNAT,再查路由表,因为目标地址可能会影响路由。
- 出站方向:查完路由表之后再做 SNAT,因为源地址的改变不影响去哪(只影响回来时能不能回来)。
✅ NAT:改变 IP 包的地址
NAT(Network Address Translation)可以分为:
| 类型 | 改动 | 常见作用 |
|---|---|---|
| SNAT | 修改源地址(Src IP) | 内网出网 |
| DNAT | 修改目标地址(Dst IP) | 外网入内网 |
- NAT 是通过 Netfilter 子系统 的钩子(如 PREROUTING、POSTROUTING)实现的。
- NAT 并不决定包往哪走,它只改变 IP 包的源/目标地址。
🔄 它们在数据包处理链中的顺序是:
▶️ 入站方向(比如公网到内网):
- PREROUTING
-
- DNAT 修改目标 IP
- Routing Decision(查路由表)
-
- 用 修改后的目标 IP 查找路由表 → 决定包送到哪(本机、别的网卡等)
- Local Input / FORWARD
◀️ 出站方向(比如内网发往公网):
- Routing Decision(查路由表)
-
- 用原始目标 IP 查路由表 → 决定发往哪个设备
- POSTROUTING
-
- SNAT/MASQUERADE 修改源 IP(例如变成服务器公网 IP)