我以为SFTP=FTP,结果搭了个寂寞

541 阅读5分钟

故事背景

最近在给线上一个系统做联调。这个系统有个功能是上传/下载文件,走的是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

  1. 备份原始配置文件(可选):

    sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
    
  2. 编辑配置文件

    sudo nano /etc/vsftpd.conf
    
  3. 修改以下配置项

    # 允许本地用户登录
    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用户(可选)

  1. 添加专用用户(如 ftpuser):

    sudo useradd -m -d /data -s /bin/bash ftpuser
    sudo passwd ftpuser
    
  2. 设置目录权限

    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看看效果

image.png

chrome浏览器直接跳转到Edge浏览器去了,然后Edge浏览器访问也没反应...上网搜了一下发现很多浏览器都不支持FTP协议了。

image.png

最后我看FTP的端口是21,但是SFTP用的是22的ssh端口,感觉是不是有什么东西搞错了。 查了一下发现SFTP其实是SSH协议的一部分......

image.png

SFTP和FTP

来,划重点:

协议端口基于安全性常见服务端
FTP21TCP明文传输,安全性差vsftpd、FileZilla Server 等
SFTP22SSH加密传输,安全性高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 校验、中间件转发。

所以常常是这样的场景:

  1. 上传文件(SFTP、后端接口、FastDFS 客户端随便来);
  2. 文件落到某个固定目录或存储系统;
  3. 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 地址。别怀疑,这就是现代后端架构的日常操作。

搭建前,多问一句:“这协议,到底是个啥?”能省一堆事。