自学教程 从零学编程

SFTP 协议

一、SFTP 是什么

SFTP(SSH File Transfer Protocol,SSH文件传输协议),应用层协议。
⚠️ 重点区分:SFTP并不是FTP+SSL,也不是FTPS;SFTP是基于SSH协议之上的文件传输子系统,复用SSH连接。
底层:TCP → SSH → SFTP,默认端口就是SSH的22端口。

作用:安全地上传、下载、管理远程服务器上的文件。
客户端:FileZilla、Xshell、WinSCP、sftp命令行。

FTP 明文;FTPS:FTP over TLS;SFTP:SSH内置文件传输,三者不一样。

二、通信模型

C/S架构

  1. 服务端:sshd(SSH服务)内置SFTP子系统,监听TCP 22端口;
  2. 客户端:先建立SSH连接、完成身份认证(密码 / 密钥);
  3. SSH通道建立成功后,在同一个SSH加密会话里启动SFTP子系统,执行文件操作;

只需要一次TCP连接,SSH同时提供远程命令和SFTP文件传输。

三、SFTP 核心功能

  • 文件上传、下载、断点续传
  • 查看目录列表、创建/删除文件夹、重命名文件
  • 修改文件权限、属主、时间戳
  • 支持文件断点续传
  • 支持符号链接管理

四、SFTP 连接流程

  1. 客户端发起TCP连接,连接服务器22端口;
  2. SSH握手,协商加密算法,服务器下发主机密钥;
  3. 客户端身份认证(密码 / SSH公私钥认证);
  4. SSH会话建立成功,客户端请求启动sftp子系统;
  5. 进入SFTP交互,执行文件操作命令;
  6. 所有文件数据、命令、返回结果全部在SSH加密隧道内传输;
  7. 操作完成,关闭会话。

五、SFTP 报文特点

基于SSH的二进制报文交互,不是FTP那种明文命令。
常用操作指令(内部协议指令,不是shell命令):

  • SSH_FXP_OPEN:打开文件
  • SSH_FXP_READ:读取文件(下载)
  • SSH_FXP_WRITE:写入文件(上传)
  • SSH_FXP_READDIR:读取目录列表
  • SSH_FXP_STAT:获取文件元信息(大小、权限)
  • SSH_FXP_REMOVE / SSH_FXP_RMDIR:删除文件/目录

六、SFTP vs FTP vs FTPS

项目SFTPFTPFTPS
底层SSH(TCP22)TCP 21(控制端口)+主动/被动数据端口FTP+TLS,21端口
加密全程加密明文,账号密码裸奔控制通道+数据通道TLS加密
端口只用22,单一端口需要额外开放数据端口需要额外开放数据端口
防火墙简单,只放行22防火墙配置麻烦(多端口)防火墙配置麻烦
认证密码/SSH密钥账号密码账号密码

运维推荐:优先使用SFTP,防火墙简单,安全性好。

七、优缺点

✅ 优点

  1. 全程加密,防窃听、防篡改;
  2. 复用SSH 22端口,防火墙只开放单个端口,部署简单;
  3. 支持密钥登录,安全性更高;
  4. 支持修改文件权限、属主等类Unix文件属性;
  5. 几乎所有Linux服务器默认自带sshd,开箱即用。

❌ 缺点

  1. 传输性能略低于FTP(加密带来开销);
  2. Windows原生对SFTP支持弱,一般需要第三方客户端;
  3. 不是专门文件传输协议,部分高级文件传输特性缺失。

八、重要误区澄清

  1. ❌ SFTP ≠ Secure FTP;SFTP全称SSH File Transfer Protocol
  2. ❌ SFTP不是FTP的安全版本;二者协议完全不同
  3. ❌ 不需要额外开启独立SFTP端口,只要sshd开启,默认就支持SFTP

九、小结

  1. SFTP是SSH内置的文件传输子协议,端口22,跑在SSH加密隧道上;
  2. 所有数据加密传输,支持密钥认证;
  3. 仅需单个端口,防火墙配置简单,是运维最常用的安全文件传输方案;
  4. 和FTP、FTPS是完全不同协议,不要混淆;
  5. 可以上传下载、管理目录、修改文件权限。

思考题:SFTP复用SSH 22端口,相比FTPS,防火墙配置为什么更简单?

0 条笔记