VSFTPD是一个FTP服务器程序,然后SELinux是CentOS的防火墙组件,由于Vsftpd默认被SELINUX拦截,所以默认情况下会遇到FTP以下的问题:

  • 226 Transfer done (but failed to open directory).(传输完成,但是打开路径失败)
  • 550 Failed to change directory(更改路径失败)
  • 553 Could not create file.
  • 或者干脆在发送了LIST命令以后,服务器没响应,超时断开。

遇到这样的问题,通常是vsftpd没有足够的权限,很有可能是被selinux阻止了。网络上流行的办法是直接关闭selinux,但是这样做会引起其他安全问题,所以还有更好的解决方法

为了确定是不是由selinux引起的问题,我们需要暂时将selinux关闭来验证

setenforce 0    #暂时让SElinux进入Permissive模式

运行完以后在尝试,如果ftp能取得目录,上传下载,那么证明就是SElinux导致的。

解决办法:getsebool -a|grep ftpd来查看ftp的相关权限列表

getsebool -a | grep ftpd

#以下是显示出来的权限,off是关闭权限,on是打开权限
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftpd_connect_db --> off
ftpd_use_passive_mode --> off
ftp_home_dir --> off

其中,ftp_home_dirallow_ftpd_full_access必须为ON,才能使vsftpd具有访问ftp根目录,以及文件传输等权限。

运行以下命令

setsebool -P ftp_home_dir 1
setsebool -P allow_ftpd_full_access 1

若权限列表中没有ftp_home_dir则只输入第二条

运行完了以后,重新恢复SELinux进入Enforcing模式。

setenforce 1 #进入Enforcing模式

如果此问题还没有解决的话,也可能是ftp访问的目录权限不够,建议使用chmod -R 777 路径 将权限属性改为777,再尝试,通常能够解决问题

最后修改:2021 年 03 月 30 日
如果觉得我的文章对你有用,请随意赞赏~