在 CentOS 上搭建 FTP 服务(常见为 vsftpd)后“无法上传”是一个很常见的问题,通常不是单一原因,而是权限、SELinux、防火墙、FTP 模式等综合导致的。下面按最常见原因逐项排查。
CentOS 常见的是 vsftpd:
systemctl status vsftpd
例如你让用户上传到 /home/ftpuser:
ls -ld /home/ftpuser
应确保:
755 或 775)修复示例:
chown ftpuser:ftpuser /home/ftpuser
chmod 755 /home/ftpuser
编辑配置文件:
vi /etc/vsftpd/vsftpd.conf
确保有以下内容:
write_enable=YES
如果使用了匿名用户,还需:
anon_upload_enable=YES
anon_mkdir_write_enable=YES
修改后重启:
systemctl restart vsftpd
CentOS 默认开启 SELinux,这是最常见被忽略的原因。
getenforce
如果是 Enforcing,尝试临时关闭测试:
setenforce 0
如果能上传了,说明就是 SELinux 问题。
给 FTP 目录设置正确的 SELinux 类型:
semanage fcontext -a -t public_content_rw_t "/home/ftpuser(/.*)?"
restorecon -Rv /home/ftpuser
并允许 FTP 写:
setsebool -P ftpd_full_access on
FTP 上传通常使用 被动模式,需要开放端口范围。
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
防火墙放行:
firewall-cmd --add-port=30000-31000/tcp --permanent
firewall-cmd --add-service=ftp --permanent
firewall-cmd --reload
如果配置了:
chroot_local_user=YES
那么用户不能拥有家目录的写权限,否则 vsftpd 会拒绝登录或上传。
解决方式:
555755示例:
chmod 555 /home/ftpuser
mkdir /home/ftpuser/upload
chmod 755 /home/ftpuser/upload
✅ write_enable=YES
✅ 目录有写权限
✅ SELinux 已处理
✅ 防火墙放行 PASV 端口
✅ chroot 配置正确
你可以贴出:
vsftpd.conf 配置我可以直接告诉你哪一行配置有问题。