NAT 原理 · 完全图解

一个公网 IP 怎么撑起全家上网?端口复用的魔法与 P2P 的噩梦

私有地址 NAPT / PAT 端口复用 NAT 映射表 打洞 / STUN / TURN

①为什么需要 NAT:IPv4 地址不够用了

IPv4 只有约 43 亿个地址,而联网设备远超这个数。解决办法是:内网使用私有地址(可重复复用),只在出口处用少量公网地址代表整张内网。负责做这个“地址翻译”的就是 NAT(Network Address Translation)。
私有地址段(RFC 1918)范围常见用途
10.0.0.0/810.0.0.0 ~ 10.255.255.255大型企业、云上 VPC
172.16.0.0/12172.16.0.0 ~ 172.31.255.255中型网络、Docker 默认网段
192.168.0.0/16192.168.0.0 ~ 192.168.255.255家用路由器最常见
关键点:私有地址不能在公网被路由,任何运营商路由器都会丢弃目的地址为私有地址的流量。你家、我家、公司都可以同时用 192.168.1.10,互不冲突——因为它们从不直接进入公网。

②三种 NAT 类型

类型做法地址利用率评价
静态 NAT一个私网 IP 固定映射一个公网 IP(1:1)低适合内网服务器对外提供服务
动态 NAT从公网地址池里临时分配一个(1:1,但不固定)中池子用完就得等,很少单独用
NAPT / PAT多个私网 IP 共用一个公网 IP,靠端口号区分(1:N)高家用路由器、公司出口的现实方案
现在说“NAT”,默认指的就是 NAPT(Network Address Port Translation),也叫 PAT。它才是真正解决地址枯竭的那个——因为一个公网 IP 的 65535 个端口可以同时支撑成千上万条内网连接。

③NAPT 怎么做到“一个 IP 撑起全家”

秘密在于:NAT 设备维护一张映射表(NAT 表),把「内网 IP:端口」翻译成「公网 IP:端口」,并记录四元组以便回来时能找对路。

NAPT:靠端口号区分不同内网主机的连接 手机 192.168.1.10:5001 电脑 192.168.1.20:5002 电视 192.168.1.30:5003 NAT 路由器 公网 IP:203.0.113.5 192.168.1.10:5001 → :8001 192.168.1.20:5002 → :8002 192.168.1.30:5003 → :8003 (NAT 映射表) 互联网 服务器 8.8.8.8:80 对外看到的源地址全是 203.0.113.5,只是端口不同 一个公网 IP + 65535 个端口 → 可并发支撑数万条连接

NAT 表长什么样

内网侧(私有)公网侧(转换后)目标
192.168.1.10:5001203.0.113.5:80018.8.8.8:80
192.168.1.20:5002203.0.113.5:80028.8.8.8:80
192.168.1.30:5003203.0.113.5:80031.1.1.1:443
表项何时创建与删除?
• 出站(内网 → 公网):第一个包到达 NAT 时自动创建表项。
• 删除:连接结束(TCP FIN/RST)或空闲超时后回收。所以长时间无流量的 UDP 连接表项可能过期——这也是“长连接要心跳保活”的原因之一。

④一次完整访问:出去与回来

出站过程(内网主机访问外网):

  1. 内网主机发出包:源 192.168.1.10:5001 → 目的 8.8.8.8:80。
  2. 包到达 NAT 路由器,路由器查/建映射表,把源改成 203.0.113.5:8001,并重新计算校验和(因为 IP/端口变了)。
  3. 包发往公网,服务器只看到公网地址,内网结构对外完全不可见。

入站过程(响应回来):

  1. 服务器回包:源 8.8.8.8:80 → 目的 203.0.113.5:8001。
  2. NAT 路由器反查映射表,把目的改回 192.168.1.10:5001。
  3. 转发到内网主机,通信完成。
关键限制:NAT 表必须由内网主动发包才能建立。所以外网无法主动发起连接到内网主机——因为它发来的包在 NAT 表里查不到对应项,会被直接丢弃。这正是 P2P、内网穿透要解决的核心难题。

⑤NAT 的功与过

优点:缓解地址枯竭

成千上万设备共用一个公网 IP,这是 IPv4 能撑到今天的头号功臣。

优点:天然安全隔离

内网拓扑对外不可见,外部无法主动发起连接,相当于一道隐式防火墙。

优点:换运营商不用改内网

内网地址与公网解耦,只需改出口配置。

缺点:破坏端到端原则

互联网原本设计是“任意两台主机可直接通信”,NAT 让地址不再全局唯一。

缺点:外部无法主动访问

内网搭服务(NAS、摄像头、开发机)需要端口映射或内网穿透。

缺点:增加复杂性与开销

要维护状态表、重写校验和;设备重启/表项满会断连;部分协议(如 FTP 的 PORT 命令)内嵌 IP 地址,需要 ALG 特殊处理。

与 IPv6 的关系:IPv6 地址空间近乎无限,设计上是NAT 的终极解决方案——每台设备都有全球唯一地址,不再需要翻译。但现实推进缓慢,NAT 仍是当前主力,且 IPv6 环境下出于安全仍会用防火墙做等效隔离。

