公众号旧文

NAT 是怎么让一堆设备共享一个公网 IP 的?

作者:胖子阅读 —

你家里有手机、电脑、平板、电视、各种智能设备,但这些设备同时上网,对外却只显示一个公网 IP。

这背后,靠的就是NAT(网络地址转换)。

一、NAT 的核心思路

NAT 并不是在简单的转发数据,而是在修改数据包的源地址和端口,并记录映射关系。

整个过程可以拆成四步来看。

1️⃣ 内网设备发起请求

假设你的电脑 IP 是:

192.168.1.10

你访问一个网站,发出的数据包大概是这样:

源地址:192.168.1.10:50000
目标地址:142.250.xxx.xxx:443

这里的 50000 是系统随机分配的端口,用来标识这一次连接。

2️⃣ 路由器进行 NAT 转换

当数据包到达路由器时,路由器把源地址改成自己的公网 IP。

比如公网 IP 是:

8.8.8.8

那么数据包会被改写为:

源地址:8.8.8.8:60001
目标地址:142.250.xxx.xxx:443

注意这里不仅改了 IP,还改了端口。

同时,路由器会在内部维护一张表:

内网地址 内网端口 公网端口
192.168.1.10 50000 60001

这张表通常叫 NAT 映射表 / 会话表(Session Table)

3️⃣ 服务器返回数据

服务器收到请求后,会把响应发回:

目标地址:8.8.8.8:60001

4️⃣ 路由器反向转换

路由器收到返回包后,会查 NAT 表:

60001 → 192.168.1.10:50000

然后把数据改回去:

目标地址:192.168.1.10:50000

最终送回你的电脑。

二、端口才是 IP 分身术的核心

真正让 NAT 成立的关键是端口(Port)

原因很简单:

  • 一个家庭公网 IP 只有一个
  • 但端口有 0 ~ 65535

这意味着路由器可以这样分配:

内网设备 内网端口 公网端口
192.168.1.10 50000 60001
192.168.1.11 50001 60002
192.168.1.12 50002 60003

所有设备在同一个 IP 上,用端口区分,

这种技术叫 PAT(Port Address Translation)

是我们日常用得最多的一种 NAT。

三、NAT 表才是真正的大脑

NAT 的核心不是改地址,而是记住每一条连接是谁发起的。

这张 NAT 表通常包含:

  • 源 IP(内网)
  • 源端口(内网)
  • 映射端口(公网)
  • 目标 IP(外网)
  • 协议(TCP / UDP)
  • 超时时间

比如一条完整记录可能是:

192.168.1.10:50000 → 8.8.8.8:60001 → 142.250.xxx.xxx:443 (TCP)

并且它不是永久存在的,一段时间没流量,就会被删除。

四、为什么外网访问不了你?

因为 NAT 只记录主动发起的连接,

如果外部直接访问:

8.8.8.8:12345

路由器会查 NAT 表,没有记录 → 不知道转给谁 → 丢弃。

这带来了一个副作用:NAT 自带了一点儿防火墙的效果。

五、那怎么让外网访问你?

如果你要在家里搭服务,比如:

  • Web 服务器
  • 游戏服务器
  • NAS

就必须解决这个问题。

方法就是 端口映射(Port Forwarding)

比如你可以设置:

8.8.8.8:80 → 192.168.1.10:80

这样外部访问你的公网 IP 时,路由器就会强制转发到指定内网设备。

这相当于提前写好一条规则,不再依赖 NAT 表。

六、NAT 的局限

虽然 NAT 很强,但它本质是补丁,也带来了新的问题:

  • 破坏端到端通信
  • P2P 很难
  • 增加网络复杂度