供应商每周发来的库存表、设计团队交付的素材包、财务导出的对账文件,都需要一个稳定的地方接收。很多团队先想到FTP,协议成熟,客户端到处都能用,放到云上还能省掉机房的硬件和运维。下面用一个服饰电商的例子,把阿里云FTP服务器从选型到加固的过程讲一遍,重点放在vsftpd用户权限和安全组端口这两处最容易出岔子的地方。

先确认对方能用什么协议
FTP是明文协议,账号密码和文件内容在网络上都可能被截获。所以动手前最好先问清三件事:文件里有没有敏感数据,对端是不是只会用FTP,需不需要断点续传和自动化。如果对端只支持FTP,就上FTPS,也就是基于TLS加密的FTP。如果对方可以选择,SFTP通常更省心。它走SSH通道,只占一个端口,过防火墙也简单。
案例:二十多家供应商的文件收口
这家服饰电商有二十多家面料和辅料供应商。以前供应商用邮件发每周的货品清单和图片压缩包,运营人员下载、解压、再手动导入商品后台。每周都耗不少人工,附件超限和版本混乱的问题也时常出现。后来公司决定统一收口:每家供应商分配一个独立上传账号,文件先落到一台阿里云ECS上,再由内部脚本定时拉取入库。
这个场景有三个约束。供应商的网络环境差异大,所以需要被动模式。图片和表格体积不小,要支持断点续传。每家只能看到自己的目录,互相不可见。后面的配置都是围着这三点来做的。
搭建时要动的几处
实例选了2核4G、CentOS系列的ECS,服务端用vsftpd。过程中有几个节点需要特别留意:
- 弹性公网IP:绑定固定的弹性公网IP。如果不绑定,实例重启后地址可能变化,供应商那边的配置就失效了。
- 安全组放行:放行21端口作为控制连接。被动模式的数据端口要预留一段范围,比如30000到30099,并且只对供应商的出口IP段开放,不要直接对全网放开。
- 用户与目录隔离:每家供应商建一个独立系统用户,禁用登录shell,再通过chroot把它限制在自己的根目录里。
- 被动模式参数:开启被动模式,指定端口范围,并把pasv_address设为实例的公网IP。这一项最容易填错。地址不对的时候,客户端能连上,却列不出文件。
- 关闭匿名、开启加密:关掉匿名登录,开启SSL并强制加密数据通道。证书可以用阿里云提供的,也可以自己购买。
上线第一周的两个问题
上线第一周,有三家供应商反馈列不出目录。排查下来是两个问题叠在一起:pasv_address还指向内网地址,安全组里的被动端口只放行了一部分。vsftpd的被动端口是在配置范围内随机分配的,只放行一部分就会有连接失败的情况。把两处都修正后,成功率恢复正常。
另一个问题出在时区上。服务器时区和公司内部系统不一致,文件修改时间判断出现偏差,定时脚本把昨天的文件当成新文件重复导入了。后来统一了系统时区,脚本也改成按文件名去重,问题才彻底消失。FTP本身并不复杂,耗时间的通常是网络和环境层面的细节。
长期运行要盯的几件事
- 定期看登录日志,留意大量失败登录的记录。可以考虑配合fail2ban限制暴力破解。
- 目录权限分开设置。供应商账号只给写入权限,内部拉取账号只读,两边互不干扰。
- 重要文件做异地备份。文件量大了,可以用OSS的生命周期规则做归档,降低存储成本。
- 把磁盘、带宽和连接数纳入监控,并设置告警阈值。连接数异常往往是最早的信号。
如果业务量继续增长,可以把文件直接落到OSS,前端保留FTP或SFTP入口,由网关或中间件完成协议转换。供应商的使用习惯不用变,存储层的扩展性和可靠性却能跟上。