CentOS 搭建 SFTP 服务器
适用系统:CentOS 7 / 8 / 9(及 Rocky Linux、AlmaLinux)
第一阶段:安装与基础环境准备
目标:确保 SSH 服务正常运行,SFTP 功能可用。
1.1:确认系统信息
bash
cat /etc/redhat-release
# 示例输出:CentOS Linux release 7.6.1810 (Core)
1.2:安装 OpenSSH 服务(通常已预装)
bash
# 检查是否已安装
rpm -q openssh-server
# 示例输出:openssh-server-7.4p1-23.el7_9.x86_64
# 若未安装(极少见),执行:
sudo yum install -y openssh-server # CentOS 7/8
# 或
sudo dnf install -y openssh-server # CentOS 8+/Stream
说明:SFTP 是 OpenSSH 的内置功能,无需额外软件包。
1.3:启动并启用 SSH 服务
bash
sudo systemctl enable --now sshd
sudo systemctl status sshd
- 确认状态为
active (running) - 默认监听端口:22

1.4:开放防火墙(如启用)
这里如果是使用是云服务器的话,在下面检查防火墙是否运行,应该打印出的是unknown(未运行)
bash
# 检查 firewalld 是否运行
sudo systemctl is-active firewalld
# 若运行,放行 SSH
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
如果使用云服务器(如阿里云、AWS),还需在安全组中放行 TCP 22 端口。
验证:
bash
# 本地测试 SSH 是否响应
ssh your_server_ip -p 22

这里我是开启了扫码登录,理论上说,只要你能远程登录你的服务器,基本上没问题的,下面是没开启的示例

第二阶段:创建 SFTP 用户并实现基础隔离(必做)
目标:创建一个只能 SFTP、不能 Shell 登录的用户,并限制其访问目录。
步骤 2.1:创建专用用户组(便于管理)
bash
sudo groupadd sftpusers
步骤 2.2:创建 SFTP 用户(禁止 Shell)
bash
USERNAME="sftpuser"
sudo useradd \
-g sftpusers \
-d "/sftp/$USERNAME" \
-s /sbin/nologin \
"$USERNAME"
# 设置密码(用于 SFTP 登录)
sudo passwd "$USERNAME"
# 输入强密码,例如:MySftpPass@123456
/sbin/nologin是 CentOS 中禁用 Shell 的标准方式。
步骤 2.3:创建 chroot 目录结构
bash
BASE_DIR="/sftp"
sudo mkdir -p "$BASE_DIR/$USERNAME/upload"
步骤 2.4:设置严格目录权限(关键!)
bash
# chroot 根目录必须由 root 拥有,且不可写
sudo chown root:root "$BASE_DIR/$USERNAME"
sudo chmod 755 "$BASE_DIR/$USERNAME"
# 用户可写子目录
sudo chown "$USERNAME:sftpusers" "$BASE_DIR/$USERNAME/upload"
sudo chmod 755 "$BASE_DIR/$USERNAME/upload"
为什么这样设?
OpenSSH 安全机制要求:
ChrootDirectory指向的目录不能被非 root 用户写入,否则拒绝连接。

步骤 2.5:配置 SSH 启用 SFTP 限制
编辑配置文件:
bash
sudo vi /etc/ssh/sshd_config
修改内容:
-
确保启用 internal-sftp(通常在文件中部):
conf# 注释掉旧的 # Subsystem sftp /usr/libexec/openssh/sftp-server # 启用内置 SFTP Subsystem sftp internal-sftp -
在文件最末尾添加用户限制规则:
confMatch Group sftpusers ChrootDirectory /sftp/%u ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no
%u会自动替换为用户名,实现每个用户独立 jail(监牢),每个用户登录,只能看到自己的目录

这里不能将Ciphers这段放在Match后面,否则会自动归为Match的内容,即在2.6检查SSH语法时报错,如:
[root@VM-16-12-centos ~]# sudo sshd -t
/etc/ssh/sshd_config line 149: Directive 'Ciphers' is not allowed within a Match block
步骤 2.6:重启 SSH 服务
bash
# 先检查配置语法(防止锁死)
sudo sshd -t
# 无报错则重启
sudo systemctl restart sshd
验证:
从另一台机器测试:
bash
sftp sftpuser@your_server_ip

预期行为:
- 成功登录
- 执行
ls只看到upload目录 - 进入
upload后可上传/下载文件 - 无法执行
cd ..跳出根目录 - 无法运行任何 shell 命令(如
ls /etc)
若连接失败,请先跳至【常见问题】排查。
到此,简易的SFTP服务已搭建成功,可以使用FileZilla Client等客户端工具进行连接。
阶段路线图
| 阶段 | 内容 | 是否必做 |
|---|---|---|
| 第一阶段 | 安装并启动 SSH 服务 | 必做 |
| 第二阶段 | 创建用户、目录、配置 chroot SFTP | 必做 |
常见问题排查
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
Connection closed by remote host |
chroot 目录权限错误 | 确保 /sftp/user 属主为 root:root,权限 755 |
| 登录后立即断开 | SELinux 阻止 | 执行 setsebool -P ssh_chroot_rw_homedirs on |
Permission denied 无法写入 |
试图写根目录 | 告知用户只能使用 upload/ 子目录 |
Write failed: Broken pipe |
sshd_config 语法错误 | 运行 sudo sshd -t 检查 |
| 无法连接 22 端口 | 防火墙/安全组未放行 | 检查 firewalld 和云平台安全组 |