wei/个人文档/sftp共享文件夹映射网络驱动器.md
2026-06-04 13:57:41 +08:00

127 lines
6.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

在 **CentOS 9 服务器**上部署一个安全、受限的 SFTP 服务,然后在 **Windows 客户端**上通过免费工具将其挂载为一个网络驱动器
整个流程分为两大步:
### 第一步:在 CentOS 9 上配置 SFTP 服务端
这个步骤的目标是创建一个只能进行文件传输、不能登录 Shell 的安全用户,并将其限制在特定的目录中。
1. **安装与启动 OpenSSH 服务**
CentOS 9 通常预装了 OpenSSH它是 SFTP 服务的基础。如果未安装,可以执行以下命令:
```bash
sudo dnf install -y openssh-server
```
安装后,启动并设置开机自启:
```bash
sudo systemctl enable --now sshd
sudo systemctl status sshd # 确认状态为 active (running)
```
2. **创建 SFTP 用户组和用户**
创建一个专用的用户组和用户,并禁止该用户通过 SSH 登录系统。
```bash
# 创建用户组
sudo groupadd sftpusers
# 创建用户指定组、家目录并禁止shell登录
# 这里以用户名 'mysftpuser' 为例,你可以自行替换
sudo useradd -g sftpusers -d /sftp/mysftpuser -s /sbin/nologin mysftpuser
# 为用户设置密码
sudo passwd mysftpuser
```
3. **创建目录并设置严格的权限**
这是最关键的一步。为了安全SFTP 的 `Chroot` 目录(即用户的家目录)必须属于 `root` 用户,且其他用户不能有写入权限。用户实际能读写的应该是其下的子目录。
```bash
# 创建用户的家目录(作为 chroot 的根)
sudo mkdir -p /sftp/mysftpuser
# 在家目录下创建一个用户可写的 upload 文件夹
sudo mkdir -p /sftp/mysftpuser/upload
# 设置家目录 /sftp/mysftpuser 的所有者为 root权限为 755
sudo chown root:root /sftp/mysftpuser
sudo chmod 755 /sftp/mysftpuser
# 设置 upload 目录的所有者为 mysftpuser组为 sftpusers权限为 755
sudo chown mysftpuser:sftpusers /sftp/mysftpuser/upload
sudo chmod 755 /sftp/mysftpuser/upload
```
4. **修改 SSH 配置文件 (`/etc/ssh/sshd_config`)**
编辑配置文件,启用内部 SFTP 并限制 `sftpusers` 组的用户。
```bash
sudo vi /etc/ssh/sshd_config
```
* 找到或添加以下行,**注释掉**原有的 `Subsystem`,启用内置 SFTP
```
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
```
* 在文件末尾添加以下配置块,对 `sftpusers` 组生效:
```
Match Group sftpusers
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
```
> `%u` 会自动替换为用户名,确保每个用户被锁定在自己的家目录中 。
5. **重启 SSH 服务并检查防火墙**
修改配置后,需要重启服务并确保防火墙放行 SSH 端口22
```bash
# 检查配置文件语法是否正确
sudo sshd -t
# 如果无报错,重启服务
sudo systemctl restart sshd
# 配置防火墙(如果系统启用了防火墙)
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
```
### 第二步:在 Windows 上挂载为网络驱动器
Windows 原生不支持直接挂载 SFTP。因此我们需要安装两个免费软件来让 Windows 获得这个能力。
1. **在 Windows 上安装必备软件**
* **WinFsp**: 它是一个底层的文件系统驱动,为 SSHFS-Win 提供运行基础。
* **SSHFS-Win**: 这是一个实现了 SSHFS 协议的 Windows 客户端。
* **操作步骤**:
1. 从 GitHub 或其他可信来源下载 [WinFsp](https://github.com/winfsp/winfsp) 和 [SSHFS-Win](https://github.com/winfsp/sshfs-win) 的安装包。
2. **务必先安装 WinFsp**,再安装 SSHFS-Win全部保持默认设置即可 。
2. **开始映射网络驱动器**
* 打开 Windows 的**文件资源管理器**。
* 在左侧导航栏右键点击 **“此电脑”**,选择 **“映射网络驱动器”** 。
3. **配置驱动器号和文件夹路径**
* **驱动器**:选择一个你喜欢的盘符,例如 `Z:`
* **文件夹**:这是最关键的一步,需要按照 SSHFS-Win 要求的特殊格式填写。假设你的 CentOS 服务器 IP 是 `192.168.1.100`SFTP 用户名是 `mysftpuser`SSH 端口是默认的 22那么你应该输入
```
\\sshfs\mysftpuser@192.168.1.100
```
**注意**:如果 SSH 端口不是默认的22例如改成了 2222则需要在 IP 地址后用感叹号指定端口,格式为 `\\sshfs\user@ip!port`
* 勾选 **“登录时重新连接”**,这样每次开机都会自动挂载。
* 点击 **“完成”**。
4. **输入密码并完成连接**
系统会弹出一个 Windows 安全窗口,要求你输入 `mysftpuser` 的密码。输入后即可成功连接。
现在,打开“此电脑”,你就能看到一个新的 `Z:` 盘,里面就是你 CentOS 服务器上的 `/sftp/mysftpuser/upload` 目录内容。你可以像操作本地硬盘一样,对它进行拖拽、复制、粘贴等操作。
### 常见问题排查
* **连接时提示"Connection closed by remote host"**:这通常是服务器端的 `ChrootDirectory` 权限设置错误。请返回第一步的第3点**确保 `/sftp/mysftpuser` 目录的所有者是 `root`,且权限为 755** 。
* **因需要暴露22端口 需确保其他用户配置白名单登录 防止被黑**
* **登录后看不到任何文件或无法写入**:请检查你是否进入了 `upload` 目录。因为 `mysftpuser` 的家目录归 `root` 所有,你只能看到但无法写入。你需要进入 `upload` 目录才能上传文件。同时检查 `upload` 目录的所有者是否为 `mysftpuser`
* **SELinux 阻止**:如果你的 CentOS 启用了 SELinux建议保持启用可能需要执行以下命令来允许 SSH 读写用户目录:
```bash
sudo setsebool -P ssh_chroot_rw_homedirs on
```