注:本文基于模型知识整理,建议结合权威教材与 RFC 原文核对细节。
一句话定义
NAT(Network Address Translation,网络地址转换)通过在网关改写 IP 与端口,让多台内网设备共享少量公网地址,为 IPv4 续命;IPv6 则以 128 位地址从根上消灭地址短缺——两者是应对地址耗尽的补丁答案与制度答案。
为什么重要
今天几乎每台家庭路由器都在做 NAT,每个新建数据中心都在规划 IPv6。理解 NAT 才能解释「为什么外部无法主动访问我的电脑」「P2P 为什么要打洞」「FTP 在路由器后面为什么不工作」;理解 IPv6 的缩写规则、地址类型与过渡技术,是参与任何现代网络改造的前置条件。这也是观察「补丁式方案如何延缓根本性变革」的绝佳案例。
前置知识
建议先读 kp-012《IP 数据报格式、分片与转发》,理解 IP 首部可被路由器改写、端口号属于传输层的分工;建议回顾 kp-010 中私有地址三段与 NAT 的关系。
核心概念
- 枯竭背景:IPv4 只有 32 位、约 43 亿个地址,而全球人口数十亿、人均设备数以台计,加之早期分配向少数机构倾斜,各区域注册机构自 2011 年前后相继耗尽可用地址池。
- NAT/NAPT 原理(RFC 3022):最常用的是 NAPT(网络地址端口转换)。出向时网关把「内网 IP:端口」改写为「公网 IP:新端口」并在映射表中登记;入向回包按表反查,把目的地址改回内网 IP:原端口。改写 IP 后还需重算 IP 首部与 TCP/UDP 的校验和。
- 收益:一两个公网地址即可支撑整个内网并发上网,同时对外隐藏内网拓扑。
- 代价:破坏端到端原则(end-to-end principle)——外部主机无法主动发起连接,对外服务需端口映射或中继;P2P 双方都在 NAT 后时直连困难;破坏 IP 语义——把地址写进应用数据的协议(如 FTP 主动模式)需要 ALG(应用层网关)改写应用层内容才能工作,且流量加密后 ALG 失效。穿透技术以 STUN(探测自己的公网映射)、TURN(中继兜底)、UDP 打洞(两侧几乎同时互发包在 NAT 上开洞)为代表。
- IPv6 地址书写:128 位,冒号十六进制表示;每组前导零可省略,连续的全零组可用双冒号 :: 代替,但整个地址 :: 只能出现一次,否则无法还原省略了几组。例:2001:0db8:0000:0000:0000:ff00:0042:8329 缩写为 2001:db8::ff00:42:8329。
- 地址类型:全球单播地址目前主要从 2000::/3 分配,全球可路由;链路本地地址 fe80::/10 仅限本链路(对应 IPv4 的 169.254 段的用途);多播地址用于一对多投递;任播(anycast)把同一地址配置到多个节点,路由自动把流量送往「最近」的一个,根 DNS 与大型 CDN 广泛使用。
- SLAAC 直觉:无状态地址自动配置(Stateless Address Auto Configuration)由路由器通告网段前缀,主机自行用「前缀 + 64 位接口标识(由 MAC 派生或随机生成)」拼出完整地址,无需服务器逐台分配;DHCPv6 仍可用于受管场景。
- 过渡技术:双栈让设备同时运行 v4 与 v6;隧道把 v6 报文整体封装进 v4 报文穿越存量网络;NAT64/DNS64 让仅有 v6 的客户端访问仅有 v4 的服务——DNS64 合成 AAAA 记录,NAT64 做地址与协议转换。
图示
NAPT 出向与入向改写(网关公网地址 203.0.113.5)
内网主机 192.168.1.10 NAT 网关 外部服务器 8.8.8.8
| | |
|-- 源 192.168.1.10:51324 ->| |
| | 登记映射并改写 |
| |-- 源 203.0.113.5:40001 --->|
| | |
|<-- 目的 192.168.1.10:51324 |<-- 目的 203.0.113.5:40001 -|
| 源 8.8.8.8:53 | 查表反改写 | 源 8.8.8.8:53
映射表(节选)
内网侧 公网侧 对端
192.168.1.10:51324 <-> 203.0.113.5:40001 <-> 8.8.8.8:53
192.168.1.20:51388 <-> 203.0.113.5:40002 <-> 198.51.100.7:443原理与机制
NAT 之所以可行,是因为传输层端口号提供了地址之外的第二个区分维度:纯地址转换只能让多台设备粗粒度轮换一个地址,加上端口映射后,一张动态表就能并发区分内网上万条会话。它的每一次成功都以破坏一层协议假设为代价:路由器开始改写传输层字段,IP 的「端到端透明管道」语义不复存在,于是衍生出端口映射、DMZ、UPnP、STUN、TURN 这一整族补丁。IPv6 则回到制度层面:128 位空间按全球单播、链路本地、多播重新规划,分配层级清晰,接口可同时持有多个地址,SLAAC 让设备即插即用。部署缓慢的原因是结构性矛盾:存量硬件、软件与运维习惯构成巨大惯性;NAT 已把「地址不够用」弱化为「端口够不够用」,紧迫感消失;升级 IPv6 的收益由全网共享,成本却集中在每个先升级的运营者身上,个体理性导致集体拖延,迁移因此以双栈长期并存的方式缓慢推进。
实例分析
家庭网络的一次完整上网:手机通过 DHCP 拿到 192.168.1.108,访问网站时发出源地址 192.168.1.108:52311 的报文;路由器把它改写为源运营商公网地址:40017 并记表;回包按表还原送达手机。同一条宽带下,电脑、电视、平板各占不同的公网端口区间,共享同一个公网地址。反过来,朋友想直连你电脑上的联机游戏:入向报文目的地址是公网地址,映射表中没有主动发起的对应条目,NAT 无从反查而丢弃——这正是「外网连不进来」的机理;解决办法是在路由器上做端口映射,或走 STUN/TURN 穿透。在已开通 IPv6 的网络里做同样的事:手机拿到 2000::/3 范围内的全球单播地址,防火墙策略允许时可直接被外部访问,不再需要端口映射。
常见误区
- 把 NAT 当成安全防火墙:隐藏内网拓扑有伪装作用,但没有过滤与审计能力,安全能力应交给防火墙。
- 以为 IPv6 的零省略可以随意叠加:是「::」全地址只能出现一次,各组前导零仍可各自省略。
- 以为 IPv6 没有内网概念:有唯一本地地址 fc00::/7 等机制,只是使用理念与 IPv4 私网不同。
- 以为双栈系统一定优先 IPv6:实际选路优先级取决于系统配置,并非天然 v6 优先。
自测题
- 将 2001:0DB8:0000:0000:00A0:0000:0000:0001 写成最简形式。
答案要点:省略各组前导零并用一次 :::2001:db8::a0:0:1;:: 替换中间连续的两组零,全地址只能出现一次。
- 为什么主流实现是 NAPT 而不是只转换地址的纯 NAT?
答案要点:加入端口维度后,一张映射表可并发区分海量会话,地址复用从「多台设备轮换一个地址」提升到数量级更高的水平。
- FTP 主动模式经过 NAT 会出什么问题?
答案要点:控制连接的应用数据里内嵌了内网 IP 与端口,服务器按其回连会失败;需要 ALG 改写应用层内容,且加密流量无法改写。
- SLAAC 生成的地址由哪两部分构成?
答案要点:路由器通告的网段前缀,加上主机自生成的 64 位接口标识(可由 MAC 派生或随机化),拼接成 128 位地址。
- 为什么说 NAT 拖慢了 IPv6 的普及?
答案要点:NAT 让「一个公网地址带整个内网」变得够用,地址枯竭的紧迫性被推迟,全网升级的投入意愿随之下降。
延伸阅读
- RFC 3022《Traditional IP Network Address Translator (Traditional NAT)》
- RFC 8200《Internet Protocol, Version 6 (IPv6) Specification》
- RFC 4862《IPv6 Stateless Address Autoconfiguration》
- 谢希仁《计算机网络》