cd ..
2026-04-218 min254 views

带你以不同的视角了解NAT的类型

#Network Address Translation#NAT#IP Mapping#Port Address Translation#SNAT And DNAT
AI Summary
每分钟最多 5 次
  • 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

数据包处理过程

  1. 内网主机发包:源IP=192.168.1.10
  2. NAT设备查表(静态配置)
  3. 替换源IP → 8.8.8.10
  4. 返回时再反向替换

特点

  • 稳定、可控
  • 占用公网IP(成本高)
  • 常用于:服务器对外发布

2. 动态 NAT(Dynamic NAT)

原理

  • 多对多映射(从公网IP池中动态分配)
  • 内网IP发起连接时,从公网IP池中“借一个”

示例

内网IP池: 192.168.1.0/24
公网IP池: 8.8.8.10 - 8.8.8.20

过程

  1. 内网主机发起请求
  2. NAT从公网池选一个空闲IP
  3. 建立临时映射(带超时)
  4. 会话结束后释放

特点

  • 节省公网IP(相对静态)
  • 不支持大量并发(IP池限制)

3. 端口地址转换(PAT / NAPT)

也叫:

  • NAT Overload
  • Port Address Translation

原理(最重要)

  • 多对一映射(共享一个公网IP,通过端口区分)

  • 修改:

    • IP地址
    • 端口号(关键)

示例

192.168.1.10:50008.8.8.1:10001
192.168.1.11:50008.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

数据包转换过程

  1. 客户端发起:

    src=192.168.1.10:5000 → dst=1.1.1.1:80
    
  2. NAT修改为:

    src=8.8.8.1:10001 → dst=1.1.1.1:80
    
  3. 返回包:

    dst=8.8.8.1:10001
    
  4. NAT查表恢复:

    dst=192.168.1.10:5000
    

特点

  • 最常见(家庭路由器、公司网络)
  • 极大节省公网IP
  • 支持大规模并发

二、按方向分类

1. SNAT(Source NAT)

原理

  • 修改源IP地址
  • 用于:内网访问外网

示例

192.168.1.108.8.8.1

使用场景

  • 内网机器访问互联网
  • Kubernetes 出网(SNAT)

2. DNAT(Destination NAT)

原理

  • 修改目标IP地址
  • 用于:外网访问内网服务

示例

8.8.8.1:80192.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)

特点(最复杂)

  • 每个目标地址都会生成不同映射
  • 外部无法预测端口
访问 A10001
访问 B10002

影响

  • P2P打洞困难
  • WebRTC最讨厌这种

四、实现原理(底层机制)

1. 核心组件

(1)NAT 表(状态表)

  • Key:

    (srcIP, srcPort, dstIP, dstPort, protocol)
    
  • Value:

    (newSrcIP, newSrcPort)
    

(2)连接跟踪(Conntrack)

在 Linux 中由:

  • nf_conntrack

负责:

  • 记录连接状态(TCP三次握手等)
  • 超时清理

2. 数据包处理流程

出站(SNAT)

  1. 匹配 NAT 规则

  2. 分配公网IP/端口

  3. 修改:

    • IP header
    • TCP/UDP header
  4. 更新校验和

  5. 写入 NAT 表


入站(DNAT / 回包)

  1. 查 NAT 表
  2. 反向还原地址
  3. 转发到内网主机

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

数据包处理过程

  1. 内网主机发包:源IP=192.168.1.10

  2. NAT设备查表(静态配置)

  3. 替换源IP → 8.8.8.10

  4. 返回时再反向替换

特点

  • 稳定、可控

  • 占用公网IP(成本高)

  • 常用于:服务器对外发布


2. 动态 NAT(Dynamic NAT)

原理

  • 多对多映射(从公网IP池中动态分配)

  • 内网IP发起连接时,从公网IP池中“借一个”

示例

内网IP池: 192.168.1.0/24
公网IP池: 8.8.8.10 - 8.8.8.20

过程

  1. 内网主机发起请求

  2. NAT从公网池选一个空闲IP

  3. 建立临时映射(带超时)

  4. 会话结束后释放

特点

  • 节省公网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.1050008.8.8.110001
192.168.1.1150008.8.8.110002

数据包转换过程

  1. 客户端发起:

    src=192.168.1.10:5000 → dst=1.1.1.1:80
  2. NAT修改为:

    src=8.8.8.1:10001 → dst=1.1.1.1:80
  3. 返回包:

    dst=8.8.8.1:10001
  4. 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)

  1. 匹配 NAT 规则

  2. 分配公网IP/端口

  3. 修改:

    • IP header

    • TCP/UDP header

  4. 更新校验和

  5. 写入 NAT 表


入站(DNAT / 回包)

  1. 查 NAT 表

  2. 反向还原地址

  3. 转发到内网主机


3. 关键技术点

✔ 端口复用

  • 通过不同端口区分连接

✔ 校验和重计算

  • IP/TCP/UDP checksum 必须更新

✔ 超时机制

  • TCP、UDP 不同策略


五、总结对比

类型映射关系是否改端口使用场景
静态 NAT1:1服务器
动态 NAT多:多企业
PAT多:1家庭/公司网络
SNAT出站可改上网
DNAT入站可改端口映射

六、一句话理解

  • 静态 NAT:固定翻译

  • 动态 NAT:临时分配IP

  • PAT:靠端口复用撑起整个互联网

  • SNAT/DNAT:一个改“谁发的”,一个改“发给谁”

  • 锥形/对称 NAT:决定你能不能打洞


/** Comments(0)*/

Loading comments...
带你以不同的视角了解NAT的类型 | UbanillxのDevLog