NAT(网络地址转换)详解

一、定义(Definition)

NAT(Network Address Translation,网络地址转换)
是一种在 网络层(L3)或传输层(L4) 对数据包的 源 IP、目的 IP、端口号 进行改写的技术,用于实现不同地址域之间的互通。

其核心是维护一张 转换表(Translation Table / Conntrack Table),记录每个会话的映射关系,将“内外”两个五元组(协议、源 IP、源端口、目的 IP、目的端口)对应起来。

  • 典型应用场景:一个内网(如 192.168.0.0/16)的多台主机通过一个公网 IP 访问互联网。
  • 本质:通过端口复用让多个私有地址共用一个公网地址,从而节省 IPv4 资源并隐藏内部网络结构。

二、为什么需要 NAT(Why NAT Is Needed)

  1. IPv4 地址枯竭:IPv4 的 32 位地址空间有限,难以覆盖全球所有设备。
  2. 多主机共享上网出口:家庭或企业局域网共用一个公网 IP 出口。
  3. 安全与隐藏:外部无法直接访问内网主机,提高安全性。
  4. 地址迁移缓冲:网络重构或更换地址时可减少配置修改量。
  5. 运营商级 NAT(CGNAT):ISP 使用 NAT444 架构延缓 IPv4 枯竭。

⚠️ 尽管 NAT 实用,但它破坏了“端到端通信原则(End-to-End Principle)”,导致某些协议兼容性受损。


三、NAT 的主要类型(Types of NAT)

类型

说明

SNAT(Source NAT)

改写源地址/端口,用于内网主机访问外部网络。

DNAT(Destination NAT)

改写目的地址/端口,用于外部访问内网服务。

NAPT / PAT(端口地址转换)

基于端口复用实现多对一映射(家庭和企业常见)。

静态 NAT(Static NAT)

一对一固定映射,常用于对外服务。

ALG(应用层网关)

针对 FTP、SIP 等协议进行应用层地址改写。

NAT64 / NAT46

实现 IPv6 与 IPv4 网络互通。

Hairpin NAT(环回 NAT)

内部主机访问本地“公网映射”地址时的折返转换。

CGNAT / NAT444

运营商级多层 NAT,终端 → 家庭路由 → ISP NAT → 公网。

按外部行为划分,NAT 可分为 Full ConeRestricted ConePort-Restricted ConeSymmetric 四种类型,其中 Symmetric NAT(对称 NAT) 最难穿透,对 P2P 通信影响最大。


四、NAT 的工作机制(How NAT Works)

1. 建立映射表(第一次出站)

主机发送数据包:

10.0.0.5:52314 → 93.184.216.34:443 (TCP)

NAT 设备创建映射关系:

203.0.113.10:40001 → 93.184.216.34:443

2. 报文改写与返回

  • 出站时:改写源 IP 和端口 → 重新计算校验和。
  • 入站时:根据 NAT 表查找并还原为原始内网地址。

3. 会话老化(Connection Timeout)

  • 每个连接有独立超时:
  • TCP(ESTABLISHED)可维持分钟级甚至更长;
  • UDP 较短,通常几十秒。

4. 端口池管理

  • 每个公网 IP 仅有约 65,535 个端口可用。
  • 高并发时可能出现端口耗尽(Port Exhaustion)。

5. 校验和重算

  • NAT 改写了 IP/TCP/UDP 头部,需要重新计算校验和。
  • 一般由网卡或硬件 NAT 模块加速完成。

五、Linux 下的 NAT 配置示例(Examples)

使用 iptables

# 1. 启用 IP 转发
sysctl -w net.ipv4.ip_forward=1

# 2. 配置 SNAT 或 MASQUERADE(出站 NAT)
# 动态公网 IP 使用 MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 固定公网 IP 使用 SNAT
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.10

# 3. DNAT(端口映射:外部访问内网服务器)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
-j DNAT --to-destination 10.0.0.10:8080

# 4. Hairpin NAT(内网访问自己映射的公网地址)
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -d 10.0.0.10 -p tcp --dport 8080 \
-j MASQUERADE

六、NAT 的副作用(Side Effects)

  1. 破坏端到端可达性
    外部无法主动连接内网主机,除非手动设置端口映射。
  2. 应用层地址暴露问题
    部分协议(FTP、SIP、RTSP 等)需 ALG 介入才能工作。
  3. P2P 与实时通信困难
    通常需借助 STUN / TURN / ICE / UPnP 等机制穿透 NAT。
  4. 审计与日志复杂
    多用户共享同一公网 IP,需记录端口级日志以区分责任。
  5. 性能瓶颈
    大规模并发会导致 NAT 表爆满或连接过早超时。
  6. 安全协议兼容性问题
    例如 IPsec 需使用 NAT-T(UDP 4500)进行封装。
  7. 调试复杂度上升
    故障排查需同时跟踪 NAT 表、端口映射和回程路由。

七、NAT 穿透与协作技术(NAT Traversal)

技术

功能

STUN(Session Traversal Utilities for NAT)

探测 NAT 类型及公网映射端口。

TURN(Traversal Using Relays around NAT)

通过中继服务器传输所有流量(应对对称 NAT)。

ICE(Interactive Connectivity Establishment)

综合候选地址测试与连通性检测。

UPnP / PCP / NAT-PMP

主机主动向路由器申请端口映射。

反向代理 / 隧道(SSH、WebSocket、FRP 等)

用于穿越 NAT 或防火墙限制。


八、NAT 与 IPv6 的关系(NAT and IPv6)

  • IPv6 拥有 充足的地址空间,不再需要 IPv4 的 NAT44 地址复用机制。
  • 但仍存在 NPTv6(Network Prefix Translation),用于前缀级地址重映射(不改端口)。
  • 在 IPv4 / IPv6 过渡阶段,使用以下机制实现互通:
  • NAT64 / DNS64
  • 464XLAT
  • Dual Stack(双栈)架构

九、总结(Summary)

  • NAT 是 IPv4 时代的关键补丁,解决了地址不足与安全需求。
  • 然而,它违背了互联网的端到端原则,增加了网络复杂性。
  • 随着 IPv6 普及,NAT 将逐渐退出历史舞台,但短期内仍是企业与家庭网络的核心组件。