4. NAT穿透与ALG技术

NAT在解决IPv4地址枯竭问题的同时,也破坏了IP端到端透明性。对于VoIP、FTP、SIP这类在载荷中携带地址和端口信息的应用,NAT设备若只做简单的地址端口转换,往往会导致连接建立失败或媒体流单向不通。本节从NAT对典型应用的影响入手,分析ALG、STUN、TURN、ICE四类穿透方案的原理、适用场景与配置要点。

一、NAT对应用协议的三类破坏方式

NAT对应用的影响可以归纳为三种机制。第一种是地址嵌入:应用层协议把私网IP和端口写在报文载荷里,NAT只改IP头和TCP/UDP头,载荷中的私网地址原样转发到公网,对端按该地址回包必然失败。FTP的PORT/PASV命令、SIP的SDP中的c=和m=行、H.323的Q.931消息都属于此类。

第二种是反向连接不可达:主动方在私网内监听端口,公网对端无法直接发起连接,因为NAT没有为该端口建立映射。FTP主动模式、SIP被叫方接收INVITE、VoIP的RTP媒体流都可能遇到。

第三种是端口映射超时:NAT的UDP映射通常只有30~120秒,TCP映射数分钟到数小时。SIP注册周期、RTP静默期、FTP控制连接空闲期若超过映射老化时间,映射被删除后后续报文无法通过。

二、ALG:让NAT“看懂”应用层

ALG(Application Level Gateway,应用层网关)的思路是让NAT设备解析应用层载荷,识别其中的地址端口字段,在转发时同步修改。以FTP主动模式为例,客户端在私网10.1.1.10:50000向服务器21端口发起控制连接,NAT为其建立映射并分配公网地址203.0.113.5:40001。客户端发送PORT 10,1,1,10,195,80(即10.1.1.10:50000),ALG解析该命令后改写为PORT 203,0,113,5,156,65(即203.0.113.5:40001),服务器据此向公网地址发起数据连接,NAT再根据已有映射转发回私网客户端。

SIP ALG的处理更复杂:它需要解析SIP消息头中的Via、Contact、From字段,以及SDP中的c=连接地址和m=媒体端口,分别改写为NAT的公网映射。配置时通常在NAT策略中启用alg sip或alg ftp。但SIP ALG在多层NAT、SIP over TLS、SDP中带多路媒体时容易出错,很多运营商网络反而建议关闭SIP ALG,改用STUN/TURN/ICE方案。

NAT穿透四类方案对比:ALG / STUN / TURN / ICE 私网侧 客户端A 10.1.1.10:50000 客户端B 10.1.1.20:50001 STUN/TURN 客户端 获取公网映射 ICE候选收集 host/srflx/relay NAT设备 ALG模块 解析并改写载荷 映射表 私网↔公网 公网映射 203.0.113.5 :40001 / :40002 映射老化 UDP 30~120s 公网侧 FTP服务器 203.0.113.20:21 PORT/PASV 载荷含地址 SIP代理 203.0.113.30:5060 SDP 含 c= 与 m= 行 STUN服务器 203.0.113.40:3478 返回 srflx 候选地址 TURN中继 203.0.113.41:3478 ICE连通性检查 STUN Binding Request/Response ALG 改写载荷地址;STUN 发现公网映射;TURN 中继兜底;ICE 组合候选并择优连通

三、STUN:发现自己的公网映射

STUN(Session Traversal Utilities for NAT,RFC 5389)不修改应用载荷,而是让客户端主动向公网STUN服务器发送Binding Request,服务器把观察到的源地址端口放在Binding Response的XOR-MAPPED-ADDRESS属性中返回。客户端由此得知NAT为自己分配的公网映射,这个地址称为srflx候选(server-reflexive candidate)。

STUN能工作有一个前提:NAT是锥形(Cone)类型。锥形NAT对同一内部地址端口的映射,允许任意外部地址通过该映射回包。若NAT是对称型(Symmetric),同一内部地址端口访问不同外部目标会分配不同公网端口,STUN发现的映射只对STUN服务器有效,对通信对端无效,此时STUN失效,必须用TURN中继。

STUN服务器通常部署在公网,监听3478/UDP和3478/TCP。客户端配置示例(以coturn客户端为例):

# 向STUN服务器查询公网映射
stunclient 203.0.113.40 3478
# 输出示例:
# Binding test: success
# Local address: 10.1.1.10:50000
# Mapped address: 203.0.113.5:40001

四、TURN:中继兜底

TURN(Traversal Using Relays around NAT,RFC 5766)在公网部署中继服务器。客户端向TURN服务器申请一个relay地址,所有发往对端的流量先发给TURN,由TURN转发。TURN必然能穿透NAT,因为客户端到TURN是主动出站连接,TURN到对端也是主动出站或已有映射。代价是带宽和时延增加,服务器成本高,因此TURN只作为STUN失败时的兜底。

TURN的典型交互:客户端发送Allocate请求,TURN返回XOR-RELAYED-ADDRESS(如203.0.113.41:50000);客户端用CreatePermission授权对端IP;再用Send/Data指示把媒体封装在TURN消息中转发。配置时需在TURN服务器上设置realm、认证方式(长期凭证或OAuth)、端口范围与带宽限制。

五、ICE:组合候选,择优连通

ICE(Interactive Connectivity Establishment,RFC 8445)不是一种新的穿透协议,而是一套框架,把host、srflx、relay三类候选地址组合起来,通过STUN Binding请求做连通性检查,选出可用且优先级最高的路径。候选优先级通常按类型排序:host > srflx > relay,同类型内再按本地偏好和组件ID计算。

ICE工作流程可概括为:收集候选(host从本地接口获取,srflx从STUN获取,relay从TURN获取)→ 交换候选(通过SIP/SDP或信令通道)→ 配对并排序 → 连通性检查(STUN Binding Request/Response)→ 提名并选定路径。若host和srflx都失败,才使用relay。ICE还处理了NAT类型变化、多网卡、IPv6/IPv4双栈等复杂场景。

六、方案选择与配置要点

方案原理适用场景局限
ALGNAT解析并改写应用载荷地址FTP、SIP、H.323等传统协议多层NAT、加密载荷失效;SIP ALG常出错
STUN客户端发现公网映射锥形NAT、UDP媒体对称型NAT失效
TURN公网中继转发对称型NAT、严格防火墙带宽成本高、时延增加
ICE候选收集+连通性检查WebRTC、现代VoIP需信令通道交换候选
实际工程中,推荐优先启用ICE,配合STUN服务器;若检测到对称型NAT或UDP被封锁,自动回退到TURN over TCP/TLS。对于必须使用FTP的场景,可在NAT设备上启用FTP ALG,或改用SFTP/FTPS避免载荷地址问题。SIP ALG建议在运营商级NAT上关闭,由终端侧ICE处理。
配置ALG时需注意:ALG会修改载荷,若应用层做了完整性校验(如SIP消息的Content-Length、FTP的校验和),改写后必须同步更新校验字段,否则对端会丢弃报文。此外,ALG与NAT映射表需保持状态一致,映射老化后ALG会话也应清理,避免残留表项导致后续连接异常。

判断穿透是否成功,可在客户端抓包观察:STUN Binding Response是否返回了非私网的XOR-MAPPED-ADDRESS;ICE是否收到Binding Success;媒体流是否双向到达。若只有单向流,通常是NAT映射未建立或ALG改写不完整。排查时先确认NAT类型(用STUN测试),再检查ALG开关与映射老化时间,最后考虑部署TURN中继。