基于 sftp 的 NAS (局域网文件存储服务器)

news2024/10/2 14:25:11

局域网 NAS (文件存储服务器) 的基本功能有: 能够存储文件, 同时能够通过多个设备访问 (上传/下载) 文件. 这些功能通过 sftp 可以实现. sftp 是基于 SSH 的文件传输协议, SSH 全程加密传输, 使用 公钥 认证 (不使用密码/口令), 能够提供很高的安全性.

上文说到, 在 LVM 和 btrfs 的加持之下, 可以获得很高的存储灵活度. 即使只有 2 块硬盘, 也可以同时使用 RAID 0 (文件存储一份) 和 RAID 1 (文件存储 2 份). 并且, RAID 0 和 RAID 1 占用的存储空间还可以做到动态分配 (在线扩容). 硬盘数量方面也很灵活, 2 块硬盘, 3 块硬盘, 4 块硬盘, 都可以使用这种存储方案, 添加新的硬盘也很方便. 每小时一次 快照, 每月一次 全盘数据检查 (读取), 提高了文件存储的安全性. 这就是使用老旧 e5 主机和廉价二手硬盘手搓的存储服务器. (狗头)


相关文章:

  • 《本地 HTTP 文件服务器的简单搭建 (deno/std)》 https://blog.csdn.net/secext2022/article/details/140305479

  • 《使用多用户增强服务器的安全性》 https://blog.csdn.net/secext2022/article/details/139961897

  • 《局域网聊天软件 matrix》 https://blog.csdn.net/secext2022/article/details/140015712

参考资料: https://www.openssh.com/portable.html

目录

  • 1 目录权限设置
  • 2 GNOME (ArchLinux) PC
    • 2.1 配置 SSH 登录服务器
    • 2.2 使用文件管理器访问服务器的文件
  • 3 Android 手机
    • 3.1 使用 termux 生成 SSH 密钥
    • 3.2 授权 质感文件 app 访问 termux 里面的文件
    • 3.3 配置 SSH 连接服务器
  • 4 总结与展望

1 目录权限设置

对不同的文件分类存放, 计划按照 2 个维度分成 4 类:

  • srv2: 重要数据 (不允许丢失), 可以公开. 比如 本文.

  • srv1: 允许丢失的数据, 可以公开. 比如软件安装包, 很容易下载的电影等视频, 学习资料等.

  • sd2: 重要数据 (不允许丢失), 不能公开. 比如自己的照片.

  • sd1: 允许丢失的数据, 不能公开.

其中是否允许数据丢失, 是一个维度. 是否可以公开, 是另一个维度. 分别创建目录存放.


相关命令:

fc-test@MiWiFi-RA74-srv:/mnt/data/bf1s/@fct$ pwd
/mnt/data/bf1s/@fct
fc-test@MiWiFi-RA74-srv:/mnt/data/bf1s/@fct$ ls -al
total 16
drwxr-xr-x. 1 fc-test fc-test  8 Jun 30 11:57 .
drwxr-xr-x. 1 root    root    32 Jun 30 09:38 ..
drwxr-xr-x. 1 fc-test fc-test 24 Jun 30 12:55 srv1
fc-test@MiWiFi-RA74-srv:/mnt/data/bf1s/@fct$ mkdir sd1
fc-test@MiWiFi-RA74-srv:/mnt/data/bf1s/@fct$ chmod 700 sd1
fc-test@MiWiFi-RA74-srv:/mnt/data/bf1s/@fct$ ls -al
total 16
drwxr-xr-x. 1 fc-test fc-test 14 Jul  1 06:11 .
drwxr-xr-x. 1 root    root    32 Jun 30 09:38 ..
drwx------. 1 fc-test fc-test  0 Jul  1 06:11 sd1
drwxr-xr-x. 1 fc-test fc-test 24 Jun 30 12:55 srv1
fc-test@MiWiFi-RA74-srv:/mnt/data/bf1s/@fct$ 

其中 mkdir 命令创建新的目录, chmod 命令更改权限, 700 表示只有自己可以访问.

