第45篇:NAT 穿越问题与 ALG
关键词:NAT穿越、NAT-PT、ALG、应用层网关、FTP穿越、SIP穿越、STUN、华为配置
一、引言
NAT 让内网设备可以访问外网,但它也带来了一个棘手问题:如果通信双方都在 NAT 后面,或者应用层协议本身携带了 IP 地址信息,简单的 NAT 就无法正常工作了。这就是 NAT 穿越(NAT Traversal)问题。
ALG(Application Layer Gateway,应用层网关)是解决 NAT 穿越问题的关键机制。它能够"深入"应用层协议载荷,识别并修改其中嵌入的 IP 地址和端口信息,使得被 NAT 阻断的通信得以恢复。
二、核心概念
2.1 NAT 穿越问题的本质
NAT 只修改 IP 包头和 TCP/UDP 头部的地址和端口信息。但如果协议的应用层载荷中也携带了 IP 地址或端口号,NAT 设备无法感知和修改这些内嵌地址,导致通信失败。
| 问题类别 | 说明 | 典型协议 |
|---|---|---|
| 载荷中的地址 | 协议载荷中携带 IP 地址或端口 | FTP、SIP、H.323、RTSP |
| 多通道连接 | 协议需要建立多个连接(控制+数据) | FTP、SIP |
| 双向连接 | 双方都需要主动发起连接 | P2P、VoIP |
| ICE/NAT 类型 | 对称型 NAT 导致端口不可预测 | STUN/TURN 场景 |
2.2 ALG 工作原理
ALG 是部署在 NAT 设备上的一个"协议理解器"。它在 NAT 地址转换的同时,对特定应用层协议的载荷进行检查和修改。
ALG 处理流程:
1. 检测到特定协议(如 FTP 控制连接)
2. 解析应用层载荷中的 IP 地址和端口
3. 将载荷中的私网地址替换为公网地址
4. 为载荷中提到的端口预先创建 NAT Session(预测性映射)
5. 完成协议载荷和 IP 头的双重转换
2.3 支持 ALG 的常见协议
| 协议 | ALG 作用 | 常见问题 |
|---|---|---|
| FTP | 修改 PASV 响应中的 IP 和端口,预建 DATA 通道映射 | 被动模式文件传输失败 |
| SIP | 修改 SDP 中的 c= 和 m= 行地址 | VoIP 单向无声、无法建立通话 |
| H.323 | 处理呼叫信令和媒体流地址 | 视频会议室连接失败 |
| RTSP | 修改 RTSP 描述中的媒体流地址 | 流媒体播放失败 |
| DNS | 检查 DNS 响应中的地址信息 | 内网域名解析回环问题 |
| PPTP | 处理 GRE 隧道封装 | VPN 连接无法建立 |
| TFTP | TFTP 载荷不携带 IP 地址,但每个传输使用独立的临时 UDP 端口,需相应 NAT 映射/会话支撑 | 传输中断、超时 |
注:华为 VRP 的 nat alg 支持协议为 dns/ftp/sip/pptp/rtsp(
nat alg { all | protocol-name } enable),未将 TFTP 列为受支持协议;TFTP 穿越 NAT 通常靠固定端口映射(nat server)加 NAT 会话老化配合解决。
三、技术细节
3.1 FTP ALG 详解
FTP 是 ALG 最经典的应用场景。FTP 使用两个独立的连接:控制连接(端口 21)和数据连接(随机高端口)。
FTP 主动模式(PORT)流程: 1. 客户端打开一个随机端口 P,向服务器 21 端口发起控制连接 2. 客户端打开端口 P+1,通过控制连接告知服务器"请连接我的 IP:P+1" 3. 服务器从 20 端口主动连接客户端的 IP:P+1 建立数据连接
问题:客户端在 NAT 后面,它告诉服务器的 IP 是私网地址,服务器无法直接连接。
FTP ALG 处理: - 修改控制连接中 PORT 命令的 IP 和端口(私网→公网) - 在 NAT 设备上预先创建从服务器 20 端口到客户端的映射
FTP 被动模式(PASV)流程: 1. 客户端向服务器 21 端口发起控制连接 2. 客户端发送 PASV 命令 3. 服务器打开随机端口 Q,回复"请连接我的 IP:Q" 4. 客户端连接服务器的 IP:Q 建立数据连接
问题:服务器在 NAT 后面,它回复的 IP 是私网地址,客户端无法直接连接。
FTP ALG 处理: - 修改 PASV 响应中的 IP 和端口(私网→公网) - 在 NAT 设备上创建从客户端到服务器端口 Q 的映射
# 启用 FTP ALG(缺省未使能,需要时显式开启)
[HUAWEI] nat alg ftp enable
# 说明:nat alg 只有 enable / undo 两种形式,不支持"端口范围""超时"等子参数;
# 如需限定被动模式数据端口段:在 FTP 服务器上配置 PASV 端口范围,
# 再在 NAT 设备上对该端口段做映射(写法见第44篇,以设备版本手册为准)
# 验证 ALG 使能状态
<HUAWEI> display nat alg
# 回显各协议 ALG 的使能状态(status),格式以设备版本为准
3.2 SIP ALG 详解
SIP(Session Initiation Protocol)用于 VoIP 呼叫建立,SDP(Session Description Protocol)载荷中携带了 RTP 媒体流的 IP 和端口信息。
SIP 信令交互(无 ALG 时):
呼叫方(NAT后) NAT 设备 被叫方
| | |
INVITE |------------------->|------------------>|
(SDP: 192.168.1.10:5000) | (只转换IP头) |
| |
| 被叫方收到错误IP |
| 媒体流无法建立 |
SIP 信令交互(有 ALG 时):
呼叫方(NAT后) NAT 设备 被叫方
| | |
INVITE |------------------->|------------------>|
(SDP: 203.0.113.1:12345) | (转换IP头+SDP载荷) |
[ALG修改了SDP中的IP:端口] | |
| 被叫方收到正确IP |
| 媒体流正常建立 |
# 启用 SIP ALG
[HUAWEI] nat alg sip enable
# 说明:SIP 信令/媒体流的会话老化由 NAT Session 老化时间控制,
# nat alg 本身没有独立的超时参数(以设备版本手册为准)
# 验证
<HUAWEI> display nat alg
3.3 DNS ALG
DNS ALG 解决内网 DNS 响应中的 NAT 回环问题。
# 启用 DNS ALG
[HUAWEI] nat alg dns enable
# 配置 DNS Mapping:域名 → 公网地址 → 公网端口/协议(与 NAT Server 的发布项对应)
[HUAWEI] nat dns-map www.company.com 203.0.113.10 80 tcp
# dns-map 表项是 DNS 响应的改写依据(缺一不可,仅使能 nat alg dns 不会改写);
# 条目数有上限(如 AR 系列最多 64 条),支持情况以设备版本手册为准
# 场景(前提:203.0.113.10 是 NAT Server 对外发布 www.company.com 的公网地址):
# 内网 PC 查询 www.company.com → DNS 返回 203.0.113.10(公网 IP)
# 设备按 DNS Mapping 表项 + NAT Server,将响应中的 203.0.113.10 替换为 192.168.1.100(inside 地址)
# PC 直接用私网地址访问内网服务器,避免"内网访问公网地址"绕经 NAT 设备(回环问题,见第44篇案例二)
3.4 ALG 的启用与关闭
# 查看所有 ALG 状态
<HUAWEI> display nat alg
# 关闭特定 ALG(某些场景下 ALG 会干扰业务)
[HUAWEI] undo nat alg ftp enable
# 批量关闭所有 ALG
[HUAWEI] undo nat alg all enable
# 注:nat alg 命令没有独立的 disable 形式,关闭一律用 undo nat alg ... enable;
# 缺省情况下 NAT ALG 处于未使能状态
四、实战配置/案例分析
4.1 案例一:FTP 被动模式穿越故障
故障背景:某企业 FTP 服务器(192.168.10.50)通过 NAT Server 对外发布。外网用户可以登录 FTP,但下载文件时连接立即断开。
# 排查过程:
# Step 1: 抓包分析
# 发现 PASV 响应中服务器返回的 IP 为 192.168.10.50,端口 55001
# 客户端尝试连接 192.168.10.50:55001 → 超时(公网无法访问私网地址)
# Step 2: 检查 ALG 状态
<HUAWEI> display nat alg
# 查看 FTP 等协议 ALG 的使能状态;缺省未使能
# Step 3: 启用 FTP ALG
[HUAWEI] nat alg ftp enable
# 若已限定被动模式端口段(如 50000~55000),需确保 NAT 侧有对应映射,
# 做法见第44篇(nat alg 命令本身不支持 port-range 子参数)
# Step 4: 在 FTP 服务器上配置被动模式端口范围
# Windows IIS FTP: 被动端口范围 50000~55000
# Linux vsftpd: pasv_min_port=50000, pasv_max_port=55000
# Step 5: 验证
# 再次抓包,PASV 响应中的 IP 已变为公网 IP 203.0.113.10
# 客户端成功连接数据通道,文件下载正常
4.2 案例二:SIP 电话单向无声
故障背景:企业部署了 IP-PBX(192.168.10.200),SIP 电话注册正常、可以振铃、可以接通,但通话时只有一方能听到声音。
# 排查过程:
# Step 1: 分析信令
# INVITE 中 SDP 携带 RTP 地址 192.168.10.100:16384
# NAT 只转换了 IP 头,SDP 中的地址未修改
# 对方发送 RTP 到 192.168.10.100:16384(私网地址),无法到达
# Step 2: 启用 SIP ALG
[HUAWEI] nat alg sip enable
# Step 3: 验证
# SIP ALG 修改 SDP 中的 RTP 地址为 203.0.113.1:映射端口
# RTP 媒体流双向正常,通话双方都能听到声音
# 补充:如果 SIP 服务器也在 NAT 后面,需要同时配置 NAT Server 发布 SIP 端口
[HUAWEI] nat server protocol udp global 203.0.113.1 5060 inside 192.168.10.200 5060
4.3 案例三:ALG 导致的问题
故障背景:某企业使用 IPSec VPN 连接分支机构,启用 ALG 后 VPN 隧道频繁中断。
# 问题根因:
# ALG 会深度检测某些协议的数据包
# 对于加密流量(如 IPSec ESP 包),ALG 尝试解析但失败
# 部分设备的 ALG 实现会对无法解析的包做丢弃处理
# 解决方案:
# 方案1:关闭相关 ALG(如不需要 FTP/SIP 穿越时)
[HUAWEI] undo nat alg ftp enable
[HUAWEI] undo nat alg sip enable
# 方案2:通过 ACL 让加密流量绕开 NAT(具体命令以版本手册为准)
# 思路:nat outbound 的语义是 ACL 匹配 permit 的流量做地址转换、deny 的流量不转换,
# 因此应在 NAT 引用的 ACL 中用 deny 排除 IPSec 流量,其余流量 permit 正常转换
# 示例1:在现有 Easy-IP 的 ACL 中先 deny 掉 IPSec 站点网段
[HUAWEI] acl 2000
[HUAWEI-acl-basic-2000] rule 5 deny source 10.1.1.0 0.0.0.255
[HUAWEI-acl-basic-2000] rule 10 permit source 192.168.1.0 0.0.0.255
# 示例2:用高级 ACL 按协议排除 ESP/IKE(nat outbound 支持 2000~3999,可用高级 ACL)
[HUAWEI] acl 3100
[HUAWEI-acl-adv-3100] rule 5 deny esp
[HUAWEI-acl-adv-3100] rule 10 deny udp source-port eq 500 # IKE(源端口 500)
[HUAWEI-acl-adv-3100] rule 15 permit ip
[HUAWEI] interface GigabitEthernet0/0/1
[HUAWEI-GigabitEthernet0/0/1] nat outbound 3100
# deny 的 ESP/IKE 流量不转换(绕开 NAT),其余流量正常地址转换;规则号与写法以版本手册为准
4.4 STUN 与 NAT 穿越(P2P 场景)
对于 P2P 视频会议、在线游戏等场景,ALG 不是唯一方案。STUN(Session Traversal Utilities for NAT)协议也是一种重要的 NAT 穿越机制。
| 机制 | 原理 | 适用场景 |
|---|---|---|
| ALG | 在 NAT 设备上修改应用层载荷 | 企业网关、路由器 |
| STUN | 客户端主动探测自己的公网映射地址 | P2P 应用、VoIP 终端 |
| TURN | 通过中继服务器转发媒体流 | 对称型 NAT、严格防火墙 |
| ICE | 综合 STUN + TURN + 直连,选择最优路径 | WebRTC、现代 VoIP |
注意:STUN/TURN/ICE 是应用层协议,与 ALG 是互补关系,不是替代关系。
五、总结
| ALG 协议 | 解决的核心问题 | 典型故障现象 |
|---|---|---|
| FTP ALG | PASV/PORT 模式中的地址转换 | 登录正常、传输失败 |
| SIP ALG | SDP 中 RTP 地址转换 | 能振铃、单向无声 |
| DNS ALG | 内网 DNS 响应回环 | 内网访问域名走外网 |
| H.323 ALG | 信令与媒体流地址分离 | 视频会议无法建立 |
| ALG 配置最佳实践 | 说明 |
|---|---|
| 按需启用 ALG | 不需要的协议关闭 ALG,避免干扰 |
| 限定应用动态端口段 | 在应用服务器侧限制动态端口范围(如 FTP PASV 50000~50100),缩小 ALG 处理面;nat alg 命令本身无端口范围参数 |
| 监控 ALG Session | 检查 ALG 创建的 Session 是否正常 |
| 注意 ALG 兼容性 | 加密流量、非标端口可能导致 ALG 异常 |
| ALG + NAT Server 组合 | 对外发布的服务器需要同时配置两者 |
| 抓包验证 | 使用 Wireshark 验证载荷中的地址是否正确转换 |
思考
- 为什么 FTP ALG 需要在数据通道建立之前就预先创建 NAT Session?如果不在控制连接阶段处理会有什么问题?
- ALG 对加密流量(如 HTTPS、IPsec)是否有效?为什么?
- 如果一个应用使用了非标准端口(如 FTP 不使用 21 端口),ALG 还能正常工作吗?
下篇预告:第46篇:DHCP 原理:Discover→Offer→Request→ACK