必须配置三项:pasv_enable=yes启用被动模式,pasv_min_port和pasv_max_port指定连续端口范围(如50000–50100),云/nat环境还须设置pasv_address=公网ip,否则客户端无法连接数据端口。

vsftpd.conf 里必须设哪几个参数
只开 pasv_enable=YES 不够,客户端连上控制通道(21端口)后仍会卡在 LIST 或 RETR 操作——因为服务端没告诉它用哪个端口传数据。必须配齐三项:
-
pasv_enable=YES:开关,不设就是主动模式 -
pasv_min_port和pasv_max_port:必须指定连续端口范围,比如pasv_min_port=50000、pasv_max_port=50100 -
pasv_address(云服务器/公网NAT环境必填):填你的公网IP,否则 vsftpd 返回的227响应里带的是内网地址,客户端根本连不上
注意:pasv_min_port 别设太低(比如 1024),避免和系统其他服务冲突;也别设太高(比如 65535),部分客户端或中间设备会拒绝高位端口。
防火墙要放行哪些端口
只开 21 端口没用——被动模式下,数据通道走的是你指定的 pasv_min_port~pasv_max_port 范围,不是 21。常见错误是只放行了 21,结果客户端能登录但列不出目录。
- UFW:运行
sudo ufw allow 50000:50100/tcp(端口范围要和配置文件一致) - iptables:运行
sudo iptables -A INPUT -p tcp --dport 50000:50100 -j ACCEPT - 云服务器(阿里云/腾讯云/AWS):安全组里额外加一条入方向规则,协议 TCP,端口范围填你设的那串数字,源 IP 可设为
0.0.0.0/0或限定客户端段
验证是否生效:重启 vsftpd 后,执行 sudo ss -tuln | grep :5000[0-9],应能看到 vsftpd 监听这些端口。
为什么 FileZilla 提示 “Failed to retrieve directory listing”
这不是 FTP 客户端问题,而是服务端返回的 227 响应里地址不可达。典型现象是日志里有 FTP response: 227 Entering Passive Mode (10,0,0,10,195,68) —— 这个 10.0.0.10 是内网地址,外网客户端没法连。
- 查证方法:用 telnet 连 21 端口,手动发
PASV,看返回的括号里 IP 是不是你期望的公网 IP - 解决办法:在
/etc/vsftpd.conf加pasv_address=203.0.113.45(换成你真实的公网 IP) - 如果服务器在 NAT 后且无固定公网 IP,得用 DDNS 或反向代理,vsftpd 本身不支持自动获取公网 IP
别信“重启就灵”,不填 pasv_address 的云主机基本没法用被动模式对外提供服务。
SELinux 或 systemd socket 激活导致端口监听失败
CentOS/RHEL 系统上,即使配置全对、防火墙也开了,ss -tuln 仍看不到 vsftpd 监听被动端口——大概率是 SELinux 或 systemd 拦住了。
- 临时关 SELinux 测试:
sudo setenforce 0,如果这时端口出现了,说明需要加策略:sudo setsebool -P ftpd_full_access on - 检查是否用了 socket 激活:
systemctl cat vsftpd.socket,如果存在且启用,vsftpd 会按需启动但可能不监听被动端口,建议禁用:sudo systemctl disable vsftpd.socket,改用vsftpd.service - 确认监听状态:
sudo systemctl status vsftpd,看输出里有没有 “Started vsftpd FTP daemon” 和 “listening on port” 类提示
vsftpd 的被动端口监听行为依赖于进程是否真正跑起来,而不是“服务显示 active”就代表一切正常。











