故事背景
最近在给线上一个系统做联调。这个系统有个功能是上传/下载文件,走的是SFTP协议(注意,是SFTP,不是FTP)。因为测试环境里没有现成的SFTP服务器,我的第一反应是:这不就是FTP服务器嘛,网上一搜一大把搭建方案。
其实数据库的配置就有两个,一个是SFTP的配置,一个是FTP的配置,SFTP的配置是xxxx:22的端口,FTP的配置是xxxx:21端口(这里已经有些蹊跷,不过我还没发现有什么不对劲)。本来我是想着直接去现网的SFTP服务器看下配置,结果发现自己的账号没有权限登上服务器- -
于是我熟练地打开DEEPSEEK,敲下“FTP服务器搭建教程”,干脆利落地装上了一个。
FTP服务器搭建
一、安装 vsftpd
# Ubuntu/Debian
sudo apt update
sudo apt install vsftpd
# CentOS/RHEL
sudo yum install vsftpd
二、配置 vsftpd
-
备份原始配置文件(可选):
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak -
编辑配置文件:
sudo nano /etc/vsftpd.conf -
修改以下配置项:
# 允许本地用户登录 local_enable=YES write_enable=YES chroot_local_user=YES allow_writeable_chroot=YES # 指定根目录为 /data local_root=/data # 禁用匿名登录(安全考虑) anonymous_enable=NO # 被动模式配置(可选) pasv_enable=YES pasv_min_port=30000 pasv_max_port=31000
三、创建FTP用户(可选)
-
添加专用用户(如
ftpuser):sudo useradd -m -d /data -s /bin/bash ftpuser sudo passwd ftpuser -
设置目录权限:
sudo chown -R ftpuser:ftpuser /data sudo chmod 755 /data
四、配置防火墙(如启用)
# 开放21端口和被动模式端口范围
sudo ufw allow 21/tcp
sudo ufw allow 30000:31000/tcp
sudo ufw reload
五、SELinux 配置(如启用)
# 允许FTP访问用户目录
sudo setsebool -P ftpd_full_access on
# 或设置文件上下文(针对 /data)
sudo semanage fcontext -a -t public_content_rw_t "/data(/.*)?"
sudo restorecon -Rv /data
六、启动服务
sudo systemctl restart vsftpd
sudo systemctl enable vsftpd
七、测试连接
使用FTP客户端(如FileZilla)或命令行:
ftp your_server_ip
# 输入用户名和密码
服务起来了,配置也整好了,java使用SFTP也能上传文件了,然后我试着用浏览器打开FTP看看效果
chrome浏览器直接跳转到Edge浏览器去了,然后Edge浏览器访问也没反应...上网搜了一下发现很多浏览器都不支持FTP协议了。
最后我看FTP的端口是21,但是SFTP用的是22的ssh端口,感觉是不是有什么东西搞错了。 查了一下发现SFTP其实是SSH协议的一部分......
SFTP和FTP
来,划重点:
| 协议 | 端口 | 基于 | 安全性 | 常见服务端 |
|---|---|---|---|---|
| FTP | 21 | TCP | 明文传输,安全性差 | vsftpd、FileZilla Server 等 |
| SFTP | 22 | SSH | 加密传输,安全性高 | OpenSSH 自带,支持 SFTP 子系统 |
简单来说:
- FTP 是传统的文件传输协议,工作在21端口,数据是明文的,搞安全还得再套一层 SSL(那叫 FTPS)。
- SFTP 全称是 SSH File Transfer Protocol,是基于 SSH 的子协议,工作在22端口,天然加密,安全性更好。
重点来了:搭建SFTP服务器,其实只需要系统有 SSH 服务就够了!
很多 Linux 服务器默认就装了 openssh-server,SFTP 服务其实默认就开着。只要配置好对应的用户、目录权限,就可以愉快使用了,压根不需要另外搭FTP服务器。
所以我前面干嘛去了……对,我搭了个寂寞……
教训:别再把SFTP当FTP了!
这次经历让我彻底记住了:
FTP ≠ SFTP
虽然名字像,但协议、实现、安全机制完全不一样。搞清楚这点,能省掉很多无效操作。
顺便提一句,日常开发中如果你只需要安全传文件,SFTP是更推荐的方案。FTP在内网还行,公网基本告别了。
补一嘴:下载?其实大部分时候是 nginx 在干活!
说了半天上传下载,顺便再补充一个“行业潜规则”:大多数“下载”,其实都是 nginx 搞定的。
不管你后台用的是:
- SFTP 上传的文件;
- FastDFS 这种分布式文件存储;
- 甚至是你本地某个目录下的文件;
最终文件下载的时候,十有八九是通过 nginx 暴露出来的 HTTP 访问地址。
这也难怪:
- nginx 轻量、高性能、稳定;
- 做静态资源服务器简直不能更合适;
- 配个 alias 或 root,分分钟搞定访问路径;
- 想要权限控制,还可以配 auth_basic、token 校验、中间件转发。
所以常常是这样的场景:
- 上传文件(SFTP、后端接口、FastDFS 客户端随便来);
- 文件落到某个固定目录或存储系统;
- nginx 把这个目录映射出来,浏览器一访问就能下载。
举个例子:
#nginx配置
location /files/ {
alias /data/uploads/;
autoindex on;
}
然后你就可以通过 http://your-server/files/xxx.pdf 下载文件了。至于这个文件是怎么上传上去的,nginx 并不关心,爱谁谁,别影响我发文件就行。
总结
- SFTP 和 FTP 是两种不同的协议;
- SFTP 是基于 SSH 的,不需要额外搭服务;
- FTP 是单独的服务,明文传输,得谨慎使用;
- 别看到“SFTP”就想当然地装 FTP 服务;
- 多看协议文档,多查 StackOverflow,能救命。
上传时你可能有 SFTP、有 FTP、有各种花里胡哨的方式;
但下载,最后都归于 nginx 的怀抱。
这也是为什么你明明用的是 SFTP 服务上传,前端拿到的却是一个 HTTP 地址。别怀疑,这就是现代后端架构的日常操作。
搭建前,多问一句:“这协议,到底是个啥?”能省一堆事。