SFTP(SSH File Transfer Protocol)是基于 SSH 的安全文件传输协议,与传统 FTP 最大的区别是所有数据均加密传输,且无需额外开放端口——复用 SSH 的 22 端口即可。本文演示如何在搬瓦工 VPS 上配置 SFTP 专用用户,结合 chroot 限制其只能访问指定目录,并用常见客户端工具连接测试。

本文要点

  • SFTP vs FTP:安全性与端口对比
  • 创建 SFTP 专用用户并设置 chroot 目录隔离
  • sshd_config 关键配置详解
  • FileZilla / WinSCP 客户端连接设置
  • 常见问题:chroot 权限报错排查

SFTP 与 FTP 的区别

对比项FTPSFTP
协议独立 FTP 协议基于 SSH
加密无加密(明文)全程加密
端口21(控制)+ 被动端口22(与 SSH 共用)
防火墙友好性差(需开大量被动端口)好(单一端口)
服务器配置需安装 vsftpd 等OpenSSH 内置,无需额外安装

SFTP 更简单也更安全

SFTP 直接复用 SSH,无需单独安装 FTP 服务,也不需要在防火墙开放额外端口。新建站时优先选择 SFTP 而非传统 FTP

创建 SFTP 专用用户

# 创建 sftp 用户(无法 SSH 登录 Shell)
useradd -m -s /usr/sbin/nologin sftpuser

# 设置密码
passwd sftpuser

# 创建用户的上传目录
mkdir -p /home/sftpuser/upload

# chroot 要求:家目录必须由 root 所有,且不能被其他用户写入
chown root:root /home/sftpuser
chmod 755 /home/sftpuser

# 上传目录允许用户写入
chown sftpuser:sftpuser /home/sftpuser/upload

配置 sshd_config

编辑 SSH 配置文件,为 SFTP 用户启用 chroot 限制:

nano /etc/ssh/sshd_config

# 找到并确认内置 SFTP 子系统(通常已有):
Subsystem sftp internal-sftp

# 在文件末尾添加以下配置块:
Match User sftpuser
    ChrootDirectory /home/sftpuser
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
# 检查配置语法
sshd -t

# 无报错则重启 SSH 服务
systemctl restart ssh

sshd_config 改错会锁定 SSH

修改完成后,保留当前 SSH 连接,另开新终端窗口测试是否还能正常 SSH 登录,确认无误再关闭旧连接。如果不小心锁定,可用 KiwiVM 紧急控制台修复。

测试 SFTP 连接

在本地用 sftp 命令行工具测试:

# 连接(默认端口 22)
sftp sftpuser@服务器IP

# 指定非默认端口
sftp -P 2222 sftpuser@服务器IP

# 常用 sftp 命令:
# ls           列出远端文件
# cd upload    进入 upload 目录
# put 文件     上传文件
# get 文件     下载文件
# bye          退出

图形界面客户端配置

FileZilla 和 WinSCP 是最常用的 SFTP 图形客户端:

配置项
协议SFTP - SSH File Transfer Protocol
主机服务器 IP
端口22(或自定义 SSH 端口)
用户名sftpuser
密码创建时设置的密码(或配置密钥)

chroot 报错排查

最常见的 chroot 权限错误:

# 错误:Received message too long 或 bad ownership or modes
# 原因:chroot 目录不满足权限要求

# 检查家目录所有者必须是 root,且不可组写/其他写
ls -la /home/sftpuser

# 修正:
chown root:root /home/sftpuser
chmod 755 /home/sftpuser

多用户 SFTP

如需为多个用户配置 SFTP,可创建 sftpusers 用户组,在 sshd_config 中用 Match Group sftpusers 替换 Match User,统一管理更方便。

小结

  • SFTP 复用 SSH 端口,加密安全,优于传统 FTP
  • chroot 关键权限:家目录 root 所有、755 权限;子目录才允许用户写入
  • ForceCommand internal-sftp 禁止用户 SSH 进 Shell
  • 配置后保留当前连接测试,防止锁定
  • 图形客户端(FileZilla/WinSCP)填写 IP、端口和账密即可连接

常见问题

SFTP 和 FTPS 一样吗?

不一样。SFTP 是 SSH 子系统,全程一个连接;FTPS 是在传统 FTP 上加 TLS 层,仍需开多个端口。推荐 SFTP,配置更简单。

chroot 后用户能看到服务器的根目录吗?

不能。chroot 会把用户的根目录「切换」到指定目录,用户眼中这就是 /,看不到服务器的真实根目录或其他用户的文件。

能给 SFTP 用户同时允许 SSH Shell 登录吗?

可以,把 shell 改回 /bin/bash 并去掉 ForceCommand 即可,但这样用户就有完整的 SSH 权限。通常建议将 SFTP 用户和管理员账户分开。

上传文件报错 Permission denied 怎么处理?

确认上传目录(如 /home/sftpuser/upload)的所有者是 sftpuser 本身,且有写权限:chown sftpuser:sftpuser /home/sftpuser/upload && chmod 755 /home/sftpuser/upload。