在 Ubuntu 上使用 vsftpd(Very Secure FTP Daemon)时“无法上传”是一个常见问题,通常不是单一原因,而是权限、配置、用户类型、目录属性或防火墙/SELinux等多因素叠加。下面按最常见原因 → 排查步骤 → 解决方案给你系统说明。
vsftpd 默认禁止上传,必须显式开启。
关键配置项:
write_enable=YES
如果这一项是 NO 或被注释掉 → 任何用户都无法上传。
✅ 正确配置:
write_enable=YES
修改后重启:
sudo systemctl restart vsftpd
很多人以为能登录就能上传,其实:
| 用户类型 | 默认能否上传 |
|---|---|
| anonymous | ❌ 默认不能 |
| local user | ✅ 可(需配置) |
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
write_enable=YES
并且目录权限:
sudo chown ftp:ftp /srv/ftp/upload
sudo chmod 777 /srv/ftp/upload
⚠️ 生产环境不建议匿名上传
即使 vsftpd 允许上传,Linux 文件系统权限仍然会拦住你。
例如:
ls -ld /home/ftpuser/upload
如果看到:
drwxr-xr-x ftpuser ftpuser
→ 其他用户没写权限,FTP 上传会失败。
✅ 正确做法:
sudo chown ftpuser:ftpuser /home/ftpuser/upload
sudo chmod 755 /home/ftpuser/upload
如果是多用户共享目录:
sudo chmod 775 /path/upload
常见配置:
chroot_local_user=YES
⚠️ 在 Ubuntu 新版本中:
❌ 错误:
/home/ftpuser (可写)
✅ 正确:
/home/ftpuser (755)
/home/ftpuser/upload (777 或属主可写)
否则会报:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
解决方式(二选一):
allow_writeable_chroot=YES
或保持根目录不可写。
如果你能登录但不能上传/列出目录,大概率是 PASV 端口被防火墙挡。
vsftpd 配置:
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000
防火墙:
sudo ufw allow 40000:50000/tcp
云服务器还要在安全组放行这些端口。
Ubuntu 默认启用 AppArmor,可能限制 vsftpd 访问某些目录。
查看:
sudo aa-status | grep ftp
如果受限,可临时测试:
sudo systemctl stop apparmor
⚠️ 不建议长期关闭,应改 profile。
✅ 建议:
# 1. 是否允许写
grep write_enable /etc/vsftpd.conf
# 2. 是否能登录的用户类型
grep -E "anonymous|local" /etc/vsftpd.conf
# 3. 目录权限
ls -ld /path/to/upload
# 4. 服务状态
systemctl status vsftpd
# 5. 防火墙
sudo ufw status
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000
目录:
sudo mkdir -p /home/ftpuser/upload
sudo chown ftpuser:ftpuser /home/ftpuser/upload
你可以直接贴:
/etc/vsftpd.conf我可以精准定位是哪一条配置导致无法上传。