ftp连接成功但目录为空是因被动模式端口未放行,需在宝塔中固定pure-ftpd被动端口范围(如30000–30009),并在云服务器安全组、宝塔防火墙及系统防火墙中同步放行该端口段,最后用ftp命令验证pasv返回端口是否在指定范围内。

FTP连接成功但提示“550 Failed to change directory”或空白目录
这是被动模式(PASV)端口未放行的典型表现。宝塔面板默认启用Pure-FTPd,它在被动模式下会随机分配高位端口(如 30000–30100),而云服务器安全组和防火墙通常只开了 21 端口,导致LIST、RETR等命令被拦截。
解决的关键不是改主动模式(Active),而是让被动端口可控且可放行:
- 登录宝塔面板 → 左侧「软件商店」→ 找到已安装的
Pure-FTPd→ 点击「设置」→「配置修改」 - 找到
PureFTPd配置文件中类似PassivePortRange的行,改为固定范围,例如:PassivePortRange 30000 30009
(只开10个端口,够用且最小化暴露) - 保存后重启
Pure-FTPd:在宝塔界面点「重启」,或执行bt restart
阿里云/腾讯云安全组必须放行被动端口段
仅改FTP配置没用——云厂商的安全组是第一道拦路虎。很多用户只放了 21,却漏掉 30000–30009 这类自定义被动端口。
操作路径(以阿里云为例):
- 进入「云服务器ECS」控制台 → 左侧「网络与安全」→「安全组」
- 找到对应实例绑定的安全组 → 点击「配置规则」→「添加安全组规则」
- 协议类型选
TCP,端口范围填30000/30009(注意是斜杠,不是短横),授权对象建议填0.0.0.0/0(FTP客户端IP不固定) - 确认添加后,等待1–2分钟生效
腾讯云同理,端口范围填 30000-30009(用短横),协议选 TCP。
宝塔内置防火墙也要同步放行被动端口
即使云平台放行了,宝塔自带的防火墙(基于iptables)仍可能拦截。很多人只改了安全组,忘了这一步。
在宝塔面板中操作:
- 左侧「安全」→「防火墙」→「放行端口」
- 输入
30000-30009→ 点击「放行」 - 检查下方列表是否已显示该端口段,状态为「已放行」
如果用的是CentOS 7+且启用了firewalld(非宝塔默认),还需额外执行:
firewall-cmd --permanent --add-port=30000-30009/tcp<br>firewall-cmd --reload
验证被动模式是否真正生效
改完所有配置后,别急着用FileZilla连——先用命令行确认FTP服务返回的PASV地址和端口是否符合预期。
执行以下命令(替换为你的服务器IP):
ftp -p your-server-ip<br>user your-ftp-username<br>your-ftp-password<br>quote pasv
观察返回信息,应看到类似:
227 Entering Passive Mode (10,0,0,1,117,45)其中
117,45 表示端口号 117×256 + 45 = 30009,落在你设定的 30000–30009 范围内才算成功。
如果返回的端口仍是随机高位(如 241,187 → 61723),说明配置没生效或服务未重启,回退检查 PureFTPd 配置文件路径和语法(常见错误:行首多了空格、没取消注释、写错关键字大小写)。










