通过 FTP 上传时出现间歇性问题(致命:协议版本)-连接未被删除?

通过 FTP 上传时出现间歇性问题(致命:协议版本)-连接未被删除?

客户端上传文件到 FTP 服务器时偶尔会遇到问题。有时可以,有时不行。

看起来他们可以正常登录(vsftpd 日志显示登录成功),但是在尝试传输文件时有时会失败,并出现错误:

alert write: fatal: protocol version
. 2017-03-20 21:00:06.459 error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
. 2017-03-20 21:00:06.459 wrong version number
. 2017-03-20 21:00:06.459 Disconnected from server
. 2017-03-20 21:00:06.459 Connection failed.

(他们正在使用 winscp)

该服务器使用 vsftpd 以被动模式设置,配置如下:

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=NO
xferlog_std_format=NO
log_ftp_protocol=YES
chroot_local_user=YES
listen=yes
listen_ipv6=no

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

pasv_enable=yes
port_enable=yes
pasv_min_port=10090
pasv_max_port=10095
pasv_address=**removed**
pasv_addr_resolve=yes

allow_writeable_chroot=YES

ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/ssl/eastberks_certs/**removed**.crt
rsa_private_key_file=/etc/httpd/ssl/**removed**.key

他们向我推荐了这篇论坛帖子:https://winscp.net/forum/viewtopic.php?t=12251

这表明,vsftpd 可能没有正确关闭连接/进程,因此,一旦它们通过端口 21 成功连接,当尝试在某个被动端口号上传输数据时,它就无法传输数据,因为它们都在使用中。这很有道理。

所以,我认为我可以复制这一点,但前提是传输过程中出现连接错误。

在没有人连接的起点,运行netstat -anp | grep vsftpd会给我以下结果:

tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      21051/vsftpd 

现在,如果我从客户端连接:

tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      21051/vsftpd        
tcp        0      0 172.31.1.200:21         MYIP:29354   ESTABLISHED 22302/vsftpd        
unix  3      [ ]         STREAM     CONNECTED     5179539  22302/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5179494  22303/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5179493  22311/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5179540  22311/vsftpd  

所以现在我们有了到端口 21 的连接,这是正确的。

现在如果我开始文件传输:

tcp        0      0 172.31.1.200:10091      0.0.0.0:*               LISTEN      22302/vsftpd        
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      21051/vsftpd        
tcp        0      0 172.31.1.200:21         MYIP:29354   ESTABLISHED 22302/vsftpd        
tcp        0      0 172.31.1.200:10091      MYIP:25260   ESTABLISHED 22303/vsftpd        
unix  3      [ ]         STREAM     CONNECTED     5179539  22302/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5179494  22303/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5179493  22311/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5179540  22311/vsftpd         

现在我们已经连接到端口 10091,它是被动端口之一。

如果该传输成功完成,则端口 10091 上的连接将消失,一切正常。

但是,我注意到有时会出现超时并且文件传输中断,当发生这种情况时,即使我断开连接并关闭 ftp 客户端,我发现这些连接仍然打开(在超时问题后,它在尝试重新连接时还打开了另外 2 个连接):

tcp        1      0 172.31.1.200:10090      0.0.0.0:*               LISTEN      22595/vsftpd        
tcp        0      0 172.31.1.200:10091      0.0.0.0:*               LISTEN      22302/vsftpd        
tcp        1      0 172.31.1.200:10094      0.0.0.0:*               LISTEN      22548/vsftpd        
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      21051/vsftpd        
tcp        1      0 172.31.1.200:21         MYIP:29354   CLOSE_WAIT  22302/vsftpd        
tcp        1      0 172.31.1.200:21         MYIP:37584   CLOSE_WAIT  22595/vsftpd        
tcp        1      0 172.31.1.200:21         MYIP:33453   CLOSE_WAIT  22548/vsftpd        
tcp        0      0 172.31.1.200:10091      MYIP:25260   ESTABLISHED 22303/vsftpd        
unix  3      [ ]         STREAM     CONNECTED     5179539  22302/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5181389  22557/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5179494  22303/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5182639  22600/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5182675  22600/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5181973  22557/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5179493  22311/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5182674  22595/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5182640  22596/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5179540  22311/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5181390  22549/vsftpd         
unix  3      [ ]         STREAM     CONNECTED     5181972  22548/vsftpd         

所以我认为这里发生的事情是,由于某种原因,传输遇到问题并且有时会被切断,这会导致服务器上的连接仍然打开,然后当它继续尝试时,它最终会用完所有 5 个被动端口号,然后它就什么也做不了了。

所以我的问题有两个方面。首先,有什么方法可以找出导致这些超时的原因吗?我起初以为这只是我的问题,因为我正在通过移动热点进行测试,但如果客户端也发生这种情况,那就说得通了(这是一个他们每天运行几次的自动脚本)。

其次,我能做些什么来阻止这些连接保持打开状态并堵塞端口?

信息

服务器是CentOS 7

vsftpd 是版本 3.0.2

如果您需要更多信息请告诉我。

谢谢。

相关内容