FTP连接能登录但无法列目录或传输文件,大概率是数据通道被阻断;需区分主动/被动模式:主动模式依赖服务器20端口连客户端高端口,被动模式则需放行服务器配置的高编号端口段(如30000–40000),并同步开放防火墙、云安全组及SELinux策略。

FTP连接失败,尤其是能登录但无法列目录(ls)或传输文件,大概率是数据通道被阻断——这背后就是主动/被动端口没通。Linux环境下排查,关键不是只看21端口,而是要分清控制通道和数据通道,再逐层验证。
确认FTP当前运行模式与端口行为
先搞清你用的是主动还是被动模式,因为两者对端口的要求完全不同:
- 主动模式:控制连接走21端口,数据连接由服务器从20端口发起,连向客户端的随机高端口(如54322)。此时问题常出在客户端防火墙拦截入站连接,服务器侧只需确保21、20端口开放即可。
- 被动模式(更常见):控制连接仍走21端口,但数据连接由客户端主动连向服务器的高编号端口段(如30000–40000)。此时必须确保:Pure-FTPd 或 vsftpd 配置了 PassivePortRange、系统防火墙放行该端口段、云平台安全组也同步放行。
检查服务端是否监听预期端口
登录服务器终端,执行以下命令验证实际监听状态:
- 查控制端口:
netstat -tuln | grep :21—— 必须看到*:21或0.0.0.0:21 - 查数据端口(被动模式):
netstat -tuln | grep -E ':3[0-9]{4}'(例如查30000–39999)—— 若无输出,说明服务未按配置监听被动端口 - 查主动模式数据端口:
netstat -tuln | grep :20—— 多数现代FTP服务已不监听20端口,除非明确启用主动模式且配置了port_enable=YES
验证防火墙与安全组是否真正放行
即使配置写了端口范围,也不代表流量能通过。需三重确认:
-
系统防火墙:运行
firewall-cmd --list-ports(firewalld)或iptables -L INPUT -n | grep 'dpt:'(iptables),确认含21/tcp和30000-40000/tcp等条目 -
云安全组:登录阿里云/腾讯云控制台,在对应实例的安全组规则中,手动检查入方向是否添加了
30000/40000的TCP端口段(不能只靠“放通FTP服务”这种模糊规则) -
SELinux(若启用):
sestatus查状态,临时关闭测试:setenforce 0;若恢复后正常,则需调整策略:setsebool -P ftpd_full_access on
用telnet和抓包定位具体卡点
不要只依赖FileZilla提示,用底层工具缩小范围:
- 测控制连接:
telnet your-server-ip 21—— 应返回类似220 Pure-FTPd欢迎信息 - 测被动端口(需先登录并触发PASV):
ftp -p your-server-ip→ 输入账号密码 → 执行passive→ 再执行ls,观察报错;同时另开终端,用tcpdump -i any port 35000(替换为你配的端口)看是否有SYN包到达 - 若
telnet通但ls卡住,且抓包显示客户端发了SYN但无SYN-ACK响应,基本可断定是防火墙或安全组拦截了被动端口


















