下面我将从原因分析、排查步骤和解决方案三个方面,为你详细解释如何解决这个问题。

核心原因分析
LIST 命令的工作原理是:
- 控制连接:你通过
PASV命令告诉服务器:“我进入被动模式,请告诉我一个数据端口号。” - 服务器响应:服务器返回一个 IP 地址和端口号,
227 Entering Passive Mode (192,168,1,100,12,34),这表示数据连接的地址是168.1.100,端口号是12*256 + 34 = 3138。 - 数据连接:你的客户端需要主动从这个 IP 地址和端口号建立一个新的 TCP 连接,用于传输文件列表。
- 传输数据:连接建立成功后,服务器通过这个数据连接发送文件列表信息。
LIST 命令失败,几乎总是发生在第 3 步,即客户端无法成功建立数据连接,主要原因有以下几类:
| 原因类别 | 具体描述 | 常见场景 |
|---|---|---|
| 网络防火墙 | 客户端防火墙阻止了从随机高端口到服务器指定端口的出站连接。 | Windows Defender、个人防火墙、公司网络策略。 |
| 服务器防火墙 | 服务器防火墙阻止了客户端 IP 地址访问服务器的被动模式端口范围。 | 云服务器(如阿里云、AWS、腾讯云)的安全组未开放端口;Linux 服务器自带的防火墙(如 iptables, firewalld)。 |
| NAT/路由器 | 客户端位于路由器或 NAT 之后,服务器返回的 IP 地址是内网 IP,客户端无法连接。 | 家庭/公司网络,使用 Wi-Fi 路由器。 |
| FTP 服务器配置 | 服务器被动模式端口范围配置错误。 服务器被动模式 IP 地址绑定错误(返回了内网 IP)。 服务器本身进程问题。 |
服务器配置文件(如 vsftpd.conf)设置不当。 |
| 客户端问题 | 客户端软件 Bug 或配置问题。 | 一些旧版 FTP 客户端在处理 PASV 响应时有问题。 |
系统性的排查步骤
请按照以下步骤进行排查,这能帮你快速定位问题。
第 1 步:确认连接模式和错误信息
连接 FTP 服务器后,执行以下命令:

