FTP连接失败首要排查被动模式(PASV):宝塔Pure-FTPd默认forcepassiveip为内网IP,须改为公网IP并取消注释;被动端口段(如39000–40000)需在宝塔防火墙、云厂商安全组及系统防火墙三处同步放行;同时确认pure-ftpd监听*:21而非127.0.0.1:21,并使用FileZilla等专业客户端启用被动模式。

FTP连接失败时先确认是否卡在被动模式(PASV)
绝大多数宝塔面板 FTP 连接失败,根本原因不是账号密码错,而是客户端发起了 PASV 请求后,服务器返回了一个内网 IP + 高端口(比如 39821),客户端连不上这个地址。这在云服务器上几乎必现。
关键判断点:用 FileZilla 连接时,日志里出现类似这样的行:Entering Passive Mode (192,168,0,100,154,181) —— 括号里是内网 IP,说明服务器没告诉客户端该连哪个公网 IP。
- 宝塔默认的 Pure-FTPd 配置中,
forcepassiveip被注释且值为内网地址(如#forcepassiveip 192.168.0.1) - 必须取消注释,并改成你服务器的**公网 IP**(不是本地局域网 IP,也不是
127.0.0.1) - 修改位置通常在配置文件第 188 行左右,路径是
/www/server/pure-ftpd/etc/pure-ftpd.conf - 改完必须执行
bt restart ftp或在面板「软件管理」里重启 FTP 服务,否则不生效
被动端口范围(39000–40000)必须在多层防火墙同时放行
即使 forcepassiveip 设对了,如果端口不通,还是连不上。这里要过三道关:
- 宝塔自带防火墙:进「安全」页面,手动添加端口范围
39000/40000(注意用/不是-) - 云厂商安全组(阿里云/腾讯云/百度云等):同样添加规则,协议选 TCP,端口填
39000/40000,源地址建议限制为0.0.0.0/0仅调试期,上线后收紧 - 服务器系统防火墙(如 firewalld):运行
firewall-cmd --permanent --add-port=39000-40000/tcp后再firewall-cmd --reload - 别只开
21端口——它只管登录握手,数据传输走的是被动端口段
检查 FTP 服务状态与端口监听是否真实生效
有时候面板显示“FTP 已启动”,但实际进程没跑或监听错了地址。直接命令行验证最可靠:
- 查服务状态:
systemctl status pure-ftpd,看是否 active (running) - 查端口监听:
netstat -tlnp | grep :21,确认有pure-ftpd在监听*:21(不是127.0.0.1:21) - 查被动端口是否被监听:
lsof -i :39000-40000,正常应无输出(Pure-FTPd 是按需开启临时端口,不常驻监听) - 如果
netstat显示监听的是127.0.0.1:21,说明配置里可能误设了Bind或IPv4Only,需检查pure-ftpd.conf中这两项是否被注释或设为no
客户端侧容易忽略的兼容性细节
有些 FTP 客户端(尤其是 Windows 自带资源管理器、VS2019 发布模块)对 PASV 支持弱,或强制走主动模式(PORT),而宝塔默认禁用 PORT 模式以保安全。
- FileZilla / FlashFXP 推荐勾选「强制使用被动模式」,并关闭「尝试使用 IPv6 地址」(避免 DNS 解析出 IPv6 导致失败)
- Windows 资源管理器访问
ftp://user:pass@ip:port会失败,因为不支持自定义端口+被动模式组合,换专业客户端 - VS2019 提示
the components for communicating with ftp servers are not installed是系统缺失 FTP 协议栈,不是宝塔问题,需重装 IIS 的 FTP 扩展或改用命令行发布 - 测试连通性最简单方式:
ftp -p ip port(-p强制被动),输入账号密码后能进就说明服务层 OK
真正卡住的地方往往不是某一个配置,而是 forcepassiveip、安全组、客户端模式三者没对齐。调的时候建议每次只动一项,改完立刻验证,不然容易互相掩盖问题。


















