← 网络基础学习第 26 / 55 章进阶40 分钟

模块三 · 网络层:数据平面

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/810.0.0.0 ~ 10.255.255.255约 1677 万大型企业
172.16.0.0/12172.16.0.0 ~ 172.31.255.255约 104 万中型网络、容器、WSL
192.168.0.0/16192.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,靠不同的端口区分不同设备的不同连接。 一台家用路由器就能带几十台设备上网。

实测:端口池有多大

示例powershell
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 题 · 先自己答,再展开对照

  1. 为什么互联网上的路由器不能把包转发到 192.168.1.100?
    RFC1918地址不具有全球唯一性,不应在公共互联网路由;在企业/家庭私网中路由器可以正常路由这些地址,不能说它们技术上不认识私有地址。
  2. 你知道自己用的是 192.168.31.215,而且能上网。由此能推出什么?
    NAT是常见可能,但还可能通过代理、VPN或另一个协议栈访问公网,不能仅凭这两点断言具体网关一定做了NAT。
  3. 家里两台电脑同时用相同的源端口访问同一个网站。NAT 怎么区分回包该给谁?
    靠转换源端口(这就是 PAT)。 路由器把两台电脑的源端口分别换成不同的新端口(比如 A 换成 40001、B 换成 40002),并把这些对应关系记在自己的转换表里。回包到达时,路由器看目的端口就知道该还给哪台设备。如果不换端口,两个包在外网看起来完全一样,回包就无法区分了。
  4. 为什么外网无法主动连接你家内网的设备?想让它能连需要做什么?
    因为 NAT 的转换表条目是"由内网主动发起连接时创建的"。 外网主动发来的包在表里找不到对应关系,路由器不知道要转给谁,只能丢弃。想让外网能主动连进来,需要配置端口映射(端口转发):明确告诉路由器"公网 IP 的某个端口转给内网的哪台设备哪个端口"。
  5. 有人说"NAT 保护了内网安全"。这个说法哪里不对?
    NAT 的"外网连不进来"是一个副作用,不是设计目标,也不是安全边界。 NAT 的目的是省地址。它不做任何内容检查,也不拦内网主动发起的连接(设备中招后照样能把数据发出去);一旦配了端口映射,外网就能直连。真正的安全来自防火墙规则和加密认证。 反证:IPv6 没有 NAT,但 IPv6 网络并不会因此就不安全。
  6. 视频通话、游戏联机这类 P2P 应用,在两台都在 NAT 后面的设备之间为什么难建立连接?怎么解决?
    映射和过滤策略可能使直接连接困难;STUN用于发现地址,ICE检查候选路径,TURN在需要时中继。是否能打洞取决于两侧NAT和防火墙。
  7. 本机的临时端口池有 16384 个端口,当前只用了 235 条连接。什么情况下这个池子会被耗尽?
    本机动态端口可能因大量连接和关闭残留而紧张,但16384不是路由器PAT容量。须分别查看本机端口分配和NAT映射资源,不能用本机范围推算每个公网目标的NAT连接上限。

参考资料与适用范围

修订核对日期:2026-10-13。规则按所列协议与实现范围理解;文中的原始命令输出是历史观察,不表示本次重新实测。跨版本、代理/隧道及不同捕获位置需要另行核对。

正文源自 m3-03-NAT与PAT.md · 共 12 节 · 7 道自测题