SFTP(SSH File Transfer Protocol)是基于 SSH 的安全文件传输协议,与传统 FTP 最大的区别是所有数据均加密传输,且无需额外开放端口——复用 SSH 的 22 端口即可。本文演示如何在搬瓦工 VPS 上配置 SFTP 专用用户,结合 chroot 限制其只能访问指定目录,并用常见客户端工具连接测试。
本文要点
- SFTP vs FTP:安全性与端口对比
- 创建 SFTP 专用用户并设置 chroot 目录隔离
- sshd_config 关键配置详解
- FileZilla / WinSCP 客户端连接设置
- 常见问题:chroot 权限报错排查
SFTP 与 FTP 的区别
| 对比项 | FTP | SFTP |
|---|---|---|
| 协议 | 独立 FTP 协议 | 基于 SSH |
| 加密 | 无加密(明文) | 全程加密 |
| 端口 | 21(控制)+ 被动端口 | 22(与 SSH 共用) |
| 防火墙友好性 | 差(需开大量被动端口) | 好(单一端口) |
| 服务器配置 | 需安装 vsftpd 等 | OpenSSH 内置,无需额外安装 |
SFTP 更简单也更安全
创建 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 sshsshd_config 改错会锁定 SSH
测试 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 复用 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。