第一次在阿里云ECS上搭FTP,很多人会卡在同一个地方:服务装好了,本地连不上;或者能连上,却传不了文件。问题大多出在安全组、被动端口和目录权限这三处。本文以一台Alibaba Cloud Linux服务器为例,走一遍阿里云配置ftp的完整流程,并说明常见报错怎么排查。

一个实际的需求
小王在一家做茶叶电商的小公司负责运营。每天要把新品图片和详情页素材交给设计外包,对方习惯用FTP客户端直接拖文件。之前两边靠邮件和网盘来回传,版本经常对不上。他的要求不复杂:开一个专用账号,只能进指定目录,能上传,看不到服务器上的其他内容。于是他在阿里云买了一台ECS,自己动手配FTP。
第一步:放行安全组
ECS默认只开放22端口(SSH)。FTP需要控制端口21,还要一段被动模式使用的数据端口。安全组不放行,后面的配置都不会生效。
在ECS控制台找到“安全组”,添加入方向规则:
- 端口21:协议TCP,授权对象填办公网出口IP,或者0.0.0.0/0
- 端口30000-31000:协议TCP,供被动模式传输数据使用
对外开放0.0.0.0/0,意味着全网都能尝试登录。能限定办公网出口IP就尽量限定,防暴力破解的办法后面会讲。
第二步:安装vsftpd
vsftpd是轻量、稳定的FTP服务端,个人和中小团队够用。CentOS系或Alibaba Cloud Linux上执行:
sudo yum install -y vsftpd
sudo systemctl enable vsftpd
sudo systemctl start vsftpd
Ubuntu或Debian系统用sudo apt update && sudo apt install -y vsftpd。装完后执行systemctl status vsftpd,看到active才算服务正常启动。
第三步:建专用用户和目录
不建议用root或系统已有账号登录FTP。小王新建了一个只用于传文件的账号,并把素材目录单独放在一处:
sudo mkdir -p /data/ftp/shop
sudo useradd -d /data/ftp -s /sbin/nologin designer
sudo passwd designer
sudo chown -R designer:designer /data/ftp/shop
/sbin/nologin让这个用户无法通过SSH登录系统,它只能走FTP。目录属主设为designer,外包才有权限写入文件。
第四步:修改vsftpd配置
编辑/etc/vsftpd/vsftpd.conf,保留原有注释,只改下面这些项:
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
listen=YES
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
pasv_address=你的ECS公网IP
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
几个关键项的作用:
- anonymous_enable=NO:关闭匿名登录。不关的话,任何人都能不用密码进来。
- chroot_local_user=YES:把本地用户锁在自己的家目录里,看不到系统其他文件。
- allow_writeable_chroot=YES:允许chroot根目录可写。新版vsftpd默认拒绝这种情况,不加会报500 OOPS错误。
- pasv_address:必须填ECS的公网IP。留空的话,被动模式下客户端拿到的是内网地址,连接会失败。
接着把允许登录的账号写进白名单:
echo "designer" | sudo tee -a /etc/vsftpd/user_list
保存后重启:sudo systemctl restart vsftpd。
第五步:服务器和客户端测试
先在服务器上看端口监听:ss -tlnp | grep 21。能看到vsftpd在监听21端口,说明服务本身没有问题。
然后在办公电脑上打开FileZilla之类的客户端,填写:
- 主机:ECS公网IP
- 端口:21
- 加密:先选“仅使用普通FTP”,等配好证书再升级
- 用户名和密码:前面创建的designer账号
连上后,先传一张测试图片。小王第一次测试时,目录列表正常显示,上传却卡在“正在等待响应”,最后报425错误。排查发现他漏放了30000-31000这段被动端口。补上规则后,传输立刻恢复。遇到“能连上但传不了”的情况,先查被动端口。
常见报错和排查
530 Login incorrect
账号或密码错误,也可能是用户没有写进user_list。先核对用户名,再看白名单。
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
没有加allow_writeable_chroot=YES。加上后重启服务。
425 Can’t open data connection
多数是被动端口没放行,或者pasv_address没有填公网IP。
550 Permission denied
目录权限不对。检查目标目录的属主是不是designer,同时确认write_enable=YES已开启。
安全加固
FTP以明文传输账号密码和文件内容,放在公网上并不安全。素材不涉及敏感信息时,上面的配置够用。如果传的是客户数据或合同,建议改用SFTP,它走22端口,由SSH提供加密。也可以在vsftpd中开启FTPS,即设置ssl_enable=YES并配置证书。
另外几件事也值得做:
- 用fail2ban监控vsftpd日志,对反复失败的IP自动封禁。
- 定期用阿里云快照备份数据盘,误删或勒索时能恢复。
- 安全组只放行办公网出口IP,不要长期对全网开放。
- 密码用足够长的随机字符串,并定期更换。
小结
按顺序检查:安全组放行21和被动端口区间,vsftpd里chroot和pasv_address设对,目录属主与用户白名单对得上。大部分问题照这个顺序走一遍就能定位。小王后来把这套流程写成内部文档,设计外包交付素材的时间从两天缩短到几个小时,版本混乱的问题也基本解决了。