Ubuntu 下 vsftpd 故障排查清单
一 快速定位流程
sudo systemctl status vsftpd、sudo systemctl restart vsftpd、ss -tulnp | grep :21。若端口被占用,先定位并释放占用进程。anonymous_enable、local_enable、write_enable、chroot_local_user 等),每次修改后执行 sudo systemctl restart vsftpd 使配置生效。sudo journalctl -u vsftpd -f,若配置了日志文件,也可 tail -f /var/log/vsftpd.log,从报错关键词(如 530、500 OOPS)入手定位。sudo ufw allow 21/tcp、sudo ufw allow 40000:50000/tcp;如使用 firewalld:sudo firewall-cmd --permanent --add-service=ftp && sudo firewall-cmd --reload。vsftpd.conf 中设置 pasv_enable=YES、pasv_min_port=60000、pasv_max_port=61000,并确保防火墙/云安全组同步放行该范围。二 常见错误与修复对照表
| 症状 | 高频原因 | 快速修复 |
|---|---|---|
| 连接超时/被拒绝 | vsftpd 未运行或 21 端口未放行 | sudo systemctl start vsftpd;放行 21/TCP(ufw/firewalld);检查云安全组 |
| 530 Login incorrect | 密码错误、用户被禁止、PAM 配置不当、pam_service_name 不匹配 |
重置密码;检查 /etc/vsftpd/ftpusers 黑名单与 /etc/vsftpd.user_list 白名单逻辑;Ubuntu 常见为 pam_service_name=ftp |
| 500 OOPS: refusing to run with writable anonymous root | 匿名根目录可写 | 将匿名根目录属主设为 root:root 并权限 755:chown root:root /var/ftp && chmod 755 /var/ftp |
| 能登录但无法上传 | write_enable=NO 或目录无写权限/磁盘满 |
在 vsftpd.conf 设置 write_enable=YES;修正目录属主与权限;df -h 检查磁盘 |
| 被动模式数据连接失败 | 未放行被动端口范围或路由器未做端口映射 | 在 vsftpd.conf 设置 pasv_min_port/pasv_max_port 并放行;NAT/路由器做端口转发 |
| 登录很慢或验证异常 | DNS 反向解析导致延迟 | 在 vsftpd.conf 加入 reverse_lookup_enable=NO |
说明:PAM 与黑白名单文件是 530 的高发点;Ubuntu 下常见将 pam_service_name 设为 ftp;被动模式必须同时解决服务端防火墙与网络边界转发。
三 关键配置与命令示例
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
pam_service_name=ftp
pasv_enable=YES
pasv_min_port=60000
pasv_max_port=61000
修改后执行:sudo systemctl restart vsftpd。sudo systemctl start|stop|restart|enable vsftpdsudo systemctl status vsftpdsudo journalctl -u vsftpd -fss -tulnp | grep :21 或 netstat -tulnp | grep :21sudo ufw allow 21/tcp;sudo ufw allow 60000:61000/tcpsudo firewall-cmd --permanent --add-service=ftp && sudo firewall-cmd --reload四 被动模式与云环境要点
vsftpd.conf 明确开启被动模式并指定端口范围(如 60000–61000),随后在 ufw/firewalld 以及云服务器安全组放行相同范围,否则数据通道会被阻断。pasv_address)。五 仍无法解决时的高效求助信息
vsftpd -vsudo systemctl status vsftpd -l、sudo journalctl -u vsftpd -n 100grep -v '^#' /etc/vsftpd.conf | grep -v '^$'