最近公司扩展海外业务,所以购买了一台亚马逊的服务器,在上面部署了FTP服务器(vsftpd)。后面我就通过命令行来测试这个FTP服务。登录服务器没有问题,但是每当我使用诸如ls、put这样的命令就会收到服务器返回500 Illegal PORT command,如下图所示:

两条通道

FTP客户端会与FTP服务器建立两条连接通道,一条为命令通道,一条为数据通道。命令通道为客户端主动发起,连接服务器的21端口(如果没有修改默认端口的话)。既然能够登陆成功说明这条通道是没有问题,ls这类的命令出现问题是因为它依赖数据通道,所以这个报错实际上是反应了数据通道的建立出现了问题。

主动被动模式

如何建立数据通道有两种方式,即主动、被动模式。主动模式是客户端告诉服务器自己的监听端口,然后服务器通过20端口(如果没有修改默认端口的话)连接该客户端的端口以建立连接。被动模式是服务器告诉客户端自己的监听端口(一般是数值比较大的端口),然后客户端主动发起连接。上图使用的则为主动模式。现在的问题变成这个连接为什么会失败。

失败原因

连接建立失败的原因有很多种,下面说一下常见的原因。1、客户端有防火墙,阻止了服务器的主动连接2、客户端服务器不在一个局域网,通过公网的话,实际上服务器连接的并不是真正的客户端

解决方案

东方不亮西方亮,可以尝试使用被动模式,通过passive可以切换主被动模式。当然被动模式也不是万事大吉的,被动模式对客户端是友好的,但是需要服务器开发一连串的接口供被动模式使用,不然连接同样也会被服务器拒绝。实际效果见下图

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