fc-test@MiWiFi-RA74-srv:/mnt/data/bf2s/@fct$ pwd
/mnt/data/bf2s/@fct
fc-test@MiWiFi-RA74-srv:/mnt/data/bf2s/@fct$ ls -al
total 16
drwxr-xr-x. 1 fc-test fc-test 28 Jun 30 11:57 .
drwxr-xr-x. 1 root    root    32 Jun 30 09:38 ..
drwxr-x---. 1 root    root    62 Jul  1 06:00 .snapshots
drwxr-xr-x. 1 fc-test fc-test 58 Jun 30 13:04 srv2
fc-test@MiWiFi-RA74-srv:/mnt/data/bf2s/@fct$ mkdir sd2
fc-test@MiWiFi-RA74-srv:/mnt/data/bf2s/@fct$ chmod 700 sd2
fc-test@MiWiFi-RA74-srv:/mnt/data/bf2s/@fct$ ls -al
total 16
drwxr-xr-x. 1 fc-test fc-test 34 Jul  1 06:11 .
drwxr-xr-x. 1 root    root    32 Jun 30 09:38 ..
drwxr-x---. 1 root    root    62 Jul  1 06:00 .snapshots
drwx------. 1 fc-test fc-test  0 Jul  1 06:11 sd2
drwxr-xr-x. 1 fc-test fc-test 58 Jun 30 13:04 srv2
fc-test@MiWiFi-RA74-srv:/mnt/data/bf2s/@fct$ sync

在 RAID 1 上进行类似的操作.

fc-test@MiWiFi-RA74-srv:~$ ls -al /mnt/data/bf1s/@fct
total 16
drwxr-xr-x. 1 fc-test fc-test 14 Jul  1 06:11 .
drwxr-xr-x. 1 root    root    32 Jun 30 09:38 ..
drwx------. 1 fc-test fc-test  0 Jul  1 06:11 sd1
drwxr-xr-x. 1 fc-test fc-test 24 Jun 30 12:55 srv1
fc-test@MiWiFi-RA74-srv:~$ ls -al /mnt/data/bf2s/@fct
total 16
drwxr-xr-x. 1 fc-test fc-test 34 Jul  1 06:11 .
drwxr-xr-x. 1 root    root    32 Jun 30 09:38 ..
drwxr-x---. 1 root    root    62 Jul  1 06:00 .snapshots
drwx------. 1 fc-test fc-test  0 Jul  1 06:11 sd2
drwxr-xr-x. 1 fc-test fc-test 58 Jun 30 13:04 srv2
fc-test@MiWiFi-RA74-srv:~$ 

这就是最终的结果了, 一共 4 个目录, 分别存放不同的文件: sd1srv1 目录位于 RAID 0 上 (文件只存储一份), 存储允许丢失的数据. sd2srv2 位于 RAID 1 上 (在两块硬盘上分别存放一份, 互为镜像), 存储重要数据 (不允许丢失). 由于 RAID 0 (btrfs) 没有开启条带 (也就是单个文件连续存储, 而不是打散成数据块分散存储), 所以如果损坏一块硬盘, RAID 0 大约丢失一半数量的文件 (另一半文件基本完好), 而 RAID 1 不会丢失文件.

其中 sd1sd2 存放不能公开的数据, 只有通过 SSH 登录 (公钥认证) 之后才能访问 (读写). srv1srv2 存放可以公开的数据, 并通过 HTTP 服务器对整个局域网提供下载 (只读), 方便访问.

这种分类存储方案, 在数据安全 (SSH) 和方便访问 (HTTP) 之间取得了平衡, 在防止数据丢失 (RAID 1) 和节省存储空间 (RAID 0) 之间也取得了平衡.

fc-test@MiWiFi-RA74-srv:~$ ln -s /mnt/data/bf1s/@fct/sd1 sd1
fc-test@MiWiFi-RA74-srv:~$ ln -s /mnt/data/bf2s/@fct/sd2 sd2
fc-test@MiWiFi-RA74-srv:~$ ls -al

lrwxrwxrwx. 1 fc-test fc-test       23 Jul  1 06:13 sd1 -> /mnt/data/bf1s/@fct/sd1
lrwxrwxrwx. 1 fc-test fc-test       23 Jul  1 06:13 sd2 -> /mnt/data/bf2s/@fct/sd2
lrwxrwxrwx. 1 fc-test fc-test       24 Jun 30 11:59 srv1 -> /mnt/data/bf1s/@fct/srv1
lrwxrwxrwx. 1 fc-test fc-test       24 Jun 30 11:59 srv2 -> /mnt/data/bf2s/@fct/srv2

为了方便访问, 可以使用 ln -s 命令创建符号链接.

2 GNOME (ArchLinux) PC

本章节适用于 PC (台式机/笔记本), 以 ArchLinux 操作系统举栗. 别的操作系统也是类似的.

