网络地址转换(NAT)
- 网络地址转换(NAT)详解:从基础到四种锥型及对称型
-
- 一、什么是NAT?为什么需要它?
- [二、NAT的核心概念:绑定(Session Binding)](#二、NAT的核心概念:绑定(Session Binding))
- 三、NAT的五种类型(核心内容)
-
- [1. 完全锥型 NAT(Full Cone NAT)](#1. 完全锥型 NAT(Full Cone NAT))
- [2. 受限锥型 NAT(Restricted Cone NAT)](#2. 受限锥型 NAT(Restricted Cone NAT))
- [3. 端口受限锥型 NAT(Port Restricted Cone NAT)](#3. 端口受限锥型 NAT(Port Restricted Cone NAT))
- [4. 对称型 NAT(Symmetric NAT)](#4. 对称型 NAT(Symmetric NAT))
- 四、为什么NAT类型对P2P如此重要?
- 五、如何检测自己的NAT类型?
- 六、如何优化NAT类型?
- 总结对比表
网络地址转换(NAT)详解:从基础到四种锥型及对称型
你家的路由器到底是怎么让所有设备共享一个公网IP的?这篇文章彻底讲透NAT的工作原理和五种典型类型。
一、什么是NAT?为什么需要它?
简单来说,NAT(Network Address Translation,网络地址转换) 是一种将私有IP地址映射为公网IP地址的技术。
你没有那么多公网IPv4地址给家里的每一台设备。IPv4地址只有约42亿个,而全球设备早已远超这个数字。NAT的诞生很大程度上缓解了IPv4地址枯竭的压力。
一个经典场景:
- 家里的手机、电脑、平板都分配了像
192.168.1.x这样的私有地址 - 当这些设备访问互联网时,路由器会把它们的私有IP+端口替换成路由器的公网IP+一个新端口
- 外部服务器看到的请求来源全是路由器的公网IP,响应数据再通过路由器分发给正确的内网设备
这个过程被称为 NAT,它不仅节省公网IP,还天然提供了一层安全隔离------外部无法直接主动访问你内网的设备。
二、NAT的核心概念:绑定(Session Binding)
理解NAT类型之前,必须先搞懂"绑定"这个概念。
当内网设备 192.168.1.100:12345 访问外部服务器 8.8.8.8:80 时,路由器会建立一张映射表:
| 内网地址:端口 | 映射后的公网地址:端口 | 目标地址:端口 |
|---|---|---|
| 192.168.1.100:12345 | 1.2.3.4:50000 | 8.8.8.8:80 |
这个 1.2.3.4:50000 就是路由器临时为该会话分配的"公网出口"。后续来自 8.8.8.8:80 发往 1.2.3.4:50000 的包,路由器会转回给 192.168.1.100:12345。
不同NAT类型的本质区别:当一个内网设备已经建立了一个映射关系后,另一个外部主机(不同于之前的目标)能否利用这个已有的映射往内网发包?以及,同一个内网端口访问不同外部主机时,是否会复用同一个公网端口?
三、NAT的五种类型(核心内容)
这是你需要重点理解的部分。下面按照从"最开放"到"最严格"的顺序介绍。
1. 完全锥型 NAT(Full Cone NAT)
定义 :一旦内网设备 (内网IP, 内网端口) 映射到 (公网IP, 公网端口),任何外部主机都可以通过这个 (公网IP, 公网端口) 向内网设备发送数据包。
特点:
- 最开放,安全策略最宽松
- 外部主机A、B、C、D...都可以主动连接进来
- 对P2P应用最友好
映射示例:
内网 192.168.1.100:12345 → 路由器映射为 1.2.3.4:10000
外部主机 (任意IP:任意端口) → 1.2.3.4:10000 → 可送达 192.168.1.100:12345
为什么叫"锥型"? 想象一个锥体,从内网这个点出发,映射到一个固定的公网端口后,所有外部主机都能通过这个锥底(公网端口)访问进来。
注意:完全锥型并不常见,因为太不安全。绝大多数家用路由器都不是这个类型。
2. 受限锥型 NAT(Restricted Cone NAT)
定义 :只有内网设备曾经主动访问过 的外部主机,才能通过 (公网IP, 公网端口) 向内网设备发送数据包。但对端主机的端口不做限制。
特点:
- 比完全锥型多了一道门禁:外部主机必须在"白名单"里
- 白名单的判定标准:内网设备曾经向该IP地址发送过数据
- 该外部主机的任意端口都可以向内发包
映射示例:
内网 192.168.1.100:12345 先访问了 8.8.8.8:80
→ 路由器映射 1.2.3.4:10000
→ 外部主机 8.8.8.8 的任何端口(如 8.8.8.8:9999)都可以通过 1.2.3.4:10000 向内发包
→ 但 9.9.9.9(未访问过)发来的包会被丢弃
3. 端口受限锥型 NAT(Port Restricted Cone NAT)
定义 :这是受限锥型的加强版。仅当内网设备曾经主动访问过 特定的 (外部IP, 外部端口) 时,该外部主机才能从相同的端口向内发送数据包。
特点:
- 门禁更严:不仅限制IP,还限制端口
- 外部主机必须使用内网设备曾经访问过的那个端口来发包
- 这是家用NAT中最常见的类型之一
映射示例:
内网 192.168.1.100:12345 访问了 8.8.8.8:80
→ 路由器映射 1.2.3.4:10000
→ 只有来自 8.8.8.8:80 的包可以到达内网
→ 来自 8.8.8.8:53(不同端口)的包会被丢弃
→ 来自 9.9.9.9:80 的包也会被丢弃
三种锥型对比:
| 类型 | 同IP任意端口可访问? | 未访问过的IP可访问? |
|---|---|---|
| 完全锥型 | ✅ | ✅ |
| 受限锥型 | ✅ | ❌ |
| 端口受限锥型 | ❌ | ❌ |
4. 对称型 NAT(Symmetric NAT)
定义 :内网设备 (内网IP, 内网端口) 访问不同的外部主机时,路由器会分配不同的公网端口。并且,只有内网设备主动访问过的外部主机才能向内回包。
特点:
- 与前三种"锥型"完全不同
- 锥型NAT中,同一个内网端口访问任何外部主机都复用同一个公网端口
- 对称型NAT中,每次连接的目标不同,公网端口就不同
- P2P最难穿透的一种NAT
映射示例:
内网 192.168.1.100:12345 访问 8.8.8.8:80 → 映射为 1.2.3.4:10000
内网 192.168.1.100:12345 访问 9.9.9.9:80 → 映射为 1.2.3.4:10001(不同的端口!)
只有 8.8.8.8:80 可以向 1.2.3.4:10000 发包
只有 9.9.9.9:80 可以向 1.2.3.4:10001 发包
对称型 vs 端口受限锥型:
关键区别在于:同一个内网端口访问不同的外部服务器时,公网端口是否会变化。
端口受限锥型:
192.168.1.100:12345 → 8.8.8.8:80 → 映射为 1.2.3.4:10000
192.168.1.100:12345 → 9.9.9.9:443 → 映射为 1.2.3.4:10000(复用端口)
对称型:
192.168.1.100:12345 → 8.8.8.8:80 → 映射为 1.2.3.4:10000
192.168.1.100:12345 → 9.9.9.9:443 → 映射为 1.2.3.4:10001(新端口)
四、为什么NAT类型对P2P如此重要?
P2P(如BitTorrent、视频通话、区块链、游戏联机)要求两个内网设备能直接建立连接。
锥型NAT比较容易打洞:
- 双方通过中间服务器交换彼此的NAT映射地址
- 直接向对方的公网地址发包,利用已有的映射关系实现穿透
对称型NAT打洞很困难:
- 因为每个目标都对应不同的公网端口,端口不可预测
- 通常需要中间服务器进行数据中转(TURN协议),这会增加延迟和服务器负载
所以,如果你玩的主机游戏经常提示"NAT类型严格",多半是落在了对称型或者端口受限锥型上。
五、如何检测自己的NAT类型?
简单方法:
- Windows上用
netstat -ano查看本地端口 - 访问
whatsmyip.org获取公网IP - 用telnet或nc向自己的公网IP+端口发包测试
专业工具:
-
STUN服务器测试 :最标准的方法
- 命令示例:
stunclient --mode full stun.stunprotocol.org
- 命令示例:
-
推荐开源工具:
pystun3pip install pystun3 pystun3
六、如何优化NAT类型?
如果你想要更开放的NAT(比如为了Switch/PS5/Xbox联机体验):
-
开启UPnP(通用即插即用)
- 路由器管理后台 → 启用UPnP
- 应用可以动态请求端口映射
-
手动端口转发
- 为特定设备设置DMZ主机(不推荐,安全性较低)
- 或针对特定端口做静态映射
-
使用Full Cone NAT的路由器
- 某些企业路由或开源固件(OpenWrt、Padavan)支持
- 但家用原厂固件极少支持完全锥型
-
IPv6:终极方案
- IPv6下每台设备都有全球唯一公网地址
- 不再需要NAT,也就没有NAT类型的问题
总结对比表
| NAT类型 | 同内网端口访问不同目标 | 外部可访问性 | P2P穿透难度 |
|---|---|---|---|
| 完全锥型 | 同一公网端口 | 任何外部主机 | 极易 |
| 受限锥型 | 同一公网端口 | 访问过的IP(任意端口) | 易 |
| 端口受限锥型 | 同一公网端口 | 访问过的IP:端口 | 中等 |
| 对称型 | 不同公网端口 | 仅限访问过的IP:端口 | 困难(需中转) |