FTP主动模式与被动模式

前因:最近项目上线对接银行通道的,需要从银行FTP服务器下载对账文件进行对账,在本地环境与测试环境测试程序从ftp服务器获取文件下来都没有问题,结果上了生产发现获取对账文件失败了,找不到文件,但是直接用命令连接ftp服务器可以看到是有文件的,因此重新检查了下FTP 连接相关的配置,最后发现是跟 FTP 连接的模式--主动模式与被动模式的设置有关。

FTP主动模式:

FTP主动模式与被动模式

    主动模式——服务器主动连接客户端,然后传输文件,在这种模式下,FTP客户端先用一个端口N(N>1024)向服务器的21号端口发起控制连接,连接成功后,在发出PORT N+1命令告诉服务器自己监听的端口为N+1;服务器接受到该命令后,用一个新的数据端口(20号端口)与客户端的端口N+1建立连接,然后进行文件传输,而客户端则通过监听N+1端口接受文件数据。

  注意: 采用主动模式存在一个问题,如果客户端安装了防火墙或在内网时,由于防火墙一般不允许接受外部发起的标准端口以外的连接请求,因此外部FTP服务器就无法使用主动模式穿过防火墙主动连接客户端(这里与客户端连接的端口为N+1(N>1024),非标准端口),从而造成无法传送文件数据,此时就需要采用被动模式传送文件了。


FTP被动模式:

   FTP主动模式与被动模式

    服务器被动接受客户端连接请求,即控制连接请求和数据连接请求都是由客户端发起,在这种模式下,FTP客户端先随机开始一个端口N向服务器的21号端口发起控制连接,然后向服务器发送PASV命令。服务器收到该命令后,会用一个新的端口P(P>1024)进行监听,同时将该端口号告诉客户端,客户端接受到响应命令后,再通过新的端口N+1连接服务器的端口P,然后进行文件数据传输。

  注意:采用被动模式与主动模式也存在相同的问题,如果服务器安装了防火墙,客户端同样可能无法与服务器端的端口P建立数据请求,因为该请求可能会被防火墙过滤掉。在实际应用中,服务器一般指定一个端口范围,允许客户端与该范围内的端口建立数据连接,而不再这个范围内的端口会被服务器的防火墙过滤掉,从而在一定程度上消除了针对服务器的恶意攻击。


分析:

    简单来说,主动模式是服务端数据主动请求客户端,而被动模式是客户端请求服务端。

    而无论服务端请求客户端,还是客户端请求服务端,在正常的线上环境下,都有防火墙的,如果没有白名单情况下,都可能数据会被防火墙过滤掉

    在测试环境中,测试了主动模式或者被动模式都能成功,是因为内网环境不需要考虑防火墙,进而没有发现问题。

    而为什么命令行连接远程 FTP 能够读取文件呢?仔细看下面的图会发现,在连接的时候默认是主动模式的,而在显示 FTP 目录的时候,主动切回了被动模式连接:

   FTP主动模式与被动模式

       在线上的配置用的 FTP 模式是主动模式,因此连接上了远程的 FTP 服务器,却获取不到文件,把主动模式改成被动模式之后即可。

总结

    在使用FTP 的时候还是需要多了解下 FTP 连接的相关知识,一个模式的不同配置可能就会导致线上问题,归根到底还是对 FTP 连接的相关原理不了解导致的。


注:本文参考下面两篇博文,感谢博主的分享

    http://blog.51cto.com/12185273/2046753 

    https://www.cnblogs.com/wmcoder/p/5216953.html