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 和云平台安全组
相关推荐
郭涤生5 小时前
大白话Proactor模式
linux·网络·c++
晚风予卿云月5 小时前
Linux编辑器—vim的使用
linux·编辑器·vim
蒸蒸yyyyzwd5 小时前
Linux网络编程-udp
linux·网络·udp
派大鑫wink5 小时前
Python 流程控制实战:打造文字版数独小游戏(新手友好)
服务器·前端·microsoft
MYMOTOE65 小时前
ISC-3000S的U-Boot 镜像头部解析
java·linux·spring boot
郭涤生5 小时前
大白话Reactor模式
linux·c++
liebe1*15 小时前
第八章 防火墙高可靠性技术
运维·服务器·网络
DN金猿5 小时前
jenkins 权限控制(用户只能看指定的项目)
linux·运维·服务器·jenkins
長安一片月6 小时前
操作系统之进程和线程
linux·运维·服务器