FTP连接失败主因是被动模式端口未放行:需确认Pure-FTPd的PassivePortRange配置生效(如39000 40000)、云安全组设为39000/40000、宝塔防火墙设为39000:40000、ForcePassiveIP设为公网IP并重启服务,同时开放系统防火墙对应端口段。

FTP连不上,99%不是密码错,而是21端口能通、数据通道被拦死——被动模式端口范围根本没放行。
查 Pure-FTPd 的 PassivePortRange 配置是否生效
宝塔默认用 Pure-FTPd,它不自动开被动端口,得手动填。配置文件里 PassivePortRange 一行若被注释(开头有 #)或值为空,就等于没配。
- 进宝塔 → 软件管理 → Pure-Ftpd → 设置 → 配置修改
- Ctrl+F 搜
PassivePortRange,确认这行是PassivePortRange 39000 40000这种格式(中间空格,不能是短横或冒号) - 改完必须点“重启服务”,只点“保存”不生效
- 常见坑:有人写成
39000-40000或39000:40000,Pure-FTPd 会直接忽略整行
云安全组和宝塔防火墙端口写法不统一
云平台(阿里云/腾讯云)和宝塔面板对端口范围的写法完全不同,混用就白配。
- 云安全组里必须用斜杠:
39000/40000(不是短横,不是冒号) - 宝塔防火墙里必须用英文冒号:
39000:40000(输成短横会被当单个端口处理) - 两者都得单独加规则:一条给
21,一条给被动端口段,缺一不可 - 改完安全组别忘了点“应用”或“立即生效”,部分平台要手动触发
ForcePassiveIP 指向内网地址导致客户端连错IP
Pure-FTPd 在 PASV 响应里会返回一个 IP 地址供客户端连数据端口。如果这 IP 是 127.0.0.1 或 192.168.x.x,客户端根本连不上公网服务器。
- 在同一个配置页搜
ForcePassiveIP - 删掉行首的
#,把等号后改成你服务器真实的公网 IP(不是域名,不是内网地址) - 改完再重启 Pure-FTPd,否则日志里会出现
EPRT failed或Connection refused by server - 验证方法:用 FileZilla 连上后看日志窗口,PASV 响应里的 IP 是否是你填的那个公网 IP
系统级防火墙(ufw/firewalld)漏放被动端口段
即使云安全组和宝塔防火墙都开了,Linux 自带的防火墙仍可能拦截。尤其 Ubuntu 默认开 ufw,CentOS 7+ 默认开 firewalld。
- Ubuntu 执行:
sudo ufw allow 39000:40000/tcp - CentOS 执行:
sudo firewall-cmd --permanent --add-port=39000-40000/tcp && sudo firewall-cmd --reload - 别信“已放行 FTP 服务”这种快捷选项——它只开 20–21,不开被动端口段
- 执行
sudo ufw status numbered或firewall-cmd --list-ports确认端口段真出现在列表里
最常被跳过的动作是:改完 ForcePassiveIP 不重启服务,或在云安全组写了 39000-40000 却没改成 39000/40000。这两处一错,FTP 就卡在登录后无法列目录,错误码通常是 425 Can't open data connection 或直接超时。











