出现FTP连接不上的原因通常分为三类:服务端未启动或配置错误、云端网络策略(安全组/ACL)阻挡、以及客户端与网络NAT/防火墙不兼容导致的被动/主动模式冲突。
首先检查服务器上FTP服务是否运行(如vsftpd、proftpd、pure-ftpd),确认监听端口(通常为21)。
其次在阿里云控制台确认安全组规则是否开放了21端口以及被动模式所需的端口范围;同时注意云厂商的外网IP与实例内网IP可能不同,PASV模式需要使用公网IP或域名配置。
1)在服务器上执行:systemctl status vsftpd或相关服务查看状态。
2)使用命令检查端口:ss -tnlp | grep :21或netstat -tnlp | grep :21。
3)登录阿里云控制台,找到实例对应的安全组,确认已添加出入规则:TCP 21 和被动端口范围(如60000-60100)。
查看/var/log/messages、/var/log/vsftpd.log或/var/log/secure,常见错误如“Connection timed out”、“Connection refused”、“Failed to retrieve directory listing”等分别提示网络不可达、服务未起或被动数据连接失败。
telnet 公网IP 21;nmap -sS -p21,60000-60010 公网IP;tcpdump -i eth0 port 21。
被动模式(PASV):客户端主动向服务器的控制端口(21)建立连接并向服务器发送PASV命令,服务器返回一个数据端口,客户端再连接该数据端口完成数据传输。适合客户端在防火墙/NAT后面的场景。
主动模式(PORT):客户端在本地打开一个随机端口并告诉服务器该端口号,服务器再回连客户端该端口进行数据传输。若客户端位于NAT/防火墙后,服务器无法回连,易失败。
在阿里云及其他云环境下,通常推荐使用被动模式(PASV),因为服务器可以监听固定被动端口范围并在安全组放行,客户端不需要被外网直接访问。
当服务器处于NAT或有公网/内网IP差异时,需要在FTP服务配置中显式指定对外公布的公网IP(pasv_address或类似项),否则客户端将尝试连接内网地址导致失败。
对于vsftpd,在/etc/vsftpd/vsftpd.conf中设置:
pasv_enable=YES
pasv_min_port=60000
pasv_max_port=60100
pasv_address=你的公网IP或域名
需要同时在服务器操作系统的防火墙(iptables/ufw/firewalld)与阿里云实例的安全组中放行相同的端口范围。
登录阿里云控制台 -> 实例 -> 网络与安全 -> 安全组 -> 添加入方向规则:协议类型TCP,端口范围21,优先级正常,授权对象0.0.0.0/0(或限制指定IP)。
再添加被动端口范围,例如TCP端口60000-60100,授权对象根据需要设定。
1)开放21端口:
firewall-cmd --permanent --add-port=21/tcp
2)开放被动端口段:
firewall-cmd --permanent --add-port=60000-60100/tcp
3)重载防火墙:
firewall-cmd --reload
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 60000:60100 -j ACCEPT
service iptables save && systemctl restart iptables
针对vsftpd的实操配置需兼顾功能与安全,以下为推荐配置项并说明其作用。
listen=YES(独立监听)
anonymous_enable=NO(关闭匿名)
local_enable=YES(允许本地用户登录)
write_enable=YES(允许写入)
chroot_local_user=YES(将用户限制到主目录)
pasv_enable=YES
pasv_address=你的公网IP或绑定域名
pasv_min_port=60000 和 pasv_max_port=60100
如果实例使用弹性公网IP(EIP),pasv_address应填写该EIP;若使用负载均衡或端口转发,需填写对外可访问的地址并开放相同端口。
尽量缩小被动端口范围(如100个端口),并限定允许登录的用户与目录权限,必要时开启TLS(ssl_enable=YES)以加密认证与数据传输。
分步骤验证可以快速定位问题所在:确认服务、端口、云端策略、被动端口与公网IP映射、客户端模式设置、查看日志。
1)检查服务:systemctl status vsftpd
2)端口监听:ss -tnlp | grep vsftpd或netstat -anp | grep :21
3)被动端口是否开放:ss -tnlp | grep 60000或使用nmap从外网扫描端口。
在客户端尝试:使用FileZilla或WinSCP,分别切换为Passive (PASV)与Active (PORT)模式测试;FileZilla日志可以显示是否尝试连接被动端口以及返回的IP地址。
使用telnet 公网IP 21 检查控制连接:若能连通但目录列表失败,通常是被动数据端口未开放或pasv_address设置错误。
1)查看vsftpd日志(/var/log/vsftpd.log或系统日志)定位错误代码。
2)使用tcpdump抓包:tcpdump -n -i eth0 port 21 or portrange 60000-60100,观察是否到达服务器与是否有回复。
3)如果使用SELinux,确保FTP写权限与被动端口策略已放行(setsebool -P ftp_home_dir 1 等)。