模块三 · 网络层:数据平面
NAT 与 PAT
你家里的手机、电脑、电视、扫地机器人都有自己的 IP 地址,但运营商只给了你一个公网 IP。它们是怎么同时上网的?这就是 NAT。本章还会讲清一个常见的错误认知:NAT 不是安全机制。
本章要解决的问题:你家里的手机、电脑、电视、扫地机器人都有自己的 IP 地址,但运营商只给了你一个公网 IP。它们是怎么同时上网的?这就是 NAT。本章还会讲清一个常见的错误认知:NAT 不是安全机制。
本章的证据来源:历史实测记录(私有地址、临时端口池大小、当前并发连接数)。地址转换原理出自 RFC 3022(NAT/PAT);私有地址段出自 RFC 1918。
先从一个例子理解概念
家里多台电脑都有自己的内部地址,却可能共享一个外部IPv4出口。边界设备怎样把返回的数据交给正确的连接?
内部使用与全球寻址:私有地址、公网地址
私有地址按约定在内部网络使用,不具有全球唯一性;公网地址用于公共互联网的寻址。看到私有地址并不代表网卡不能通信。
把一个地址映成另一个:NAT
NAT(网络地址转换)在两个地址域之间改写地址并维护相关映射。这里不是“重新查一次DNS”,而是改变经过它的包的地址字段。
地址之外还映射端口:PAT
PAT也叫NAPT,会用地址与传输标识等信息维护映射,使多个内部连接可以共用外部地址。端口池容量取决于转换设备,不能用Windows本机动态端口范围代替。
主动让外部访问内部:端口转发
端口转发是显式设置“这个外部端口交给哪个内部端点”。普通自动映射与防火墙允许规则仍要分别看,转换机制不是身份认证。
下面再用这些概念看原理、命令和结果。规范与官方资料列在本章末尾,类比只帮助理解,不代替协议规则。
问题:地址不够,又不能不用
IPv4 只有约 43 亿个地址(上一章讲过),而联网设备远超这个数。不可能给每台设备一个公网 IP。
那么,能不能让一批设备共用几个公网 IP?
可以。办法是:内部随便用一个"只在家里有效"的地址,出网的时候在边界设备上做一次转换。
私有地址:只在内部有效的地址
早在 1996 年(远早于 IPv4 耗尽),RFC 1918 就划定了三段永远不会出现在公网上的地址,专门给内部网络用:
| 地址段 | 范围 | 可用数量 | 常见场景 |
|---|---|---|---|
10.0.0.0/8 | 10.0.0.0 ~ 10.255.255.255 | 约 1677 万 | 大型企业 |
172.16.0.0/12 | 172.16.0.0 ~ 172.31.255.255 | 约 104 万 | 中型网络、容器、WSL |
192.168.0.0/16 | 192.168.0.0 ~ 192.168.255.255 | 约 6.5 万 | 家用网络(最常见) |
"永远不会出现在公网上"的意思是:这些地址不具有全球唯一性,不应在公共互联网路由或传播;路由器在私网内完全可以配置并转发它们,不是硬件根本“不认识”。
实测:本机的地址正是私有地址
IPAddress PrefixLength
192.168.31.215 24一个纯逻辑的推论
本机使用私有IPv4地址且可以浏览公网内容,常见解释是出口做了NAT/NAPT,但不是唯一解释:显式代理、VPN出口或另一协议栈也可能提供访问能力。要确认NAT位置、层数及外部地址,需要检查网关配置、外部观察或相关日志。RFC 3022 §2
NAT 做的是什么
家用路由器(网关)就是那个做转换的设备。它至少需要两个"身份":
- 对内:
192.168.31.1(私有地址,作为所有内网设备的网关) - 对外:运营商分配的一个公网 IP
转换过程:
你的电脑发一个包:
源 IP = 192.168.31.215,目的 IP = 203.0.113.7(某个网站)
路由器把源 IP 换掉:
源 IP = 203.0.113.1(路由器的公网 IP),目的 IP 不变
并把这次的对应关系记在自己的转换表里
回包到达路由器:
目的 IP = 203.0.113.1
路由器查表,知道"这是我替 192.168.31.215 转的"
于是把目的 IP 换回 192.168.31.215,转发给它只换地址还不够 —— 这就是 PAT 要解决的问题。
PAT:用一个公网 IP 承载很多设备
假设家里有两台设备同时访问同一个网站:
设备 A(192.168.31.215:51000)→ 网站(203.0.113.7:443)
设备 B(192.168.31.100:51000)→ 网站(203.0.113.7:443)问题来了:如果路由器只换 IP、不换端口,两个包出去之后完全一样:
源 IP = 203.0.113.1,源端口 = 51000,目的 = 203.0.113.7:443
源 IP = 203.0.113.1,源端口 = 51000,目的 = 203.0.113.7:443 ← 分不清是 A 还是 B网站回包时,路由器无法判断该转发给 A 还是 B。
解决办法:连端口一起换。 这叫 PAT(Port Address Translation,端口地址转换),也叫 NAPT:
内网 转换表 外网
A: 192.168.31.215:51000 → (192.168.31.215:51000 ↔ 203.0.113.1:40001) → 203.0.113.1:40001
B: 192.168.31.100:51000 → (192.168.31.100:51000 ↔ 203.0.113.1:40002) → 203.0.113.1:40002同一个公网 IP,靠不同的端口区分不同设备的不同连接。 一台家用路由器就能带几十台设备上网。
实测:端口池有多大
netsh int ipv4 show dynamicport tcp原教程查询到Windows本机TCP动态端口为49152–65535,共16384个。这是客户端本机端口分配范围,不是家用路由器的PAT外部端口池。
NAT映射、是否保留端口、能否跨目的地复用外部端口以及总容量都取决于实现和配置。一台主机连接数与不同源端口数也不必一一对应;还需考虑地址、TIME_WAIT与资源限制。不能据此宣布“每个公网目标最多16384条PAT连接”。Microsoft 动态端口范围、RFC 5382 §4.1
NAT 的代价
NAT 解决了地址不够的问题,但也付出了代价。这些代价在排错和开发时经常遇到。
代价一:外网无法主动连进来
NAT 的转换表是由内网发起连接时创建的。如果外网想主动连你的内网设备,路由器表里根本没有对应条目 —— 包会被直接丢弃。
要解决就必须手工配置"端口映射"(也叫端口转发):告诉路由器"外网访问我的公网 IP 的 8080 端口时,转给内网的 192.168.31.215:80"。
代价二:P2P 变困难
两台都在 NAT 后面的设备想直接通信(比如视频通话、游戏联机、BT 下载),双方都无法主动连对方。
解决办法是"打洞":借助一台公网服务器交换彼此的公网地址和端口,然后双方同时向对方发包,让各自的 NAT 表里都建立条目。STUN帮助发现映射地址,ICE组织候选路径检查,TURN提供中继;打洞不一定成功,不能把TURN解释成打洞本身。
代价三:IP 溯源变困难
一个公网 IP 后面可能有几百台设备。知道了公网 IP 也定位不到具体设备,还要查运营商的 NAT 日志和端口分配记录。
代价四:某些协议需要额外处理
有些老协议的报文里内嵌了 IP 地址(比如 FTP 的主动模式、SIP),NAT 只改包头不改数据,就会出错。所以路由器需要 ALG(应用层网关)来做深度处理。这也是为什么 FTP 在 NAT 环境下容易出问题。
实测:本机其实有两层"地址转换"
这是本机环境里一个很有意思的现象。
第一层:家用路由器(真正的 NAT)
192.168.31.215 ←→ 运营商分配的公网 IP第二层:FlClash 代理(用户态的地址转换)
回顾《应用层》模块要讲的 fake-IP 机制:代理给 example.com 返回一个假地址 198.18.0.205,当程序连这个假地址时,代理根据地址反查出真实域名,再去真正连接。
程序以为在连 198.18.0.205
→ 代理收到这个连接
→ 反查出"哦,这是 example.com"
→ 由代理去真正连接 example.com这本质上是同一种思想:用一个"虚假的、只在本地有意义的地址"代替真实目标,在中间做一次映射和还原。
NAT 不是安全机制
这是一个流传极广的说法:
这个推理是错的。
NAT 之所以"外网连不进来",是因为转换表里没有条目 —— 这是一个副作用,不是设计目标。而且:
- 内网设备如果中招了(比如点开恶意链接),它主动发起的连接完全可以出去,NAT 不拦
- 一旦配置了端口映射,外网就能直接访问那个端口
- NAT 不做任何内容检查,不区分正常流量和攻击流量
真正的安全来自防火墙规则和加密认证。 对比一下就很清楚:IPv6通常不需要用NAT节省地址,但也存在IPv6转换部署(上一章讲过),难道 IPv6 网络就不安全了吗?当然不是 —— IPv6 环境同样可以用防火墙做完全一样的访问控制。
常见误解
误解一:"我家只有一个公网 IP,所以只能一台设备上网"
PAT 让一个公网 IP 承载很多设备,靠不同的源端口区分。事实上你家里所有设备都在共享那一个 IP。
误解二:"192.168.1.1 是我家的公网 IP"
不是。 192.168.x.x 是 RFC 1918 私有地址,只在局域网内有意义。你家真正的公网 IP 是路由器从运营商那里拿到的那个地址,通常可以在路由器的管理页面或查询外部服务看到。
误解三:"NAT 保护了内网安全"
见上一节。NAT 的"外网进不来"是副作用,不是安全边界。
误解四:"有 NAT 就不需要 IPv6 了"
NAT 是救急方案,它带来的代价(无法端到端、P2P 困难、溯源困难)一直存在。IPv6 的设计目标之一就是取消 NAT、恢复端到端通信。所以 NAT 不是"IPv4 的完美补丁",而是一个有明确代价的权宜之计。
本章小结
| 结论 | 类型 |
|---|---|
| RFC 1918 划定三段私有地址,不在公网路由 | 标准 |
实测:本机地址 192.168.31.215 属于 192.168.0.0/16 私有段 | 实测 |
| 私有IPv4访问公网常涉及NAT,也可能经代理/VPN/其他协议栈;需进一步确认 | 推测 |
| PAT 通过转换源端口让一个公网 IP 承载多台设备 | 标准 |
| 实测:Windows 临时端口池为 49152~65535,共 16384 个 | 实测 |
| 历史有235条TCP连接,不据此推算NAT端口池占用比例 | 历史观察 |
| 本机动态端口与NAT外部映射池不同,容量和复用行为需核查实现 | 实现边界 |
| NAT 的代价:无法被主动连接、P2P 困难、溯源困难、部分协议需 ALG | 标准 |
| 历史fake-IP观察与地址映射相容,NAT的具体位置/层数未独立核实 | 观察与限制 |
| NAT 不是安全机制,其"外网进不来"只是副作用 | 标准 |
| 本机出口 IP 未能实测(四个外部服务均取不到结果) | 实测限制 |
自测题
7 题 · 先自己答,再展开对照
为什么互联网上的路由器不能把包转发到
192.168.1.100?RFC1918地址不具有全球唯一性,不应在公共互联网路由;在企业/家庭私网中路由器可以正常路由这些地址,不能说它们技术上不认识私有地址。你知道自己用的是
192.168.31.215,而且能上网。由此能推出什么?NAT是常见可能,但还可能通过代理、VPN或另一个协议栈访问公网,不能仅凭这两点断言具体网关一定做了NAT。家里两台电脑同时用相同的源端口访问同一个网站。NAT 怎么区分回包该给谁?
靠转换源端口(这就是 PAT)。 路由器把两台电脑的源端口分别换成不同的新端口(比如 A 换成 40001、B 换成 40002),并把这些对应关系记在自己的转换表里。回包到达时,路由器看目的端口就知道该还给哪台设备。如果不换端口,两个包在外网看起来完全一样,回包就无法区分了。为什么外网无法主动连接你家内网的设备?想让它能连需要做什么?
因为 NAT 的转换表条目是"由内网主动发起连接时创建的"。 外网主动发来的包在表里找不到对应关系,路由器不知道要转给谁,只能丢弃。想让外网能主动连进来,需要配置端口映射(端口转发):明确告诉路由器"公网 IP 的某个端口转给内网的哪台设备哪个端口"。有人说"NAT 保护了内网安全"。这个说法哪里不对?
NAT 的"外网连不进来"是一个副作用,不是设计目标,也不是安全边界。 NAT 的目的是省地址。它不做任何内容检查,也不拦内网主动发起的连接(设备中招后照样能把数据发出去);一旦配了端口映射,外网就能直连。真正的安全来自防火墙规则和加密认证。 反证:IPv6 没有 NAT,但 IPv6 网络并不会因此就不安全。视频通话、游戏联机这类 P2P 应用,在两台都在 NAT 后面的设备之间为什么难建立连接?怎么解决?
映射和过滤策略可能使直接连接困难;STUN用于发现地址,ICE检查候选路径,TURN在需要时中继。是否能打洞取决于两侧NAT和防火墙。本机的临时端口池有 16384 个端口,当前只用了 235 条连接。什么情况下这个池子会被耗尽?
本机动态端口可能因大量连接和关闭残留而紧张,但16384不是路由器PAT容量。须分别查看本机端口分配和NAT映射资源,不能用本机范围推算每个公网目标的NAT连接上限。
参考资料与适用范围
修订核对日期:2026-10-13。规则按所列协议与实现范围理解;文中的原始命令输出是历史观察,不表示本次重新实测。跨版本、代理/隧道及不同捕获位置需要另行核对。