2.1 配置 SSH 登录服务器

  • (1) 生成 SSH 密钥, 比如:

    ssh-keygen -t ed25519 -C fc-server-202406 -f ~/.ssh/id_ed25519-fc-server-202406
    

    详见文章: 《安装 Fedora CoreOS 操作系统》 https://blog.csdn.net/secext2022/article/details/139805083

  • (2) 将 公钥 写入服务器的配置文件, 比如:

    fc-test@MiWiFi-RA74-srv:~$ cat ~/.ssh/authorized_keys.d/sftp
    ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILPbf/zBsqQw86+uqA9PoL1IlquO04KKrOTpzhRTbvCR fcst-p9-20240701
    ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIk8koHw0tEFA+frh+uSqijJOv2aRtKodITqgAibaNXE fcst-c6-20240701
    

    每个公钥一行, 如果有多个设备需要登录, 每个设备都有自己的公钥, 就多写几行.

  • (3) 修改本机的 SSH 配置文件, 比如:

    > cat ~/.ssh/config
    
    Host fc-server
        HostName fc-server.test
        User fc-test
        IdentityFile ~/.ssh/id_ed25519-fc-server-test-202406
    

    然后使用 ssh fc-server 命令测试登录是否成功.

2.2 使用文件管理器访问服务器的文件

GNOME 桌面环境自带的文件管理器, 对 sftp 有很好的支持, 直接就可以使用. (别的桌面环境, 比如 KDE, 应该也可以, 只是窝用的 GNOME, 所以就以 GNOME 举栗. )

相关链接: https://apps.gnome.org/zh-CN/Nautilus/

在这里插入图片描述

点击 其它位置.

在这里插入图片描述

输入服务器地址.

在这里插入图片描述

输入 ssh://fc-server, 点击 连接.

在这里插入图片描述

然后就能看到服务器上的文件了.

在这里插入图片描述

可以按键盘快捷键 Ctrl+D 把位置添加到收藏夹, 方便快速访问.

然后就和访问本地文件基本一样了, 比如视频文件可以直接打开播放. 这边是千兆以太网局域网, 上传/下载速度可达 110MB/s, 跑满带宽了. 窝感觉挺好用哒 ~ 赞 !

3 Android 手机

在手机上可以使用 质感文件 (MaterialFiles) app: https://github.com/zhanghai/MaterialFiles

3.1 使用 termux 生成 SSH 密钥

安装 termux: https://termux.dev/en/

在 termux 中安装 openssh 的命令:

pkg install openssh

然后使用 ssh-keygen 命令生成 SSH 密钥:

在这里插入图片描述

在这里插入图片描述

使用 cat 命令查看 公钥:

在这里插入图片描述

然后将公钥写入服务器的配置文件 (详见上文).

3.2 授权 质感文件 app 访问 termux 里面的文件

在这里插入图片描述

打开质感文件 app.

在这里插入图片描述

点击左上角 “三条横线” 按钮, 打开侧边栏.

在这里插入图片描述

点击 添加存储空间.

在这里插入图片描述

点击 外部存储空间.

在这里插入图片描述

点击左上角 “三条横线” 按钮, 打开侧边栏.

在这里插入图片描述

点击 Termux.

在这里插入图片描述

点击 使用此文件夹.

在这里插入图片描述

点击 允许.

在这里插入图片描述

然后 质感文件 app 侧边栏就会多出一个 home, 这个就是 termux 的文件.

3.3 配置 SSH 连接服务器

在这里插入图片描述

回到这个界面, 点击 SFTP 服务器. 注意不要选错类型了 ! 这几个名称有点像.

在这里插入图片描述

输入服务器信息.

在这里插入图片描述

主机名 填写服务器的 IP 地址. 路径 就是对应的服务器上的文件 (目录) 路径. 名称 就是显示的名称, 只是为了方便显示, 随意填写. 验证 选择 公钥. 用户名 就是通过 SSH 登录服务器使用的用户名.

然后点击 私钥 右边的图标, 来读取私钥文件:

在这里插入图片描述

打开侧边栏.

在这里插入图片描述

点击 home.

在这里插入图片描述

点击右上角 “三个点”.

在这里插入图片描述

点击 显示隐藏文件.

在这里插入图片描述

点击进入 .ssh 目录.

在这里插入图片描述

选择 私钥 文件 (以 .pub 结尾的是 公钥, 选择另一个文件).

选择后会自动返回这个界面:

在这里插入图片描述

点击 连接并添加.

在这里插入图片描述

然后侧边栏出现 fc-server 就是服务器上的文件.

在这里插入图片描述

点击即可访问.

在这里插入图片描述

喵呜 ~~ !

