带你以不同的视角了解NAT的类型
- NAT(网络地址转换) 在不同地址空间之间做映射,主要用于解决IPv4地址不足、隐藏内网结构和实现访问控制。
- 静态 NAT 提供一对一固定映射,预先配置且不会变化,适用于服务器对外发布,但成本较高。
- 动态 NAT 通过公网IP池动态分配IP,节省公网IP资源但不支持大量并发。
- PAT/NAPT 实现多对一映射,通过端口号区分连接,极大节省公网IP并支持大规模并发,是家庭路由器和公司网络中最常见的类型。
- SNAT/DNAT 分别修改源IP和目标IP地址,用于内网访问外网和外网访问内网服务。SNAT常用于Kubernetes出网,而DNAT用于端口映射和Web服务发布。
NAT(Network Address Translation,网络地址转换)本质是在不同地址空间之间做映射,通常发生在边界设备(路由器/防火墙)上,用于解决IPv4地址不足、隐藏内网结构、实现访问控制等。
下面按常见分类 + 原理实现系统说明。
一、按映射方式分类(核心)
1. 静态 NAT(Static NAT)
原理
- 一对一固定映射
- 内网 IP ↔ 公网 IP 是预先配置好的,不会变化
示例
192.168.1.10 <--> 8.8.8.10
数据包处理过程
- 内网主机发包:源IP=192.168.1.10
- NAT设备查表(静态配置)
- 替换源IP → 8.8.8.10
- 返回时再反向替换
特点
- 稳定、可控
- 占用公网IP(成本高)
- 常用于:服务器对外发布
2. 动态 NAT(Dynamic NAT)
原理
- 多对多映射(从公网IP池中动态分配)
- 内网IP发起连接时,从公网IP池中“借一个”
示例
内网IP池: 192.168.1.0/24
公网IP池: 8.8.8.10 - 8.8.8.20
过程
- 内网主机发起请求
- NAT从公网池选一个空闲IP
- 建立临时映射(带超时)
- 会话结束后释放
特点
- 节省公网IP(相对静态)
- 不支持大量并发(IP池限制)
3. 端口地址转换(PAT / NAPT)
也叫:
- NAT Overload
- Port Address Translation
原理(最重要)
-
多对一映射(共享一个公网IP,通过端口区分)
-
修改:
- IP地址
- 端口号(关键)
示例
192.168.1.10:5000 → 8.8.8.1:10001
192.168.1.11:5000 → 8.8.8.1:10002
NAT表(核心数据结构)
| 内网IP | 内网端口 | 公网IP | 公网端口 |
|---|---|---|---|
| 192.168.1.10 | 5000 | 8.8.8.1 | 10001 |
| 192.168.1.11 | 5000 | 8.8.8.1 | 10002 |
数据包转换过程
-
客户端发起:
src=192.168.1.10:5000 → dst=1.1.1.1:80 -
NAT修改为:
src=8.8.8.1:10001 → dst=1.1.1.1:80 -
返回包:
dst=8.8.8.1:10001 -
NAT查表恢复:
dst=192.168.1.10:5000
特点
- 最常见(家庭路由器、公司网络)
- 极大节省公网IP
- 支持大规模并发
二、按方向分类
1. SNAT(Source NAT)
原理
- 修改源IP地址
- 用于:内网访问外网
示例
192.168.1.10 → 8.8.8.1
使用场景
- 内网机器访问互联网
- Kubernetes 出网(SNAT)
2. DNAT(Destination NAT)
原理
- 修改目标IP地址
- 用于:外网访问内网服务
示例
8.8.8.1:80 → 192.168.1.10:8080
场景
- 端口映射(Port Forwarding)
- 发布Web服务
三、按行为模型(RFC 3489 / STUN分类)
用于P2P / WebRTC等场景
1. Full Cone NAT(完全锥形)
特点
- 一旦映射建立,任何外部IP都可以访问
- 最宽松
内网: 192.168.1.10:5000
公网: 8.8.8.1:10001
任何人 → 8.8.8.1:10001 都能进来
2. Restricted Cone NAT(受限锥形)
特点
- 只有访问过的IP才能回包
3. Port Restricted Cone NAT
特点
-
限制更严格:
- IP + 端口都必须匹配
4. Symmetric NAT(对称 NAT)
特点(最复杂)
- 每个目标地址都会生成不同映射
- 外部无法预测端口
访问 A → 10001
访问 B → 10002
影响
- P2P打洞困难
- WebRTC最讨厌这种
四、实现原理(底层机制)
1. 核心组件
(1)NAT 表(状态表)
-
Key:
(srcIP, srcPort, dstIP, dstPort, protocol) -
Value:
(newSrcIP, newSrcPort)
(2)连接跟踪(Conntrack)
在 Linux 中由:
nf_conntrack
负责:
- 记录连接状态(TCP三次握手等)
- 超时清理
2. 数据包处理流程
出站(SNAT)
-
匹配 NAT 规则
-
分配公网IP/端口
-
修改:
- IP header
- TCP/UDP header
-
更新校验和
-
写入 NAT 表
入站(DNAT / 回包)
- 查 NAT 表
- 反向还原地址
- 转发到内网主机
3. 关键技术点
✔ 端口复用
- 通过不同端口区分连接
✔ 校验和重计算
- IP/TCP/UDP checksum 必须更新
✔ 超时机制
- TCP、UDP 不同策略
五、总结对比
| 类型 | 映射关系 | 是否改端口 | 使用场景 |
|---|---|---|---|
| 静态 NAT | 1:1 | 否 | 服务器 |
| 动态 NAT | 多:多 | 否 | 企业 |
| PAT | 多:1 | ✔ | 家庭/公司网络 |
| SNAT | 出站 | 可改 | 上网 |
| DNAT | 入站 | 可改 | 端口映射 |
六、一句话理解
- 静态 NAT:固定翻译
- 动态 NAT:临时分配IP
- PAT:靠端口复用撑起整个互联网
- SNAT/DNAT:一个改“谁发的”,一个改“发给谁”
- 锥形/对称 NAT:决定你能不能打洞
如果你需要,我可以再给你画一个完整 NAT + 防火墙 + conntrack 的数据流时序图,或者结合 **Kubernetes / Docker / 云环境(如 VPC)**讲实际落地实现。
NAT(Network Address Translation,网络地址转换)本质是在不同地址空间之间做映射,通常发生在边界设备(路由器/防火墙)上,用于解决IPv4地址不足、隐藏内网结构、实现访问控制等。
下面按常见分类 + 原理实现系统说明。
一、按映射方式分类(核心)
1. 静态 NAT(Static NAT)
原理
一对一固定映射
内网 IP ↔ 公网 IP 是预先配置好的,不会变化
示例
192.168.1.10 <–> 8.8.8.10
数据包处理过程
内网主机发包:源IP=192.168.1.10
NAT设备查表(静态配置)
替换源IP → 8.8.8.10
返回时再反向替换
特点
稳定、可控
占用公网IP(成本高)
常用于:服务器对外发布
2. 动态 NAT(Dynamic NAT)
原理
多对多映射(从公网IP池中动态分配)
内网IP发起连接时,从公网IP池中“借一个”
示例
内网IP池: 192.168.1.0/24
公网IP池: 8.8.8.10 - 8.8.8.20
过程
内网主机发起请求
NAT从公网池选一个空闲IP
建立临时映射(带超时)
会话结束后释放
特点
节省公网IP(相对静态)
不支持大量并发(IP池限制)
3. 端口地址转换(PAT / NAPT)
也叫:
NAT Overload
Port Address Translation
原理(最重要)
多对一映射(共享一个公网IP,通过端口区分)
修改:
IP地址
端口号(关键)
示例
192.168.1.10:5000 → 8.8.8.1:10001
192.168.1.11:5000 → 8.8.8.1:10002
NAT表(核心数据结构)
| 内网IP | 内网端口 | 公网IP | 公网端口 |
|---|---|---|---|
| 192.168.1.10 | 5000 | 8.8.8.1 | 10001 |
| 192.168.1.11 | 5000 | 8.8.8.1 | 10002 |
数据包转换过程
客户端发起:
src=192.168.1.10:5000 → dst=1.1.1.1:80
NAT修改为:
src=8.8.8.1:10001 → dst=1.1.1.1:80
返回包:
dst=8.8.8.1:10001
NAT查表恢复:
dst=192.168.1.10:5000
特点
最常见(家庭路由器、公司网络)
极大节省公网IP
支持大规模并发
二、按方向分类
1. SNAT(Source NAT)
原理
修改源IP地址
用于:内网访问外网
示例
192.168.1.10 → 8.8.8.1
使用场景
内网机器访问互联网
Kubernetes 出网(SNAT)
2. DNAT(Destination NAT)
原理
修改目标IP地址
用于:外网访问内网服务
示例
8.8.8.1:80 → 192.168.1.10:8080
场景
端口映射(Port Forwarding)
发布Web服务
三、按行为模型(RFC 3489 / STUN分类)
用于P2P / WebRTC等场景
1. Full Cone NAT(完全锥形)
特点
一旦映射建立,任何外部IP都可以访问
最宽松
内网: 192.168.1.10:5000
公网: 8.8.8.1:10001
任何人 → 8.8.8.1:10001 都能进来
2. Restricted Cone NAT(受限锥形)
特点
只有访问过的IP才能回包
3. Port Restricted Cone NAT
特点
限制更严格:
IP + 端口都必须匹配
4. Symmetric NAT(对称 NAT)
特点(最复杂)
每个目标地址都会生成不同映射
外部无法预测端口
访问 A → 10001
访问 B → 10002
影响
P2P打洞困难
WebRTC最讨厌这种
四、实现原理(底层机制)
1. 核心组件
(1)NAT 表(状态表)
Key:
(srcIP, srcPort, dstIP, dstPort, protocol)
Value:
(newSrcIP, newSrcPort)
(2)连接跟踪(Conntrack)
在 Linux 中由:
nf_conntrack
负责:
记录连接状态(TCP三次握手等)
超时清理
2. 数据包处理流程
出站(SNAT)
匹配 NAT 规则
分配公网IP/端口
修改:
IP header
TCP/UDP header
更新校验和
写入 NAT 表
入站(DNAT / 回包)
查 NAT 表
反向还原地址
转发到内网主机
3. 关键技术点
✔ 端口复用
通过不同端口区分连接
✔ 校验和重计算
IP/TCP/UDP checksum 必须更新
✔ 超时机制
TCP、UDP 不同策略
五、总结对比
| 类型 | 映射关系 | 是否改端口 | 使用场景 |
|---|---|---|---|
| 静态 NAT | 1:1 | 否 | 服务器 |
| 动态 NAT | 多:多 | 否 | 企业 |
| PAT | 多:1 | ✔ | 家庭/公司网络 |
| SNAT | 出站 | 可改 | 上网 |
| DNAT | 入站 | 可改 | 端口映射 |
六、一句话理解
静态 NAT:固定翻译
动态 NAT:临时分配IP
PAT:靠端口复用撑起整个互联网
SNAT/DNAT:一个改“谁发的”,一个改“发给谁”
锥形/对称 NAT:决定你能不能打洞