客户端上传文件到 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
如果您需要更多信息请告诉我。
谢谢。