最近使用命令行ftp命令连接FTP服务器进行文件下载时,出现了421 Could not create socket,Passive mode  refused 。因为使用ftp客户端登录FTP服务器的时候,模式使用passive (被动)模式,这个模式是服务器开启一个端口,客户端来连接,这种情况一般是不会出现问题的,因为一般服务器是不会开启防火墙的。而主动模式是服务器主动连接客户端,如果这时客户端有防火墙保护,那么服务器就连接不上客户端,导致连接失败。

#登录的时候能正常登录,在查询文件列表时出错
ftp>ls
421 Clould not create socket
Passive mode refused
ftp>
#passive可以切换被动模式的开关,默认开启
ftp>passive
Passive mode off
ftp>passive
Passive mode on

        于是我切换为主动模式进行连接,这个时候,不出现421错误了,客户端也显示通信消息发送成功了,但是会一直卡在接收服务器消息那里,这也好理解,因为我客户端有防火墙保护,ftp协商出来的端口没有被开放,服务器就连接不了客户端开放的端口,就会出现这种情况。

        这里拓展一下FTP的连接机制吧,FTP分为两种连接方式:被动模式和主动模式,主动还是被动的选择权在客户端这边,主动被动这两个词主要是站在FTP服务器的视角说的,被动模式就是FTP服务器开启对应的端口,客户端来连接服务器,主动模式是客户端开启对应的端口,FTP服务器主动去连接。在连接的时候,客户端会首先连接FTP服务器的21端口进行通信,发送自己的连接模式(主动模式或被动模式),如果是被动模式,FTP服务器会返回六个数,其中前四个数是服务器的ip地址,后两个数是服务器开启的端口,这两个数用前一个数*256+后边这个数,得出来的就是开启的端口,以下图为例,145*256+121=37241,客户端在计算之后,就去连接服务器的对应端口,这就是被动模式。

               主动模式和被动模式正好反过来,这个时候是客户端发送六个数给服务器,服务器拿到这六个数之后,经过计算,就能知道客户端的ip和端口,然后和客户端进行连接。不过如果客户端被防火墙保护的话,这种方式就会连接失败。

         接着回来咱们的问题421 Could not create socket,Passive mode  refused,这种乍一看是主被动模式的问题,实际上不是的,看报错的信息Could not create socket,不能创建socket,我们看FTP被动模式的图,可以看到,在通信的时候,服务器在给客户端发送六个数据之后,客户端就已经连接上了,这个不能创建socket应该是服务器那边在生成这六个数的时候,就已经出现了问题。然后我去FTP服务器上查看FTP的配置,结果发现服务器配置了随机开端口的范围20-20,这样的话实际上就只开了一个端口,但是FTP的一个连接实际上是要开两个端口的,一个是默认的21 (如果不配置的话),这个端口的作用是协商新开的端口的。FTP默认的数据传输端口是20,不过这个是在主动模式下使用这个端口去连接客户端随机开的端口的。

        这样如下图,服务器在收到客户端发送的PASV(被动模式)的请求之后,去打开自己的随机端口,然后发送给客户端,但是由于限制其职能开一个端口,那么这个端口就创建不了,于是职能给客户端回复421 Could not create socket。一般这种问题,大家遇到的会比较少,因为我们在安装FTP服务器之后,一般不会去动默认的配置。所以就不会类似的情况。

        其实大家在知道FTP的基本原理之后,就能根据现象去推断问题出现的点,然后进行排查问题,我觉得这个能力很重要。这就是这个问题的分析和解决,希望可以帮助大家。

 

Logo

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

更多推荐