CentOS 上 VSFTP 连接问题的排查与修复
一 快速自检清单
- 确认服务运行:执行systemctl status vsftpd,若未运行则systemctl start vsftpd;必要时设为开机自启。
- 检查监听与端口:确认配置listen=YES,并用netstat -tulpen | grep :21查看是否在21/TCP监听。
- 基础连通性:从客户端测试telnet 服务器IP 21或nc -vz 服务器IP 21,能连上说明网络与端口可达。
- 防火墙放行:使用firewall-cmd --query-service=ftp或firewall-cmd --query-port=21/tcp检查;未放行则执行firewall-cmd --permanent --add-service=ftp与firewall-cmd --reload。
- SELinux 状态:执行getenforce,如为Enforcing需按需调整策略(见下文)。
- 日志定位:查看**/var/log/vsftpd.log**获取具体报错(如 530、500 OOPS 等)。
二 配置与权限关键点
- 核心配置建议(/etc/vsftpd/vsftpd.conf):
- 启用本地用户:local_enable=YES;如需写入:write_enable=YES。
- 匿名访问:建议anonymous_enable=NO。
- 禁锢用户主目录:chroot_local_user=YES;若需可写,添加allow_writeable_chroot=YES(否则登录可能报 500 OOPS)。
- 监听设置:listen=YES;如使用 IPv6 环境,注意listen_ipv6与listen的互斥。
- 用户访问控制:
- 系统级黑名单:/etc/vsftpd/ftpusers(列于其中的用户如 root 将被拒绝)。
- 可选名单:/etc/vsftpd/user_list,其生效与userlist_enable、userlist_deny的组合有关,建议保持默认拒绝策略并仅添加可信用户。
- 目录与权限:确保用户家目录及上传目录对 FTP 进程可访问,常用权限为文件644、目录755,必要时修正属主属组(如 chown ftpuser:ftpuser /data/ftp)。
三 防火墙与 SELinux 设置
- 防火墙(firewalld):
- 放行 FTP 服务:firewall-cmd --permanent --add-service=ftp && firewall-cmd --reload。
- 或放行端口:firewall-cmd --permanent --add-port=21/tcp && firewall-cmd --reload。
- SELinux:
- 出现“500 OOPS: cannot change directory”等目录访问问题时,临时测试可setenforce 0;生产环境建议启用策略:
- 允许本地用户家目录访问:setsebool -P ftp_home_dir on
- 如仍受限,按需放宽:setsebool -P allow_ftpd_full_access on
- 修改后重启服务:systemctl restart vsftpd。
四 被动模式与云服务器端口放行
- 启用被动模式:在 vsftpd.conf 中设置pasv_enable=YES,并限定端口范围,例如:
- pasv_min_port=10060 与 pasv_max_port=10070
- 放行被动端口:在防火墙中开放同一范围(示例):
- firewall-cmd --permanent --add-port=10060-10070/tcp && firewall-cmd --reload
- 云服务器安全组:除系统防火墙外,还需在云平台安全组放行21/TCP与10060-10070/TCP。
五 常见报错对照与处理
| 现象或错误 |
可能原因 |
处理要点 |
| 连接超时/被拒绝 |
服务未启动、21 端口未放行、监听地址错误 |
启动 vsftpd;放行 21/TCP;确认 listen=YES 与监听地址正确 |
| 530 Login incorrect |
用户名/密码错误、用户被拒绝、PAM/配置限制 |
核对凭据;检查 /etc/vsftpd/ftpusers 与 user_list;确认 local_enable=YES |
| 500 OOPS: cannot change directory |
SELinux 限制、目录权限/属主不当 |
执行 setsebool -P ftp_home_dir on;修正目录权限与属主 |
| 553 Could not create file |
目录不可写、SELinux 或权限策略限制 |
确保目录对 FTP 用户可写;必要时调整 SELinux 布尔值 |
| 数据连接建立失败(尤其在云主机) |
未配置/未放行被动端口范围 |
启用 pasv 并放行 pasv_min_port–pasv_max_port 的端口范围 |