Linux 上 FTPServer 故障排查实战手册
一 快速定位流程
systemctl status vsftpd 查看运行状态与最近报错;若未运行,执行:systemctl start vsftpd 并 systemctl enable vsftpd 设置开机自启。anonymous_enable=NO、chroot_local_user=YES、pasv_enable=YES、pasv_min_port=40000、pasv_max_port=50000。修改后执行:systemctl restart vsftpd 使配置生效。tail -f /var/log/securetail -f /var/log/xferlogtail -f /var/log/vsftpd.logping 与 traceroute 排查网络路径。ss -lntp | grep ':21\|:990',确认 21(命令端口)与 990(FTPS 控制端口)未被占用;被动模式还需确认 40000–50000 范围未被占用且已放行。二 常见故障对照表
| 症状 | 高频原因 | 快速验证 | 修复建议 |
|---|---|---|---|
| 530 Login incorrect | 用户名/密码错误;PAM 配置异常;用户家目录不可访问 | 查看 /var/log/secure 的 PAM 报错;尝试本地登录 |
核对凭据;检查 /etc/pam.d/vsftpd;确保用户家目录存在且权限正确 |
| 500 Illegal PORT command | 主动模式被防火墙/NAT 阻断;客户端 IP 与服务器看到的不一致 | 客户端改用被动模式;抓包或日志观察 PORT 命令 | 启用被动模式并设置 pasv_min_port/pasv_max_port,在防火墙放行该端口段 |
| 无法打开远程文件夹 | 被动模式端口未放行;客户端在 NAT 后未正确解析服务器公网 IP | 客户端切换主动/被动对比;查看服务器返回被动 IP | 在 vsftpd.conf 设置 pasv_address=服务器公网IP;放行被动端口段 |
| 550 Permission denied | 目录权限/所有权错误;chroot 后根目录不可写 | ls -ld 检查目录;查看 secure 权限拒绝日志 |
调整目录属主属组与权限(如文件 644、目录 755),必要时放宽 chroot 目录写权限 |
| 连接超时/被拒绝 | 防火墙未放行 21/990 或被动端口段;服务未启动 | ss -lntp 检查端口;firewall-cmd --list-ports 或 iptables -L -n |
放行 21/990 与被动端口段;确保服务已启动并开机自启 |
三 防火墙与 SELinux 设置
firewall-cmd --zone=public --add-port=21/tcp --permanent、firewall-cmd --zone=public --add-port=990/tcp --permanent、firewall-cmd --zone=public --add-port=40000-50000/tcp --permanent,随后 firewall-cmd --reload。iptables -A INPUT -p tcp --dport 21 -j ACCEPT、iptables -A INPUT -p tcp --dport 990 -j ACCEPT、iptables -A INPUT -p tcp --dport 40000:50000 -j ACCEPT,按需保存与重启防火墙服务。setenforce 0(仅测试用途)。setsebool -P ftp_home_dir 1(允许访问用户家目录);若自定义目录,使用 semanage fcontext 与 restorecon 设置正确的文件上下文后恢复。四 被动模式与 FTPS 配置要点
pasv_enable=YES、pasv_min_port=40000、pasv_max_port=50000,并在防火墙放行该范围;客户端与服务器之间任何 NAT/云安全组 也需放通。pasv_address=服务器公网IP,避免客户端收到内网地址导致数据通道失败。xferlog_enable=YES、xferlog_file=/var/log/xferlog、dual_log_enable=YES、vsftpd_log_file=/var/log/vsftpd.log,便于定位登录与传输问题。五 一键健康检查清单
systemctl is-active vsftpd 应为 active;systemctl is-enabled vsftpd 应为 enabled。ss -lntp | egrep ':(21|990|40000-50000)' 能看到监听。firewall-cmd --list-ports 或 iptables -L -n 包含 21/tcp、990/tcp、40000-50000/tcp。getsebool ftp_home_dir 应为 on;自定义目录上下文正确。tail -n50 /var/log/secure /var/log/xferlog 无近期致命错误。df -h 确认可用空间充足,避免因磁盘满导致写入失败。