FTP:被动模式(PASSIVE)数据链路建立失败

FTP:被动模式(PASSIVE)数据链路建立失败

FTP:基础概念及使用

今天公司现网有同事反馈我们的 FTP 客户端工具链接 FTP 服务器获取远端文件失败。

简单排查,发现使用的是 PASSIVE 被动模式,流程如下:

1.FTP 客户端建立与 FTP 服务器命令端口 21 的命令链路;
2.FTP 客户端与 FTP 服务器命令交互(包括登录等操作);
3.FTP 客户端想要下载、上传文件到服务器,进入 PASSIVE 模式;
4.FTP 服务器监听临时端口,并将临时端口告知 FTP 客户端;
5.FTP 客户端主动发起TCP链路建立请求到 FTP 服务端指定监听的临时端口,建立数据链路;
6.数据传输;
……
7.传输完毕,数据链路断开;
8.命令链路断开。

正常流程应该如上。

实际由于 FTP 客户端发起TCP链路建立请求到 FTP 服务器失败,导致数据链路建立失败,上传下载文件失败。

在 FTP 客户端抓包如下:

上面抓包结果完整地描述了整个交互过程。

客户端:172.31.10.23
服务端:10.110.7.150

PS:不知道为啥,从客户端发出来的TCP包总是多发一份,无论是数据包还是确认包(TCP Dup ACK)。

No = 71 分组,是 FTP 服务器给客户端的应答,告知其我(FTP 服务器)开放的临时数据链路端口(50000)。

No = 72 分组,是 FTP 客户端尝试发起数据链路建立请求(TCP),可见本地临时端口为50577,SYN 包。

No = 73 分组,是 No = 72 分组的重复包,虽然不知道为啥会多发一份……

No = 74 分组,是 No = 71 分组的确认包。

No = 75 分组,同 No = 74 分组。

No = 76 分组,到 No = 81 分组,一共重传 SYN 包三次,分别是第 3 秒、第 9 秒、第 21 秒。

自第一次发送 SYN 包开始,到最后一次重传一共经过 21 秒……

TCP 的第二次握手,客户端协议栈一直也没等到……

数据链路建立失败,文件上传、下载那是不可能的。

可能的原因:

1.客户端防火墙偷悄悄地将 TCP SYN 包吞掉;

2.服务端防火墙偷悄悄地将收到的 TCP SYN 包吞掉;

3.其他原因,导致服务端 TCP 栈没收到 SYN 包或者收到了但是没有应答 ACK。

建议:

1.检查并配置客户端、服务端防火墙配置,是否有针对端口、IP 等的过滤规则;

2.使用主动模式,FTP 客户端开放临时端口,告知 FTP 服务器,由 FTP 服务器主动建立与 FTP 客户端的数据链路。