vsftpd外网连接失败的主因是被动模式配置不当:必须显式设置pasv_min_port/pasv_max_port端口范围、pasv_address为公网IP,并在防火墙/安全组同步放行该端口段,否则仅控制通道(21端口)可达而数据通道被阻断。

vsftpd 是 Linux 下最常用、也相对安全的 FTP 服务实现。直接上结论:**别用匿名模式,优先配本地用户 + chroot + 被动模式,否则外网连不上、上传失败、目录越权全是常态**。
为什么 vsftpd 启动后连不上?端口和模式没对上
默认安装后 vsftpd 监听 21 端口,但数据连接依赖模式选择:
- 主动模式下,客户端需开放随机高位端口接收服务器从
20发起的连接——这在绝大多数家用/办公路由器和防火墙下直接被拦 - 被动模式更实用,但必须显式配置端口范围,并在防火墙放行:
pasv_min_port和pasv_max_port(比如设为50000–50100) -
pasv_address必须填你对外暴露的公网 IP 或 NAT 映射后的内网 IP;若用云服务器,这里填实例的**弹性公网 IP**,不是内网地址 - 检查是否监听 IPv4:
listen=YES(IPv6 环境要额外开listen_ipv6=NO,否则可能 bind 失败)
用户一登录就报 “500 OOPS: cannot change directory”?chroot 权限没过审
启用 chroot_local_user=YES 后,vsftpd 会把用户锁进其 home 目录,但有个硬性要求:chroot 目标目录不能有写权限(出于安全限制)。
- 常见错误:直接把
/home/ftpuser设为local_root,又给它chmod 755—— 这会导致启动失败或登录报错 - 正确做法:建子目录
/home/ftpuser/ftp,chown ftpuser:ftpuser /home/ftpuser/ftp,再chmod 700 /home/ftpuser/ftp - 如果非要锁到
/home/ftpuser,就得加allow_writeable_chroot=YES—— 但这是妥协方案,仅限测试环境,生产环境不推荐 -
user_sub_token=$USER和local_root=/home/$USER/ftp配合使用,才能让多用户各自进入自己的ftp子目录
能连上但无法上传?write_enable 和 umask 没配对
write_enable=YES 是开关,但上传后文件权限不对、目录不可写,往往卡在 local_umask 或目录所有权上。
-
write_enable=YES必须存在,且不能被注释 -
local_umask=022表示上传文件默认权限是644(即-rw-r--r--),目录是755;若希望用户上传后自己可删改,建议用local_umask=002(文件664,目录775) - 确保目标目录(如
/home/ftpuser/ftp)归属是该用户:chown ftpuser:ftpuser /home/ftpuser/ftp,不能是root或其他组 - 如果用了
userlist_enable=YES,务必确认user_list文件里没把该用户写进去——否则直接拒绝登录,连错误提示都不给
防火墙和服务状态怎么查?别只看 systemctl start
systemctl start vsftpd 成功不代表服务真在跑,得验证三层:
- 进程层:
ps aux | grep vsftpd看有没有主进程,没有说明配置语法错或权限不足 - 端口层:
sudo ss -tlnp | grep :21(或netstat -tlnp | grep :21),确认vsftpd正在监听21,且没被其他服务(如另一个 vsftpd 实例)占着 - 网络层:云服务器必须在安全组放行
21和被动端口段(如50000-50100);物理机/虚拟机还要检查本地防火墙:sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS/RHEL)
最容易被忽略的是:被动模式端口范围在配置里写了,但没同步更新防火墙规则——连得上命令通道,传不了文件,就是这个原因。


