! -- 进入本地 shell netstat -an | grep ESTABLISHED -- Windows lsof -i -P | grep ESTABLISHED -- macOS/Linux exit -- 退出本地 shell
这能确认你的控制连接是正常的(状态为 ESTABLISHED)。
执行 LIST 命令,并仔细观察服务器的返回信息,这比客户端的错误提示更重要。
-
如果服务器返回
425 Can't build data connection: Connection refused:- 这是最常见的错误,它明确表示客户端尝试连接服务器的某个端口时,被拒绝了,这通常是服务器防火墙或客户端防火墙的问题。
-
如果服务器返回
425 Can't open data connection或500 Illegal PORT command:可能是客户端和服务器在模式上不匹配(比如客户端是主动模式,服务器是被动模式,或者反之)。
第 2 步:检查服务器配置(以 vsftpd 为例)
登录到 FTP 服务器,检查其配置。
-
检查被动模式是否开启:
grep "pasv_enable" /etc/vsftpd.conf # 确保输出为 pasv_enable=YES
-
检查被动模式端口范围:
grep "pasv_min_port" /etc/vsftpd.conf grep "pasv_max_port" /etc/vsftpd.conf # 输出可能是 pasv_min_port=10000 和 pasv_max_port=10100
关键:记下这个端口范围,后面要在防火墙上开放它。
-
检查服务器返回的 IP 地址是否正确: 如果你的 FTP 服务器在 NAT 后面(比如云服务器),它默认会返回内网 IP,导致客户端无法连接,你需要让它返回公网 IP。
grep "pasv_address" /etc/vsftpd.conf # 如果没有这行,或者值是内网 IP,你需要添加或修改它 # pasv_address=123.45.67.89 (你的服务器公网 IP)
修改配置后,务必重启 vsftpd 服务:
sudo systemctl restart vsftpd
第 3 步:检查防火墙(客户端和服务器端)
这是最常见的原因,需要逐一排查。
A. 服务器端防火墙(重中之重)
-
云服务器安全组:
- 登录你的云服务器控制台(阿里云、AWS、腾讯云等)。
- 找到“安全组”或“防火墙”规则。
- 添加一条入站规则:
- 端口范围:填入你在
vsftpd.conf中配置的pasv_min_port和pasv_max_port之间的所有端口(10000/10100)。 - 授权对象:根据你的情况选择。
0.0.0/0:允许任何 IP 访问(不安全,仅用于测试)。你的客户端公网IP/32:只允许你的电脑访问(最安全)。
- 端口范围:填入你在
-
Linux 服务器防火墙 (
iptables或firewalld):-
对于
firewalld(CentOS 7+, Fedora, RHEL):# 1. 添加一个端口范围到区域 (public) sudo firewall-cmd --permanent --add-port=10000-10100/tcp # 2. 重新加载防火墙使配置生效 sudo firewall-cmd --reload
-
对于
iptables(传统):# 1. 添加规则 (允许 10000-10100 端口) sudo iptables -A INPUT -p tcp --dport 10000:10100 -j ACCEPT # 2. 保存规则 (根据发行版不同,命令可能不同) # 例如在 CentOS 上: sudo service iptables save
-
B. 客户端防火墙
- 暂时关闭客户端防火墙(仅用于测试):
- Windows: 进入“控制面板” -> “系统和安全” -> “Windows Defender 防火墙” -> “启用或关闭 Windows Defender 防火墙”,暂时关闭。
- macOS: 进入“系统偏好设置” -> “安全性与隐私” -> “防火墙”,暂时关闭。
- 如果关闭后
LIST成功了,那就 100% 是客户端防火墙的问题,你需要为 FTP 客户端程序创建一个“入站规则”,允许其连接。
解决方案总结
根据排查结果,选择对应的解决方案。
| 问题现象 | 解决方案 |
|---|---|
| 服务器防火墙阻止 | 【最常见】 在服务器端(云平台安全组或系统防火墙)开放被动模式端口范围。 |
| 客户端防火墙阻止 | 在客户端防火墙中,为你的 FTP 软件(如 FileZilla, WinSCP)添加入站规则,允许其进行出站连接。 |
| 服务器返回内网 IP | 在 FTP 服务器配置文件(如 vsftpd.conf)中设置 pasv_address 为你的服务器公网 IP,然后重启服务。 |
| NAT/路由器问题 | 在路由器上做端口转发(Port Forwarding),将公网端口(如 21)和被动模式端口范围都转发到 FTP 服务器的内网 IP,这通常比较复杂,且需要公网 IP。 |
| 连接模式不匹配 | 在 FTP 客户端设置中,明确指定使用被动模式 (PASV),绝大多数现代客户端默认就是被动模式。 |
推荐的替代方案:使用 SFTP
FTP 协议设计年代久远,使用明文传输用户名密码,且在 NAT 和防火墙环境下非常脆弱。强烈建议你放弃 FTP,改用 SFTP。
- SFTP (SSH File Transfer Protocol) 运行在 SSH 协议之上。
- 优点:
- 加密传输:所有数据(包括密码)都经过加密,更安全。
- 穿透防火墙:SFTP 只需要一个端口(通常是 22),且是标准的 SSH 端口,几乎所有防火墙都允许,不存在
LIST命令失败这类数据连接问题。 - 易于配置:只需要在服务器上开启 SSH 服务即可,无需额外配置 PASV 端口和防火墙规则。
如何使用 SFTP:
- 客户端:几乎所有现代 FTP 客户端(如 FileZilla, WinSCP, Cyberduck)都支持 SFTP,你只需要在连接时,选择协议为 "SFTP",端口填
22,然后使用你的 SSH 用户名和密码登录即可。 - 服务器端:确保 OpenSSH 服务已安装并运行。
迁移到 SFTP 是一劳永逸解决此类问题的最佳方法。