4 总结与展望

基于 sftp 搭建局域网文件存储服务器 (NAS) 还是很简单的, 只需要安装好 Fedora CoreOS 操作系统, 配置好存储 (比如 LVM/btrfs) 即可. SSH 是服务器系统自带的, 只要能通过 SSH 登录服务器, 就自动的获得了一只 NAS, 妙 !

PC 和手机都能通过 sftp 协议来访问服务器上的文件, 使用很方便. 这下 3 只手机和 2 个 PC 的文件就能集中整理存放了. 全部使用 SSH 公钥 加密认证 (登录), 不使用密码 (口令), 显著提高了安全性. 如果需要多人共享使用, 可以在服务器上创建多个用户 (详见文章 《使用多用户增强服务器的安全性》), 通过适当设置文件的 Linux 访问权限, 可以做到互不影响, 保持很高的灵活度与安全性. btrfs 的 RAID 1 和快照等功能, 从多个方面保护了存储的数据 (详见文章 《本地 HTTP 文件服务器的简单搭建 (deno/std)》), 比如一块硬盘突然损坏, 误操作删除文件, 或者遭遇加密勒索恶意软件. LVM 使得添加/更换硬盘十分方便. 作为低成本的文件存储服务器, 挺适合窝等穷人使用的.

此处只实现了 NAS 服务器的基础功能 (文件存储, 多设备访问), 还可以在存储的基础上, 添加一些扩展功能, 这些以后再慢慢完善. 除了文件存储, 服务器还可以方便的通过容器/虚拟机等部署更多应用, 成为多功能的综合服务器.

只使用 RAID 1 和快照来保护存储的数据文件是不够的, 比如无法应对整个服务器损坏/丢失, 火灾/地震/洪水等自然灾害. 还需要有额外的数据备份计划, 比如传说中的 “3-2-1” 备份, 网盘备份, 高可用异地灾备等, 都是可以考虑的发展方向. 加油, 年轻人 !


Windows ?

虽然窝基本不用, 但是在此顺便说一句: sftp 支持 Windows. 至少有 2 种使用方式:

  • (1) https://winscp.net/eng/docs/lang:chs

    winscp 是一个独立的 sftp 客户端软件, 可以用来上传/下载文件.

  • (2) https://github.com/winfsp/sshfs-win

    sshfs-win 的安装更复杂一些, 可以将 sftp 服务器作为网络硬盘使用.


本文使用 CC-BY-SA 4.0 许可发布.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1912597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

存储产品选型策略 OSS生命周期管理与运维

最近在看阿里云的 云存储通关实践认证训练营这个课程还是不错的。 存储产品选型策略、对象存储OSS入门、基于对象存储OSS快速搭建网盘、 如何做好权限控制、如何做好数据安全、如何做好数据管理、涉及对象存储OSS的权限控制、使用OSS完成静态网站托管、对OSS中存储的数据进行分…

《植物大战僵尸杂交版》2.2版本:全新内容与下载指南

《植物大战僵尸杂交版》2.2版本已经火热更新,带来了一系列令人兴奋的新玩法和调整,为这款经典的塔防游戏注入了新的活力。如果你是《植物大战僵尸》系列的忠实粉丝,那么这个版本绝对值得你一探究竟。 2.2版本更新亮点 新增看星星玩法 这个新…

QT学习日记一

创建QT文件步骤 这是创建之后widget.cpp和widget.h文件的具体代码解释,也是主要操作的文件,其中main.cpp不用操作,ui则是图形化操作界面,综合使用时,添加一个元件要注意重编名和编译一下,才能在widget这类…

tomcat 项目迁移,无法将项目作为服务service启动

背景 测试服务器需要迁移到正式服务器上,为了方便省事,将测试服务器上的一些文件直接复制到正式服务器 问题 使用startup启动项目之后,可以直接使用使用tomcat9w启动,或者作为服务service启动的时候,显示无法访问到资源…

STM32 GPIO的工作原理

STM32的GPIO管脚有下面8种可能的配置:(4输入 2 输出 2 复用输出) (1)浮空输入_IN_FLOATING 在上图上,阴影的部分处于不工作状态,尤其是下半部分的输出电路,实际上是与端口处于隔离状态。黄色的高亮部分显示…

程序中的log4j、stderr、stdout日志区别

使用 databricks 的过程中,发现他将日志分为 log4j、stderr、stdout日志。了解日志是调试程序关键技能。顺着这个思路,我认真学习了一下这几个日志的区别。 目录 Java 中的日志目录结构使用log4j记录日志向标准输出和标准错误输出写信息运行结果 以pytho…