⑥NAT 穿透:让两台内网机器直接连上

两台都在 NAT 后面的主机,谁都无法直接发起连接(对方的 NAT 上没有表项)。NAT 穿透(NAT Traversal)就是要绕开这个限制,典型应用在视频通话、P2P 下载、联机游戏。

方案一:UDP 打洞(Hole Punching)

思路:双方先各自主动往外发一个包(哪怕被丢弃),各自在自己的 NAT 上打出一个“洞”(建立表项);然后借助一个公网的中介服务器交换彼此的公网 IP:端口,再往对方的“洞”里发包,就能通了。

UDP 打洞:先各自出洞,再借中介交换地址后直连 主机 A(内网) 主机 B(内网) NAT A 已打洞 NAT B 已打洞 中介服务器(公网) ① 各自注册,中介记录双方公网地址 ② 交换地址后 A、B 直接互发(洞已打通) ③ 后续数据 P2P 直传,不再经过中介

标准方案:STUN / TURN / ICE

组件作用
STUN让主机查询自己被 NAT 转换后的公网 IP:端口。轻量,用于打洞前的信息获取。
TURN打洞失败时的兜底:由公网服务器中转所有流量。可靠但成本高、延时长。
ICE综合框架:同时尝试直连、STUN 打洞、TURN 中继,选出最优可用路径。WebRTC 用的就是它。
为什么打洞不是 100% 成功?NAT 有多种行为类型(完全圆锥型 / 受限圆锥型 / 端口受限圆锥型 / 对称型)。其中对称型 NAT 为每个不同目标都分配不同端口,导致中介看到的地址与直连时实际地址不一致,基本无法打洞,只能走 TURN 中继。

其他常见“内网穿透”方式

端口映射(Port Forwarding)

在路由器上手动配置“公网某端口 → 内网某 IP:端口”。最简单直接,但需要有路由器管理权限和公网 IP。

反向代理隧道

内网机器主动与公网服务器建立长连接,外部访问公网服务器再转发进来。典型工具:frp、ngrok、花生壳。

UPnP / NAT-PMP

让应用程序自动请求路由器添加端口映射,无需手动配置。便利但有安全风险,常被建议关闭。

⑦面试高频追问

Q1:NAT 是什么?解决什么问题?
网络地址转换,在数据包经过路由器时改写 IP(及端口)。核心解决 IPv4 地址枯竭:让大量内网设备通过私有地址复用少量公网地址上网。
Q2:NAPT 和普通 NAT 的区别?
普通 NAT 是 IP 对 IP 的 1:1 转换;NAPT(PAT)同时转换 IP 和端口,实现多对一——多个内网设备共用一个公网 IP,靠端口号区分连接。现实中家用路由器用的就是 NAPT。
Q3:NAT 表是怎么建立和删除的?
内网主动向外发包时自动创建;连接结束(TCP FIN/RST)或空闲超时后删除。这也意味着长连接需要心跳保活,否则表项过期会被静默丢弃。
Q4:为什么外网不能主动访问内网主机?
因为 NAT 表必须由内网主动发包才能建立。外部发来的包在 NAT 表中查不到映射项,会被直接丢弃。想要暴露内网服务需要端口映射或内网穿透。
Q5:NAT 有什么缺点?
① 破坏端到端通信原则;② 外部无法主动访问内网;③ NAT 设备要维护状态、重写校验和,有性能与单点风险;④ 部分协议(如 FTP)在应用层载荷里内嵌 IP,需要 ALG 特殊处理。
Q6:什么是 NAT 穿透?有哪些方案?
让两台位于不同 NAT 后的主机建立直接连接。方案:UDP 打洞(双方先各打出洞,再借中介交换地址直连)、STUN(查自己的公网地址)、TURN(打洞失败时服务器中转)、ICE(综合选路,WebRTC 使用)。
Q7:什么情况下打洞会失败?
对称型 NAT 场景。它会为每个不同目标分配不同的公网端口,导致中介服务器看到的地址与实际直连地址不一致,无法打通。此时只能依赖 TURN 中继。
Q8:NAT 和代理(Proxy)有什么区别?
NAT 工作在网络层/传输层,对应用透明(主机无感知),主要目的是地址复用;代理工作在应用层(如 HTTP 代理),需要应用主动配置,主要目的是缓存、访问控制、隐匿与加速。
Q9:IPv6 还需要 NAT 吗?
设计上不需要——IPv6 地址充足,每台设备都有全球唯一地址,端到端通信恢复。但出于安全与管理考虑,实际部署仍会用防火墙做等效隔离(只放行需要的流量)。

✓一句话速记

NAT 用私有地址 + 端口复用(NAPT)解决 IPv4 枯竭;映射表由内网主动发包建立,所以外网无法主动进来;代价是破坏端到端、P2P 要靠打洞/STUN/TURN/ICE;对称型 NAT 打不通,只能中继。