温馨提示×

如何在Debian SFTP中配置数据传输模式

小樊
46
2026-01-08 10:00:57
栏目: 智能运维

Debian SFTP 数据传输模式配置指南

一、概念澄清

  • SFTP 是基于 SSH 的文件传输协议,使用 22 端口,默认通过一条加密通道传输数据与控制信息,不存在像 FTP 那样的“主动/被动模式”切换。很多客户端仍提供“传输模式”选项,但对 SFTP 基本无效;若你看到“主动/被动”,通常意味着实际在使用 FTP/S 协议而非 SFTP。另请区分:SFTP ≠ FTP,也不同于 FTPS(FTP over SSL)。

二、在 Debian 上启用与加固 SFTP(推荐内置子系统)

  • 安装并启动 OpenSSH 服务:
    • sudo apt update && sudo apt install -y openssh-server
    • sudo systemctl enable --now ssh
  • 编辑服务端配置 /etc/ssh/sshd_config:
    • 确保启用内置 SFTP 子系统:
      • Subsystem sftp internal-sftp
    • 为需要受限 SFTP 的用户或组添加匹配段(示例为组 sftpusers):
      • Match Group sftpusers
        • ChrootDirectory /sftp # 或使用 %h 限制到各自家目录
        • ForceCommand internal-sftp
        • AllowTcpForwarding no
        • X11Forwarding no
        • PermitTunnel no
  • 创建目录与权限(以集中式 /sftp 为例,满足 OpenSSH 对 chroot 的要求):
    • sudo mkdir -p /sftp/uploads
    • sudo chown root:root /sftp && sudo chmod 755 /sftp
    • sudo chown sftpuser:sftpusers /sftp/uploads && sudo chmod 700 /sftp/uploads
  • 使配置生效并测试:
    • sudo systemctl restart ssh
    • sftp -P 22 sftpuser@your_server_ip
  • 说明:使用 internal-sftp 便于与 ChrootDirectoryForceCommand 等配合实现隔离与仅 SFTP 访问。

三、客户端连接与“传输模式”的正确设置

  • 命令行 sftp:
    • sftp -P 22 sftpuser@your_server_ip
    • 连接后使用 get/put 等命令传输;SFTP 为单一通道,无需设置主动/被动。
  • 图形客户端(如 FileZilla):
    • 协议选择:SFTP - SSH 文件传输协议
    • 端口:22
    • 登录类型:正常(或密钥)
    • 若连接异常,优先检查服务器防火墙是否放行 22/TCP、以及用户目录权限是否满足 chroot 要求;不要将 FTP 的“主动/被动”设置套用在 SFTP 上。

四、若你实际需要的是 FTP/S 的主动或被动模式

  • 安装 FTP 服务(例如 vsftpd):
    • sudo apt update && sudo apt install -y vsftpd
  • 启用被动模式并放行端口范围(示例开放 30000–31000):
    • 在 /etc/vsftpd.conf 中设置:
      • pasv_enable=YES
      • pasv_min_port=30000
      • pasv_max_port=31000
    • 防火墙放行:
      • sudo ufw allow 21/tcp
      • sudo ufw allow 30000:31000/tcp
  • 说明:主动/被动是 FTP 的概念;SFTP 不使用该模型。如果你的业务必须区分主动/被动,请部署 FTP/S 而非 SFTP。

五、常见故障排查要点

  • 出现 “bad ownership or modes for chroot directory”:
    • 确保 ChrootDirectory(如 /sftp)由 root:root 拥有且权限为 755;可写目录必须在其下创建并交给相应用户(如 /sftp/uploads)。
  • 登录后无法上传:
    • 检查可写子目录的拥有者与权限(如 700 给上传用户),以及父级 chroot 目录不可写。
  • 连接被拒或超时:
    • 确认 sshd 正在运行(systemctl status ssh)、防火墙放行 22/TCP,以及 SELinux/AppArmor 未拦截(若启用需相应放行)。

0