阿里云\腾讯云无法连接到其他FTP的问题解决

Linux, 折腾 2018/03/18

接上一篇使用Rsync备份文件过程及问题解决,困扰了我好几天的问题终于解决了。水一篇,还原一下解决过程。

问题复现:

服务端为阿里云,安装宝塔面板,使用集成的PureFTP搭建ftp服务器

客户端为腾讯云,使用宝塔面板集成的FTP存储空间连接服务端,在添加ftp服务器信息后,一直卡在“正在获取文件列表”

起初我怀疑是宝塔的ftp备份插件出了什么问题,或者服务端ftp端口21没有在防火墙放行,但是都一一排除了。索性使用linux的ftp命令来测试

#CentOS
yum install -y ftp
#Ubuntu
sudo apt-get install ftp -y

连接服务器

ftp 服务器ip

输入用户名、密码,一切看似正常啊,但是当执行ls命令列目录的时候,问题出现了,如图:

长时间卡在“227 Entering Passive Mode“,并且最终出现“Connection timed out

也就是说在使用Passive Mode进行列目录时出现问题,一通了解和学习,才明白Passive Mode啥意思

ftp在建立连接时会采用主动模式(active mode)和被动模式(passive mode)两种连接模式

PORT是主动模式,在建立数据通道时,服务端去连接别人

PASV是被动模式,在建立数据通道时,服务端被别人连接

从上图可以看到,进入被动模式连接阿里云的FTP服务器时出现了227 Entering Passive Mode (172,21,54,44,155,228)

表示被动模式下连接到的阿里云ftp服务器IP为阿里云实例的私网IP,并非公网IP,所以使用被动模式无法连接

当客户端关闭passive mode,采用主动模式连接时,依然无法连接,原因还是一样的,因为腾讯云服务器同样给网卡绑定的是私网地址,导致ftp服务器无法连接到客户端。

所以如果两边都为私网地址,即便客户端切换主动、被动模式,始终是无法成功建立FTP传输通道的。

原因明确了,就该着手解决了。很简单,修改PureFTP服务端的配置,使其强制监听服务器的公网IP即可

如图,在宝塔面板后台,直接可以编辑FTP的配置文件,找到ForcePassiveIP这一行,修改为

ForcePassiveIP 你的服务器公网IP

保存配置并重启FTP服务,回到客户端测试一下,成功!

使用宝塔的FTP存储空间和linux的ftp命令,均能正常连接到ftp服务器。

总结一下:

FTP客户端默认的传输模式是被动模式,因此在通信过程中会去寻找服务器端的ip地址进行连接

但是由于服务器(阿里云)的外网IP不是直接配在网卡上,因此在被动模式下客户端(腾讯云)找不到有效的IP,故无法连接

唉,问题终于解决了,不得不吐槽一下腾讯云和阿里云的实例架构,导致了这样的问题。



评论(*号为必填项)