前端八股文 闭包的理解

什么是闭包 闭包是指有权访问另一个函数作用域中的变量的函数 ——《JavaScript高级程序设计》 (闭包 内层函数 引用的外层函数的变量) 下面就是一个简单的闭包 闭包不一定必须有 return 闭包不一定有内存泄漏 闭包 什么时候用到 return 就是 外部…

Flutter-实现物理小球碰撞效果

效果 引言 在Flutter应用中实现物理动画效果,可以大大提升用户体验。本文将详细介绍如何在Flutter中创建一个模拟物理碰撞的动画小球界面,主要代码实现基于集成sensors_plus插件来获取设备的加速度传感器数据。 准备工作 在开始之前,请确保在pubspec.yaml文件中添加senso…

中职网络安全Server2216

任务环境说明:✓ 服务器场景:Server2216(开放链接)✓ 用户名:root密码:1234561.黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程找出启动异常进程的脚本,并将其绝对路径作为Flag值提交…

2.17分一区文献精读:机器学习:乳腺癌预后预测的统计和机器学习模型的开发及内外部验证:队列研究-摘要

#精医求精,文献阅读 大家好,我是蔡老师,一个立志学会所有医学大数据分析模型的女子 今天我们从文献阅读开始 这篇文章的影响因子为17分,全文名称为《Development and internal-external validation of statistical and machine l…

Tensorflow之损失函数与交叉熵

损失函数:预测值与已知答案之间的差距 NN优化目标:loss最小{mse, 自定义, ce) 均方误差tensorflow实现,loss_mse tf.reduce_mean(tf.sqrue(y_-y) 预测酸奶日销量,y,x1, x2是影响日销量的因素…

什么是RPC?有哪些RPC框架?

定义 RPC(Remote Procedure Call,远程过程调用)是一种允许运行在一台计算机上的程序调用另一台计算机上子程序的技术。这种技术屏蔽了底层的网络通信细节,使得程序间的远程通信如同本地调用一样简单。RPC机制使得开发者能够构建分…

leetcode--恢复二叉搜索树

leetcode地址:恢复二叉搜索树 给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。 示例 1: 输入:root [1,3,null,null,2] 输出:[3,1,null…

Mac下flutter运行iOS模拟器

上篇flutter环境安装(Macvscode)已经将vscode和xcode等开发环境都搭建起来了,vscode新建工程还是比较方便的,那么,建立好了之后,我们怎么看效果呢? 1. vscode新建项目 通过 vscode的命令命板(…

Collection 和 Collections 的区别与用法

Collection 和 Collections 的区别与用法 1、Collection 接口1.1 主要特点1.2 常见方法 2、 Collections 工具类2.1 主要特点2.2 常见方法 3、示例代码3.1 使用 Collection 接口3.2 使用 Collections 工具类 4、总结 💖The Begin💖点点关注,收…

JAVA从入门到精通之入门初阶(一)

1. 认识变量 一、 首先变量名要遵循如下命名规则: 1. 变量名只能由字母、数字和下划线组成 2. 变量名必须以字母或下划线开头 3. 变量名大小写敏感 4. 变量名不能使用关键字,如const、static等 5. 变量名应具有描述性,以便于代码的可读性…

三级_网络技术_12_路由设计技术基础

1.R1、R2是一个自治系统中采用RIP路由协议的两个相邻路由器,R1的路由表如下图(a)所示,当R1收到R2发送的如下图(b)的(V.D)报文后,R1更新的4个路由表项中距离值从上到下依次为0、3、3、4 那么,①②③④可能的取值依次为()。 0、4、…

240709_昇思学习打卡-Day21-文本解码原理--以MindNLP为例

240709_昇思学习打卡-Day21-文本解码原理–以MindNLP为例 今天做根据前文预测下一个单词,仅作简单记录及注释。 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积 𝑊_0:初始上下文单词序列𝑇: 时间步当生成EOS标签时&a…

使用OpenCV的absdiff函数报错

1.absdiff用法 absdiff函数用于计算两个输入图像之间每个像素的差异,并返回结果图像。 void cv::absdiff ( InputArray src1,InputArray src2,OutputArray dst ) //eg:比较两图像的差异 /*cv::Mat diff;cv::absdiff(depLeft32, imDepth, diff…

Spring MVC深入理解之源码实现

1、SpringMVC的理解 1)谈谈对Spring MVC的了解 MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。 Model:数据模型,JavaBean的类,用来进行数据封装…