外观
独立 SFTP 服务:sftp 插件
完成后,NAS 上多出一个独立的 SFTP 服务(默认端口 222)。外部协作者的账号登录后只能看到你指定的共享文件夹,进不了系统的其他目录,也开不了 shell。系统自带的 SSH 不受影响。
适合谁
- 要给外部协作者或设备一个文件交换入口,又不想给他们系统 SSH 的权限。
- 想把「管理员登录」和「文件交换」分到两个服务、两个端口上,改一个不影响另一个。
不适合:管理员自己登录维护,用 服务 → SSH(Services → SSH)和 _ssh 组即可,见 SSH 与 SFTP 访问。
和系统 SSH 的区别:
系统 SSH(服务 → SSH) | sftp 插件 | |
|---|---|---|
| 进程 | ssh 服务 | 第二个 sshd,omv-sftp 服务,配置文件 /etc/ssh/omv_sftp_config |
| 默认端口 | 22 | 222 |
| 谁能登录 | _ssh 组 | 勾选 授权组 后,只有 sftp-access 组 |
| 登录后能做什么 | 按账号的 Unix 权限,有 shell | 只能用 SFTP,限制在 /sftp/<用户名>/ 里,不能转发端口 |
这是第二个 SSH 入口,不勾选「授权组」时它不限制谁能登录
- 影响范围:按生成的配置,只有
sftp-access组的用户会被强制成 SFTP 并关进目录;其他有密码、有登录 shell 的本机用户,在没有勾选授权组时,可以从这个端口得到一个正常的 SSH 会话,系统 SSH 的_ssh组限制对它不起作用。如果你把这个端口映射到公网,它就是新增的暴露面。 - 前置条件:勾选 授权组(AllowGroups);协作者用专用账号,只加入
sftp-access组,不要加入_ssh、sudo、openmediavault-admin;优先用 SSH 公钥并关闭密码验证;配合 Fail2ban,把相应的监狱(jail)端口设成 222;路由器上只转发这一个端口。 - 怎么回退:取消勾选 启用,保存并应用,
omv-sftp服务就会停止;在 共享 标签里删除条目会立即卸载对应的目录;路由器上取消端口转发。
插件信息
| 项 | 内容 |
|---|---|
| 包名 | openmediavault-sftp |
| 来源 | omv-extras |
| OMV 8 状态 | 截至 2026-10-22 的 omv-extras synchrony 软件源为 8.0.3(amd64、arm64) |
| 菜单位置 | 服务 → Sftp(Services → Sftp),两个标签:设置(Settings)、共享(Shares) |
| 依赖 | 只依赖 OMV 本身。安装时创建 sftp-access 组 |
先装 omv-extras,再到 系统 → 插件(System → Plugins)里安装。
配置与使用
1. 建账号
用户 → 用户(Users → Users)→ 创建,为协作者建一个专用账号,例如partner1,见 用户与用户组。- 用户组里只加入
sftp-access。 - Shell 选
/usr/sbin/nologin。界面的列表里有它。 - 用公钥登录时,把协作者的公钥填进 SSH 公钥(SSH public keys)。插件的配置会读取 OMV 保存公钥的位置,所以填在这里就能用。
2. 授权共享文件夹
在 存储器 → 共享文件夹(Storage → Shared Folders)里选中要给协作者的共享文件夹,点 权限(Permissions),给 partner1 本人设置 读/写(Read/Write)或 只读(Read-only)。
这一步不能省,也不能只给 users 这样的组授权:插件按用户本人的权限决定怎么挂载,设成读/写就挂成可写,设成只读就挂成只读,没有设置时不会创建挂载,协作者登录后看到的是空目录。权限的概念见 三层权限。
3. 配置服务
服务 → Sftp → 设置:
| 字段 | 默认值 | 说明 |
|---|---|---|
| 启用(Enable) | 关 | |
| 端口(Port) | 222 | 选一个没被别的 SSH 服务占用的端口 |
| 密码验证(Password authentication) | 开 | 用公钥后请取消 |
| 公钥认证(Public key authentication) | 新装为关(数据库默认值) | 要用公钥必须勾选 |
| 授权组(AllowGroups) | 关 | 勾选,只允许 sftp-access 组登录 |
| Rsyslog | 新装为开 | 把 SFTP 操作写进 /var/log/openmediavault-sftp.log |
| 扩展选项(Extra options) | 空 | 追加到 sshd 配置,语法见 sshd_config 手册,写错会让服务起不来 |
保存,点黄色提示条上的应用。
4. 把共享文件夹绑定给用户
服务 → Sftp → 共享 → 创建(Create),选 用户名(Username)和 共享文件夹,一个条目对应一个用户和一个共享文件夹的组合,重复的组合会被拒绝。保存并应用。
应用后,插件会:
- 创建
/sftp/<用户名>/,属主是 root,这是 chroot 的要求,协作者不能在这一层写入。 - 把共享文件夹用 bind 方式挂到
/sftp/<用户名>/<共享文件夹名>/,挂载选项是bind,rw,nofail或bind,ro,nofail,由上一步的权限决定。 - 登录后的根目录就是
/sftp/<用户名>/,协作者看到的是/<共享文件夹名>/。
5. 客户端连接
sh
# 在客户端电脑上执行。把 <用户名> 和 <NAS 地址> 换成你的
sftp -P 222 <用户名>@<NAS 地址>FileZilla、WinSCP 等图形工具里,协议选 SFTP,端口填 222。第一次连接时客户端会显示主机指纹,这个服务和系统 SSH 用同一组主机密钥,指纹相同。
检查结果
- 在 OMV 的 shell(root)里确认服务在运行、端口在监听:
sh
# 在 OMV 的 shell 里执行(root),只读
systemctl status omv-sftp
ss -tlnp | grep ':222'
mount | grep '/sftp/'- 用协作者账号
sftp登录:ls只应看到共享文件夹;cd ..出不去;往只读的共享里写应当失败。 - 用同一个账号
ssh -p 222 <用户名>@<NAS 地址>,应当被拒绝,通常提示This service allows sftp connections only.。 - 用一个不在
sftp-access组里的账号从 222 端口登录,应当被拒绝。能登录说明没有勾选授权组。 - 在
诊断 → 系统日志(Diagnostics → System Logs)里选sftp类型,能看到登录和文件操作。
备份与维护
- 设置和共享条目保存在 OMV 的配置数据库里,
/etc/ssh/omv_sftp_config由 Salt 生成,不要手改。 - 不要在 shell 里对
/sftp/下的路径做递归删除。 里面的<共享文件夹名>是指向真实共享文件夹的绑定挂载,对它rm -rf删掉的是真实数据。要移除,在 共享 标签里删除条目,插件会先卸载再删目录。 - 删除 共享 条目会立即卸载并应用,不等黄色提示条。
- 数据都在共享文件夹里,按 备份策略 备份。
- 卸载插件会删除配置数据库里的设置、
/etc/ssh/omv_sftp_config和日志,不会删除sftp-access组,也不会动共享文件夹里的数据。
常见问题
登录成功但看到的目录是空的。 没有给用户本人设置共享文件夹权限,或者没有在 共享 标签里添加条目,或者没有点应用。
登录后立刻被断开,日志里有 bad ownership or modes for chroot directory。 chroot 目录必须由 root 所有,且其他用户不能写。/sftp/<用户名> 是插件在每次部署时创建并设成 root 所有、权限 755 的,出现这个错误多半是被手改过。不要再手改,在 OMV 的 shell(root)里重新部署一次,让插件把它恢复:omv-salt deploy run sftp。
公钥登录不上。 确认勾选了 公钥认证,公钥填在 OMV 用户的 SSH 公钥 里,私钥权限在客户端上是 600。
想让协作者上传,但提示没有权限。 挂成读/写不代表一定能写:底层共享文件夹的 Unix 权限和 ACL 仍然生效。协作者要能写入,共享文件夹的权限或 ACL 也要允许他,见 设置共享文件夹权限。
参考资料
- 插件源码:openmediavault-sftp,官方 wiki 没有这个插件的页面
- OpenSSH 手册:sshd_config,其中 ChrootDirectory 一节说明了目录属主的要求