四表五链
image.png
- 路由决策的规则(可通过 ip route show 查看)
路由表根据数据包的 目标 IP 进行匹配(与路由条目中的 dst 字段对比)
最长前缀匹配: 选择子网掩码最长的路由条目(如 192.168.1.0/24 优先于 192.168.0.0/16)
路由决策的输出: 确定出口网卡(oif):如 eth0、eth1。
确定下一跳网关(via):如 192.168.1.1。
影响 NAT 行为:出口网卡决定了 SNAT 的 IP(如从 eth0 发出时,SNAT 会使用 eth0 的 IP)
报文流向:
- 流入本机:PREROUTING --> INPUT-->用户空间进程
- 流出本机:用户空间进程-->OUTPUT--> POSTROUTING
- 转发:PREROUTING --> FORWARD --> POSTROUTING
- 影响路由决策
- 影响dnat
- 影响conntrack的一致性
完整流程与 NAT 的关系
网卡入
→ PREROUTING (raw → mangle → nat[DNT]) # DNAT 修改目标 IP
→ 路由决策(匹配目标 IP) # 根据 DNAT 后的 IP 选择出口
→ FORWARD (mangle → filter) # 过滤转发包
→ POSTROUTING (mangle → nat[SNAT]) # SNAT 修改源 IP
→ 网卡出
- 抓包是在网卡处的
- 修改IP是在内核处理的
为什么 NAT 要分阶段修改
NAT 类型 阶段 依赖条件 目的
DNAT PREROUTING 需在路由决策前修改目标 IP 确保路由能正确转发到新目标(如将公网 IP 映射到内网服务器)。
SNAT POSTROUTING 需在路由决策后确定出口网卡 确保源 IP 与出口网卡一致(如内网 IP 改为公网 IP 后从 eth0 发出)。
总结
路由决策规则:
主要匹配 目标 IP,策略路由可额外匹配源 IP。
出口网卡决定 SNAT 的 IP。DNAT 在 PREROUTING:
先修改目标 IP,再路由。SNAT 在 POSTROUTING:
先路由确定出口网卡,再修改源 IP。