公众号旧文
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 很难
- 增加网络复杂度