ftp能登录但卡在“正在列出目录”是因被动模式数据通道被拦截,需同步配置安全组(50000/50100)、宝塔防火墙(50000:50100)、pure-ftpd的passiveportrange与forcepassiveip(设为公网ip),并重启服务,客户端还需启用被动模式且禁用ipv6。

FTP能登录但卡在“正在列出目录”或报425/Connection timed out,基本就是被动模式没通——不是密码错、不是服务停,是数据通道被拦死了。
确认Pure-FTPd已启用被动端口范围
Pure-FTPd默认不会自动开被动端口段,必须手动配置PassivePortRange,否则客户端发PASV后服务器根本不会返回可用端口。
- 进入宝塔【软件商店】→ 找到已安装的
Pure-FTPd→ 【设置】→ 【配置修改】 - 搜索
PassivePortRange,确保该行未被注释(即前面没有#),格式为PassivePortRange 39000 40000(中间是空格,不是-或/) - 建议避开常见冲突端口,比如改用
50000 50100(101个端口够用,又远离Redis、Node等常用端口) - 改完必须点【重启服务】,仅保存不重启等于白改
ForcePassiveIP必须填公网IP,不能是内网或127.0.0.1
服务器在PASV响应里返回的IP,决定了客户端连哪儿。如果这里写的是192.168.0.1或127.0.0.1,公网客户端连过去必然失败,日志里会反复出现Connection refused by server。
- 在同一配置文件中搜索
ForcePassiveIP,去掉行首#,等号后填你服务器真实的公网IP(例如8.8.8.8) - 别填本地IP、NAT内网IP、云厂商分配的私有IP(如
172.18.13.228) - 验证是否生效:用
ftp -v your_ip登录后手动输入PASV,看返回的227 Entering Passive Mode括号里前4个数字是不是你填的那个公网IP
三层防火墙必须同步放行被动端口段
只开21端口完全不够。被动模式下,控制连接走21,数据连接走PassivePortRange里的某个随机端口(比如50042),这个端口每次都不一样,必须整段放开。
- 宝塔【安全】→ 【防火墙】→ 【放行端口】:输入
21和50000:50100(注意是英文冒号,不是短横或斜杠) - 云平台安全组(阿里云/腾讯云):添加入方向规则,协议TCP,端口范围填
50000/50100(注意是斜杠,不是冒号) - 系统防火墙(如firewalld):
firewall-cmd --permanent --add-port=50000-50100/tcp && firewall-cmd --reload - 若用
iptables:iptables -I INPUT -p tcp --dport 50000:50100 -j ACCEPT,再保存规则
客户端要强制用被动模式且禁用IPv6
FileZilla等工具默认可能尝试IPv6或“自动模式”,而Pure-FTPd通常只监听IPv4,协议不匹配直接握手失败,表现就是连接超时或卡在LIST阶段。
- FileZilla → 【站点管理器】→ 编辑目标站点 → 【高级】→ 勾选“强制使用被动模式”
- 同一页面取消勾选“尝试使用 IPv6 地址”
- 上传大文件或多线程时,别盲目开高线程数——每个线程独占一个被动端口,
50000:50100总共才101个,线程×连接数超过这个数就会排队或失败 - 临时排查可用
FlashFXP测试,它对被动模式兼容性更稳
最容易被跳过的动作是:改了ForcePassiveIP却没验证PASV响应里的IP是否真变了;或者安全组写了50000-50100但云平台要求/分隔,结果规则根本没生效。每改一处,都得对应验证一层——配置、防火墙、客户端,缺一不可。











