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 便于与 ChrootDirectory、ForceCommand 等配合实现隔离与仅 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 未拦截(若启用需相应放行)。