Linux系统安装FTP服务端引发FTP客户端远距离下载较大文件超时相关问题的解决方案

已经好久没有更新博客了呢......

最近也是遇到了一些奇葩问题,就把这些问题的解决方法写到博客上来,希望帮助到一些朋友,避免再花费大量时间来研究这个东西,用更多的时间去做创造性的东西吧

问题场景:

我在Linux系统按照网上教程安装了FTP服务端,然后我在另一个Linux客户端定期执行一个利用FTP命令下载文件的脚本,结果发现在下载大文件时(28M),卡在那里了,一直不执行下载了,就是FTP中的mget命令,这个命令是下载多个文件的命令,即下载指定格式的文件,我就用xftp试了下,发现这种商业级别的FTP工具也卡住了,我就懵逼了,一直在找原因,最终找到原因了,即这篇博文。如果你也遇到同样问题,那么请按照我说的方法可以保你解决问题!

1、安装FTP服务端——vsftpd

shell> yum install -y vsftpd

2、修改配置文件为我下图展示的内容(其中一些并不是绝对有影响的,但是避免脚本运行过程中出现其他问题,建议按照以下配置来修改

# 配置文件目录为/etc/vsftpd/vsftpd.conf

shell> vim /etc/vsftpd/vsftpd.conf

anonymous_enable=NO
local_enable=YES
write_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
listen=NO
listen_ipv6=YES

3、添加ftp账户

# 添加用户 ftpxxxx
# -d:指定用户主目录 
# -s:指定用户所用的shell,此处为/sbin/nologin,表示不登录

shell> useradd ftpxxxx -d /home/ftp -s /sbin/nologin

shell> passwd ftpuser

这个时候如果想要使用FTP客户端连接FTP服务端的话,一定要将重新启动一次,或者将vsftpd服务暂停,然后再启动,这样才会重新加载修改后的配置文件,否则你的配置文件就不会生效。

# 重新启动 vsftpd 服务
shell > service vsftpd restart
# 查看 vsftpd 服务的运行状态是否重新启动运行了
shell > service vsftpd status

# 或者 先暂停 再启动
shell > service vsftpd stop
# 查看 vsftpd 服务是否暂停了
shell > service vsftpd status
# 启动 vsftpd 服务
shell > service vsftpd start
# 查看 vsftpd 服务是否启动了
shell > service vsftpd status

4、倘若FTP客户端无法连接,请检查服务端vsftpd服务是否运行,因为我测试的时候发现重启后,vsftpd服务并不是开机启动的,这时候需要我们手动运行服务

# 查看 vsftpd 服务状态
shell > service vsftpd status
# 手动运行 vsftpd 服务
shell > service vsftpd start

服务启动后还连接不上就有可能出在配置文件中的问题,如果开启了以下两个选项,请在相应目录下创建一个chroot_list文件后,再尝试连接,执行以下命令

# /etc/vsftpd/vsftpd.conf配置文件中的两个选项
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list


shell> touch /etc/vsftpd/chroot_list

5、检查shells文件中是否有添加账户的nologin

shell> cat /etc/shells
# 如果没有 /sbin/nologin,则添加
shell> vim /etc/shells
# 添加一行 /sbin/nologin

6、查看防火墙的状态信息

# 查看防火墙状态信息
shell> firewall-cmd --state

# 如果是运行的状态可以先关闭,验证关闭防火墙之后ftp是否可以登录成功,如果ftp登录成功,请
# 在防火墙中配置允许ftp服务端口运行即可解决该问题,命令如下,否则就不是防火墙的问题,请继续
# 排查其他原因

# 允许 ftp 服务
shell> firewall-cmd --permanent --zone=public --add-service=ftp
# 重新载入配置
shell> firewall-cmd --reload
shell> service firewalld stop (暂停之后等10s左右再去启动防火墙)
shell> service firewalld start

7、查看Selinux的状态信息

shell> sestatus
# 如果是运行的状态,可以先尝试关闭,然后验证ftp是否可以登录,登录成功即是selinux的问题,否
则就不是selinux问题,请继续排查其他原因
shell> setenforce 0
# 说明:
# setenforce 0 设置SELinux 成为permissive模式 (关闭SELinux)
# setenforce 1 设置SELinux 成为enforcing模式 (开启SELinux)

#如果关闭之后可以登录,请做如下selinux配置:
# 查看当前配置
shell> getsebool -a |grep ftp
# 设置 ftp 可以访问 home 目录
shell> setsebool -P ftp_home_dir=1
# 设置 ftp 用户可以有所有权限
shell> setsebool -P allow_ftpd_full_access=1

8、根治ftp连接远距离下载较大文件超时问题

原因分析
因为ftp传输文件是通过两个端口完成传输的,控制命令端口(21)和数据传输端口(视主动或被动模式
而定),修改了linux系统中vsftp默认的超时时间后,还是会下载文件中断,不下载,是因为下载大文件超时
导致系统将控制命令端口关闭,倘若ftp客户端带超时自动重新登录功能(如lftp),可自动重新登录并下载
系统默认的ftp客户端则不支持超时自动重新登录功能,也就导致不能自动重新登录,下载大文件后继续下载
其他小文件失败。

根据原因推断:是操作系统将控制命令端口(21端口)超时关闭了,所以我们只需要修改Linux系统的配置文件后即可解决问题。(真的万万没想到是操作系统的原因,我自己修改了Linux系统FTP服务端的vsftpd的配置文件尝试了无数次)

解决办法

# 修改系统默认配置文件
shell> vim /etc/sysctl.conf
# 添加如下配置
net.ipv4.tcp_keepalive_time = 30	每30s发送一次keepalive数据包
net.ipv4.tcp_keepalive_intvl = 10	确定keepalive探针在第一次保持活动探测后每10s发送一次
net.ipv4.tcp_keepalive_probes = 6	超时前的探测次数
net.ipv4.tcp_fin_timeout = 300		系统默认的超时时间
# 重新加载系统配置
shell> sysctl -p

# 重启一次centos系统
shell> reboot

 

你可能感兴趣的:(linux学习之路)