第45篇:NAT 穿越问题与 ALG

一、写在前面

NAT 解决了 IP 地址不足的问题,但也引入了一些麻烦——有些应用协议在 NAT 环境下工作不正常

原因是:NAT 只修改 IP 头部和端口号,但某些协议在报文内容中也嵌入了 IP 地址和端口信息。NAT 改了外层,没改内层,导致对端收到后比对不上。

ALG(Application Layer Gateway,应用层网关) 就是用来解决这个问题的——它"看懂"应用层协议,把报文内容中的 IP 和端口也一并修改。


二、为什么需要 ALG?

2.1 NAT 只改外层不改内层

正常 NAT 转换: 原始报文 NAT 转换后 | IP 头 源=10.0.1.5 目的=8.8.8.8 | ──→ | IP 头 源=100.1.1.1 目的=8.8.8.8 | ← 改了 | | --- | --- | --- | --- | | TCP 头 源端口=12345 | ──→ | TCP 头 源端口=10001 | ← 改了 | | 应用数据 "我的 IP 是10.0.1.5" | | 应用数据 "我的 IP 是10.0.1.5" | ← ❌ 没改! |

对方收到后,看到应用数据里的 IP=10.0.1.5 但数据包的源 IP=100.1.1.1 → 对不上 → 协议异常

2.2 常见需要 ALG 的协议

协议 问题 ALG 处理
FTP PORT 命令中携带了客户端的私网 IP 修改 PORT 命令中的 IP 和端口
DNS DNS 响应中携带了私网 IP 修改 DNS 报文中的 A 记录
SIP 信令报文中携带了私网 IP 修改 SIP 头中的 IP 和端口
ICMP ICMP 差错报文中携带原始 IP 修改 ICMP 负载中的 IP
PPTP GRE 隧道穿过 NAT 有问题 修改 PPTP 控制消息
IPsec IKE 协商中携带了 IP 地址 NAT-T 处理

三、FTP 穿越 NAT 的典型问题

3.1 FTP 的两种模式

主动模式(PORT):

客户端(10.0.1.5)  → 服务器(8.8.8.8)
客户端打开随机端口(1025)
客户端通过 PORT 命令告诉服务器:"你连我 10.0.1.5:1025"
服务器连接 10.0.1.5:1025 → 经过 NAT 后,服务器收到的 PORT 命令中 IP=10.0.1.5
→ 服务器试图连接 10.0.1.5(私网地址)→ 不可达!

ALG 介入:
  NAT 把 PORT 命令中的 10.0.1.5:1025 改为 100.1.1.1:20001
  服务器连接 100.1.1.1:20001 → NAT 转成 10.0.1.5:1025
  → 成功!

被动模式(PASV):

服务器告诉客户端:"你连我 XXX.XXX.XXX.XXX:YYYY"
如果是内网服务器做 NAT 映射 → 服务器回的是自己的内网 IP
→ 客户端也连不上

ALG 介入:把 PASV 回复中的 IP 改为公网 IP

3.2 ALG 开启命令

# 检查当前 ALG 状态
[Router] display nat alg
  DNS    : Enable
  FTP    : Enable    ← 默认开启
  ICMP   : Enable
  SIP    : Enable

# 手动开启/关闭
[Router] nat alg ftp enable
[Router] nat alg sip enable
[Router] undo nat alg dns enable

四、DNS ALG(NAT DNS Mapping)

4.1 场景

内网有 Web 服务器,对外映射了公网 IP。公司域名的 DNS 解析指向公网 IP。

内网用户访问公司域名时:

内网用户 → DNS 查询 "www.company.com"
DNS 返回:100.1.1.1

用户访问 100.1.1.1:80
→ 数据包到路由器
→ 路由器看到目的 IP=100.1.1.1(自己)
→ 没有服务器映射或环回处理 → 不通!

4.2 DNS ALG 解决方案

# 配置 DNS Mapping
[Router] nat dns-map

DNS ALG 会自动把 DNS 响应中的公网 IP 替换为对应的内网服务器 IP。


五、ICMP ALG

5.1 场景

ping 命令使用 ICMP 协议,携带了序列号(Identifier)。

如果内网多台设备同时 ping 同一个外网地址:

# 无 ALG 时:
PC-A 和 PC-B 都 ping 8.8.8.8
→ NAT 转换后源 IP 都是 100.1.1.1
→ 但 ICMP Identifier 没改
→ 两个 PC 的 Identifier 可能相同 → 回复时错乱

5.2 ICMP ALG 的处理

ICMP ALG 会修改 ICMP 报文中的 Identifier,确保每个会话唯一。


六、SIP ALG(VoIP 穿越 NAT)

6.1 场景

SIP 电话通过 NAT 上网,信令报文中的联系地址(Contact)和 SDP(媒体描述)中都包含私网 IP。

6.2 问题

SIP 电话注册:
  REGISTER sip:10.0.1.100:5060
  但实际数据包源 IP=100.1.1.1

SIP 服务器尝试联系 10.0.1.100 → 公网不可达
→ 注册失败

6.3 配置

[Router] nat alg sip enable

七、ALG 的安全考量

优点 缺点
让应用协议穿越 NAT ALG 需要解析应用层,消耗 CPU
无需修改客户端/服务器 对加密流量(TLS/HTTPS)无效
对用户透明 攻击者可能利用 ALG 绕过安全策略

八、NAT 穿越的其他方案

方案 说明
ALG 路由器解析应用层,修改报文内容
NAT-T(NAT 穿越) IPsec VPN 中使用 UDP 封装,绕过 NAT
STUN/TURN/ICE 应用层自己检测 NAT 并协商穿越
UPnP 应用自动在 NAT 上开端口映射(有安全风险)
IPv6 从根本上解决 NAT 问题(不需要 NAT)

九、思考

  1. 为什么有些应用协议经过 NAT 后无法正常工作?根本原因是什么?
  2. FTP 主动模式下,ALG 修改了哪个字段?解决了什么问题?
  3. 常见的需要 ALG 支持的协议有哪些?列举至少 4 个。
  4. DNS ALG 在内网用户访问公网域名映射的内网服务器时发挥了什么作用?
  5. ALG 为什么对加密流量(HTTPS)无效?
  6. 如果公司内网部署了 SIP 语音系统,需要开启什么 ALG 功能?

下篇预告:第46篇《DHCP原理_Discover_Offer_Request_ACK》——掌握DHCP协议的四步交互过程和报文交互细节。