CentOS 搭建 SFTP 服务器(一)

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

修改内容:

  1. 确保启用 internal-sftp(通常在文件中部):

    conf 复制代码
    # 注释掉旧的
    # Subsystem sftp /usr/libexec/openssh/sftp-server
    
    # 启用内置 SFTP
    Subsystem sftp internal-sftp
  2. 在文件最末尾添加用户限制规则

    conf 复制代码
    Match 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 和云平台安全组
相关推荐
翼龙云_cloud1 分钟前
阿里云渠道商:弹性伸缩如何三步搭建跨可用区大模型服务?
服务器·阿里云·云计算
waves浪游8 分钟前
Ext系列文件系统
linux·服务器·开发语言·c++·numpy
加油勇士8 分钟前
服务器调优
运维·服务器
独自归家的兔10 分钟前
CentOS 8 系统下的包依赖冲突问题
linux·运维·centos
王大傻092814 分钟前
kali-linux-2025.4 鼠标不显示的问题 --- 已解决
linux·服务器·网络安全
2601_9491465325 分钟前
Go短信验证码接口开发实践:编写一个可直接运行的发送示例
服务器·microsoft·golang
一池秋_27 分钟前
aarch64_Ubuntu (Linux)连不上adb解决方法
linux·ubuntu·adb
犀思云28 分钟前
从0到1:Linux 系统 TCP 缓冲区调优实战指南
服务器·网络·php
_OP_CHEN30 分钟前
【Linux系统编程】(二十四)深入 Ext2 块组内部:inode、数据块与目录的底层工作机制
linux·操作系统·文件系统·c/c++·inode·块组·数据块映射
Skrrapper1 小时前
【计算机网络】ep1:物理层概述
服务器·网络·计算机网络