IPv4 地址不够分,NAT 让一整个内网共享少量公网地址对外通信:出向改写源地址和端口(SNAT/NAPT),回程再按转换表改回来。它缓解了地址枯竭,也天然打破了端到端直连,催生出打洞、ALG 等一系列补偿手段。

私有地址存在的意义:IPv4 枯竭

IPv4 只有约 43 亿个地址,远不够全球设备人手一个。于是标准划出三段私有地址——10.0.0.0/8、172.16.0.0/12、192.168.0.0/16——任何人都可以在内网自由使用,公网路由器见到这些地址直接丢弃。私有地址在不同内网之间可以重复,这正是省地址的关键:全世界的家庭网络都在用 192.168.1.x,互不冲突。

但私有地址出不了门。内网主机要访问公网,必须有人在边界把私有地址换成公网地址,这个角色通常由路由器承担,干的就是 NAT(Network Address Translation)。

SNAT/DNAT 与端口映射(NAPT)

按改写方向分两类:

  • SNAT(源地址转换):内网主动出访时,把报文的源 IP(和端口)改成公网地址,是最常见的形态。
  • DNAT(目的地址转换):把发向公网地址某端口的报文改写到内网指定主机,用于对外发布服务,即常说的端口映射、端口转发。

现实中几乎都是 NAPT(Network Address Port Translation,也叫 PAT):多台内网主机共享同一个公网 IP,靠端口号区分彼此。一次完整的出访与回程如下:

内网 10.0.0.1:3345 ---> Web 服务器 128.119.40.186:80
|
v 路由器(NAPT, 公网口 138.76.29.7)
改写源: 10.0.0.1:3345 => 138.76.29.7:5001
转换表: 138.76.29.7:5001 <-> 10.0.0.1:3345
|
回程: 服务器应答到 138.76.29.7:5001
查表改回目的 10.0.0.1:3345, 送达内网主机

对服务器而言,它只看到路由器在通信,感知不到背后是内网哪台主机——这就是”NAT 隐藏内网拓扑”的由来。还要纠正一个常见误读:端口 16 位限制的是同一公网 IP 上可同时维持的映射数量(约 6 万),而不是 NAT 后面能挂多少台主机;运营商级 NAT(CGN)正是靠这个机制让成百上千用户共享公网地址。

NAT 对端到端连接的破坏

NAT 表只有”内网先开口”才会建立映射。公网主动发起的连接到达路由器时查不到表项,只能丢弃——互联网最初”任何主机都能互连”的端到端模型就此断裂。围绕这个缺口产生了一批补偿技术:

  • 打洞(Hole Punching):P2P 场景下,两端各自先向公网会合服务器发包建立映射并交换对方的公网 IP:Port,再同时向对方发包,在各自 NAT 上凿出映射。STUN/TURN/ICE 是这套机制的标准实现,TURN 是打洞失败时的中继兜底。
  • ALG(应用层网关):FTP、SIP 这类协议把 IP 和端口写在报文载荷里,NAT 只改头部没用,ALG 深入载荷做翻译。它常带来新问题(改错内容、与加密冲突),现代做法更倾向于用被动模式等协议层方案绕开。
  • 手工端口映射与 UPnP:在路由器上配置静态 DNAT,或让内网程序自动申请映射,解决 NAS、BT 做种等入站需求。
  • IPv6:终极解法——地址管够,理论上不再需要 NAT。

NAT 与代理的区别

两者都在中间转发流量,但层次和语义完全不同:

维度 NAT 代理(HTTP 代理/SOCKS)
工作层次 网络层,改写 IP/端口 应用层或会话层,代为发起请求
客户端感知 无感知,照常发包 需显式配置,客户端知道代理存在
报文目的地址 仍是真实服务器 代理自己向服务器建连
附加能力 仅地址转换 可缓存、鉴权、过滤、审计

一句话:NAT 改的是”地址”,代理是替”你”说话。

实践要点

  • NAT 不是防火墙。默认丢弃无映射入站包只是过滤策略的副产品,安全仍要靠状态防火墙与主机防护。
  • 排查时对比改写前后的五元组,在 NAT 两侧各抓一次包才能看清转换过程。
  • 长连接要留意 NAT 映射的空闲超时(TCP 常见几十分钟),应用层心跳间隔必须小于它,否则连接会被静默断开。

小结

  • 私有地址加 NAT/NAPT 用地址与端口复用缓解 IPv4 枯竭,顺带隐藏内网拓扑。
  • 出向 SNAT、入向 DNAT,转换表决定回程报文的去向。
  • NAT 打破端到端模型,打洞、ALG、端口映射是补偿,IPv6 是根治。
  • NAT 与代理层次不同:前者改地址、对客户端透明;后者代为通信、可叠加业务能力。