vsftpd连不上大概率是防火墙或SELinux拦截:需配置firewalld放行ftp服务及被动端口,启用ftp_home_dir布尔值;chroot用户需配合allow_writeable_chroot=YES;登录失败530常因user_list拦截、shell不在/etc/shells或家目录权限过松。

vsftpd 安装后连不上,大概率是防火墙或 SELinux 挡的
装完 vsftpd 服务启动了,systemctl status vsftpd 显示 active,但本地 ftp localhost 或外网连不上——别急着改配置文件,先看这两处。
- CentOS/RHEL 8+ 默认用
firewalld,得放行 FTP 端口:sudo firewall-cmd --permanent --add-service=ftp,再sudo firewall-cmd --reload - SELinux 开启时,
vsftpd默认不能访问用户家目录(哪怕权限全开),运行sudo setsebool -P ftp_home_dir on才能读写 - 如果开了被动模式(PASV),还得额外放行被动端口段(比如
pasv_min_port=60000到pasv_max_port=60100),并在防火墙里加--add-port=60000-60100/tcp
/etc/vsftpd.conf 关键配置项怎么设才不踩坑
默认配置极保守,多数场景要动这几项,但顺序和值稍错就直接拒绝登录。
-
anonymous_enable=NO—— 不想让游客进,必须关掉;设成YES却没配anon_root,会报500 OOPS: could not bind listening address -
local_enable=YES和write_enable=YES要同时开,否则本地用户能登录但无法上传/删文件 -
chroot_local_user=YES锁定用户到家目录,但必须配合allow_writeable_chroot=YES(否则登录即断,错误是500 OOPS: vsftpd: refusing to run with writable root inside chroot()) - 如果用非标准端口(比如 2121),除了改
listen_port=2121,客户端连接时也得显式指定端口:ftp -p 2121 example.com
用户登录失败:530 Permission denied 的真实原因
这个错误看着像密码错,其实常跟系统账户状态或 vsftpd 权限控制有关。
- 检查用户是否被
/etc/vsftpd.user_list或/etc/vsftpd.ftpusers拦截了——后者默认包含root、bin等系统用户,普通账号加进去也会被拒 - 用户 shell 必须在
/etc/shells里,否则 vsftpd 认为“不是合法登录用户”,哪怕密码对也返回 530。临时解决:把/bin/bash加进/etc/shells,或创建用户时指定useradd -s /bin/bash username - 家目录权限太松(比如 777)且开了
chroot_local_user,vsftpd 会主动拒绝——必须确保家目录属主是该用户,且组和其他人不可写(chmod 755 ~username)
FTP 被动模式连不上,其实是 vsftpd 不知道公网 IP
内网部署 vsftpd 后,外网客户端进不去目录列表,卡在 PASV 响应,根本原因是 vsftpd 返回了内网 IP 给客户端。
- 加这两行进
/etc/vsftpd.conf:pasv_address=你的公网IP(不是0.0.0.0)、pasv_addr_resolve=NO - 如果服务器在云厂商(如阿里云、腾讯云),安全组必须放行 PASV 端口段(不只是 21),且负载均衡/ NAT 网关得做对应端口映射
- 测试是否生效:用
ftp登录后执行ls,抓包看PASV命令返回的 IP 是不是你填的公网 IP;不是的话,配置没加载或服务没重载
最常漏的是 SELinux 布尔值和 allow_writeable_chroot 这种反直觉开关,改完配置一定 sudo systemctl restart vsftpd,别只 reload。










