NAT是一种常见的网络协议,可以达到节省公网IP地址和隐藏内部网络结构等目的。NAT通过对IP报文头部的IP地址和TCP/UDP端口进行转换,创建NAT会话表,完成数据的转发。

有一些特殊的协议或者应用,它们的报文不是TCP/UDP报文,或者其报文的数据部分包含了IP地址或端口信息。对于这些特殊报文不能按照普通的方法进行有效的转换。下面介绍一种常见的协议FTP,如何穿越NAT。

FTP基于TCP,是一种双通道协议。所谓双通道,是指要完成一次完整的FTP业务会涉及到控制连接和数据连接两个通道。

FTP有主动和被动两种模式,这里只讨论主动模式。

无NAT情况下的FTP业务流程:

frp mysql 穿透 ftp穿透nat_数据连接

建立控制通道

客户端主动发起,经过TCP三次握手,控制连接建立完成。

获取数据连接端口信息

控制连接建立后,用户登录、路径获取等相关操作均在控制通道内完成。

客户端通过port报文告知服务器端本端用户数据连接的IP和端口。请注意这些信息是承载在应用层数据里面的,使用的是控制连接通道。

图片
服务器使用20端口向客户端发起数据连接建立,使用的目的IP和端口来自于Port报文。在没有NAT的情况下数据连接成功建立完成。

数据传输在数据连接中完成。

考虑NAT设备存在的场景,直接由处于公网位置的服务器发起向私网客户端数据连接的建立将不会成功。是由于发起数据连接TCP SYN报文的目的IP和端口号从Port报文中获取,在NAT设备上没有对应的NAT会话表项。

为了解决这个问题,我们需要用到NAT的ALG(Application Layer Gateway)功能。NAT ALG能够感知到特定的应用,并做特殊的处理,以及进行应用层数据的针对性修改。对于FTP的port报文,其携带的原始Active IP address和Active port是真实的私网FTP客户端的IP和数据连接监听端口。NAT ALG会将其修改为NAT转换后的公网IP和端口号。如此,服务器收到的将是转换后的公网IP和端口号。由服务器发起的数据连接即可成功建立。

FTP穿越NAT只是NAT ALG的其中一个应用。ALG需要针对每种协议进行定制,才能理解并支持该协议。迈普的相关产品能够很好的支持NAT ALG功能,除FTP外还支持TFTP、DNS、SIP等多种协议,帮助客户解决各种特殊协议穿越NAT的问题。