一、背景与问题概述
在 VMware ESXi 环境下部署 CentOS7 虚拟机后,我计划搭建 vsftpd 服务实现文件传输,却接连遇到两个核心问题:
- 新建系统用户
leo无法登录 FTP,报错530 Login incorrect - 登录成功后执行
ls命令卡住,无法查看目录文件
本文将完整复现问题排查与解决过程,帮助遇到相同问题的同学少走弯路。
二、前置环境说明
- 虚拟化平台:VMware ESXi
- 操作系统:CentOS7(内核 3.10+)
- FTP 服务:vsftpd 3.0.2
- 问题用户:新建普通用户
leo(shell 为/bin/bash,家目录/home/leo)
三、问题 1:新建用户登录失败(530 Login incorrect)
1. 问题表现
使用leo账号登录 FTP 时,输入密码后直接返回530 Login incorrect,但该账号可正常通过 SSH 登录系统,密码确认无误。
2. 排查过程
(1)基础信息确认
首先确认用户状态:
bash
运行
grep leo /etc/passwd
# 输出:leo:x:1001:1001::/home/leo:/bin/bash
用户 shell 合法、家目录存在,排除账号本身问题。
(2)检查 vsftpd 黑名单
vsftpd 默认通过两个文件限制用户登录:
/etc/vsftpd/ftpusers:永久黑名单,禁止登录/etc/vsftpd/user_list:可配置的允许 / 拒绝列表
执行命令检查:
bash
运行
grep leo /etc/vsftpd/ftpusers
grep leo /etc/vsftpd/user_list
发现leo被写入了ftpusers黑名单。
(3)检查 PAM 认证配置
查看/etc/pam.d/vsftpd,发现关键限制规则:
bash
运行
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
pam_listfile.so:强制读取/etc/vsftpd/ftpusers作为黑名单,只要用户在文件中就拒绝登录pam_shells.so:验证用户 shell 是否在/etc/shells中(本例中/bin/bash合法,无影响)
3. 解决方案
方案 A:清理黑名单(推荐保留规则)
bash
运行
# 从黑名单中删除目标用户
sed -i '/leo/d' /etc/vsftpd/ftpusers
sed -i '/leo/d' /etc/vsftpd/user_list
# 重启vsftpd生效
systemctl restart vsftpd
四、问题 2:登录成功后 ls 命令卡住
1. 问题表现
用户成功登录 FTP(提示230 Login successful),但执行ls后无响应,终端卡住,最终超时断开,同时提示200 PORT command successful. Consider using PASV。
2. 问题根源
FTP 有两种数据传输模式:
- 主动模式(PORT):服务器主动连接客户端随机端口,易被防火墙 / NAT 拦截
- 被动模式(PASV):客户端主动连接服务器指定端口,适配现代网络环境
CentOS7 默认防火墙会拦截主动模式的随机端口,导致数据通道无法建立,ls命令卡住。
3. 解决方案
(1)配置 vsftpd 被动模式
编辑/etc/vsftpd/vsftpd.conf,添加 / 修改以下配置:
ini
# 启用被动模式
pasv_enable=YES
# 被动模式端口范围(自定义,避免与其他服务冲突)
pasv_min_port=40000
pasv_max_port=50000
# 被动模式对外暴露的IP(服务器实际IP)
pasv_address=10.18.18.77
(2)防火墙放行被动模式端口
bash
运行
# 永久放行端口段
firewall-cmd --permanent --add-port=40000-50000/tcp
# 重新加载防火墙规则
firewall-cmd --reload
(3)重启 vsftpd 生效
bash
运行
systemctl restart vsftpd
(4)客户端切换被动模式
在 FTP 客户端中执行:
bash
运行
ftp> passive
Passive mode on.
ftp> ls
此时可正常查看目录文件,不再卡住。
五、总结
核心问题解决清单
表格
| 问题 | 核心原因 | 解决关键 |
|---|---|---|
| 530 登录失败 | 用户在 vsftpd 黑名单 / PAM 规则限制 | 清理黑名单 |
| ls 命令卡住 | 主动模式被防火墙拦截 | 配置被动模式 + 放行指定端口段 |
避坑提醒
- CentOS7 官方源已停止维护,安装依赖前需先替换为国内镜像源(如阿里云)
- 新建用户的 shell 必须在
/etc/shells中,否则会被pam_shells.so拦截 - 被动模式
pasv_address必须与服务器实际 IP 一致,否则被动模式失效