NAT ALG
NAT和NAPT只能对IP报文的头部地址和TCP/UDP头部的端口信息进行转换。对于一些特殊协议,例如ICMP、FTP等,它们报文的数据部分可能包含IP地址或端口信息,这些内容不能被NAT有效的转换。
例如,一个使用内部IP地址的FTP服务器可能在和外部网络主机建立会话的过程中需要将自己的IP地址发送给对方。而这个地址信息是放到IP报文的数据部分,NAT无法对它进行转换。当外部网络主机接收了这个私有地址并使用它,这时FTP服务器将表现为不可达。
目前支持ALG功能的协议包括:DNS、FTP、ICMP、SIP和RTSP。
表1 ALG功能对常用应用协议报文做NAT变换时,其报文中有部分字段会做NAT变换
| 应用协议 | 做NAT变换的字段 |
| DNS | 响应报文中的IP和Port |
| FTP |
• Port请求报文中载荷里的IP和Port • Passive响应报文中载荷里的IP和Port |
| ICMP | ICMP报文载荷部分的IP和Port |
| SIP |
• Request line • From • To • Contact • Via • O • Message body的C字段地址和M字段的端口 |
| RSTP | setup/reply OK 报文中的端口字段 |
ALG处理机制
解决这些特殊协议的NAT转换问题的方法就是在NAT实现中使用应用层网关ALG(Application Level Gateway)功能。ALG是对特定的应用层协议进行转换,在对这些特定的应用层协议进行NAT转换过程中,通过NAT的状态信息来改变封装在IP报文数据部分中的特定数据,最终使应用层协议可以跨越不同范围运行。
以ICMP协议为例介绍ALG处理的过程。比如一个“目的站点不可达”的ICMP报文,该报文数据部分包含了造成错误的数据报文A的首部(注意,NAT发送数据报文A之前进行了地址转换,所以源地址不是内部主机的真实地址)。如果开启了ICMP ALG功能,在NAT转发ICMP报文之前,它将与NAT交互,打开ICMP报文并转换其数据部分的报文A首部的地址,使这些地址表现为内部主机的确切地址形式,最后由NAT将这个ICMP报文转发出去。
DNS Mapping
在某些应用中,私网用户希望通过域名访问位于同一私网的内部服务器,而DNS服务器却位于公网。由于通常DNS响应报文中携带的是内部服务器的公网IP地址,因此若NAT设备未将DNS Server解析的公网IP替换成内部服务器对应的私网IP,私网用户将无法通过域名访问到内部服务器。
这个问题可以使用DNS Mapping方式来解决,通过配置“域名—公网IP地址—公网端口—协议类型”映射表,建立内部服务器的域名与其公网信息间的对应关系。
图1描述了DNS Mapping的基本原理。
如图1所示,私网用户Host希望通过域名方式访问Web Server,Router作为NAT服务器。当Router设备收到DNS响应报文后,先根据其中携带的域名查找DNS Mapping映射表,再根据“公网IP地址—公网端口—协议类型”查找Web Server,然后将DNS响应报文中的公网IP地址替换成Web Server的私网IP地址。这样,Host收到的DNS响应报文中就携带了Web Server的私网IP地址,从而可以通过域名来访问Web Server。





