
封面来源:Sora
这篇文章宣告了LiH的个人网络空间(一期)搭建企划完成!ヾ(≧ ▽ ≦)ゝ
趁记忆还新鲜,就此记录下来!若能给有相似需求的你提供些微帮助,也是我的荣幸啦(*^▽^*)
需求分析
发现问题,分析问题,解决问题
问题导致需求,需求呼唤解决方案。
大抵是进入研究生阶段以后吧。结束了本科阶段一台笔记本打天下的局面,形成了台式机+(公用)工作站+笔记本电脑的设备矩阵,随之产生了许多问题。一段时间以后,总结得到了如下需求清单:
-
远程开机:唯一真神,无需多言。
- ”没有硬件支持你操作个屁“
-
自动联网:连接校园网需要打开浏览器,手动点击登录按钮。平时这不是大问题,但若人在外地,就闭环了。
- “你必须先给台式机联网才能远程”
- ”我应该怎么联网?“
- ”先远程上台式机,点一下就好“
-
跨设备数据同步:版本管理地狱。
- ”计算程序V1_台式机.zip“,“计算程序V2_笔记本.zip”,“计算程序V3_台式机.zip”,…
- ”明天线下测试记得带最新版程序!“ ”OK!“
- ”卧槽,怎么不是最终版“
-
数据冗余/备份:复活吧我的硬盘们(×
- “卧槽,我写了两周的报告啊”
- “这还玩集贸啊,跳了”
-
软件环境配置:一配一个不吱声。
- “好家伙,原来guacamole不支持最新jdk啊,降回旧版好了。”
- “卧槽,我咋不知道我有这么多java应用要新版jdk?”
- “
算了,重装吧”
嗯,看着确实很迫切。说干就干。
技术路线
需求分解
上面五个需求可以分为3类:
- 网络类:需求1+需求2
- 数据类:需求3+需求4
- 环境类:需求5
有成品方案和自建方案可供选择~
TIP适合自己的才是最好的。
成品方案
其实,对以上大部分需求,都有成品方案可供选择。
- 远程开机:成品路由器提供的网络唤醒功能 / 智能插座+来电启动 / 社会工程学(“在工位的好心人帮我开个机”);
- 自动联网:挂python脚本 / 同社会工程学;
- 数据同步:共享文件夹;
- 数据冗余/备份:硬盘盒。
你可能觉得“这些方法已经足够了”。其实也确实,这些方法都能实现目标功能。
但够用≠好用,正是这些方案存在的部分问题,让我下定决心替换掉它们:
- 社恐:社会工程学手段固然是好。但一方面,工位不一定有人;另一方面,总是麻烦别人也不好,INTJ还是选择靠自己。
- 拓展性缺失:成品设备的功能过于专一,且过度依赖厂商。“我想有这个功能!”“抱歉,现在我们还没有提供呢”。
- 手工干预/重复劳动多:资料备份实在是个苦力活,每次往硬盘盒里备份总是会怀疑人生;共享文件夹有时存在权限问题,而且Linux下好像用不了;自动联网脚本运行在台式工作机上,等重装系统/换设备之后又要重新装一遍,重复劳动。
但如果你还是觉得这些都不是事,那其实你已经找到了适合自己的路,挺好的。
自建方案
如果你也接受不了成品方案的缺点,还是决定自建?好的,那请继续往下看吧。搭建过程虽然艰难,但完成时的成就感将无与伦比。
-
对网络类需求,明显可以用一台24小时开机的路由器解决。WoL还好说,但自动联网这样的高级功能怎么办?上软路由!
-
对数据类需求,集中在数据同步以及冗余/备份方面。这正是NAS的专长。就决定是你了!
-
对环境类需求,看看现有的解决方案是什么?“容器化”。好的,那还需要一个宿主机提供容器环境。
这么看来,软路由+NAS+容器就能把我们的需求包圆了。
再仔细想想,设备间有没有潜在冲突?
↓能给→提供什么 | 软路由 | NAS | 容器 |
---|---|---|---|
软路由 | / | 提供局域网环境与固定内网IP | 提供局域网环境与固定内网IP |
NAS | / | / | 提供外挂的持久化储存空间 |
容器 | / | / | / |
这么看来,不但没有冲突,设备之间还能联动:
- 软路由为NAS与容器提供局域网环境与固定内网IP,稳定的内网环境可太重要了;
- NAS为容器提供mount point,将一些需要长期储存的用户数据进行冗余/备份。
太棒了,就这么来吧。继续给每项技术选一下型。
技术选型
软路由
闲话少说,先拉个表。
方案 | 💰价格 | 🧩拓展性 | 备注 |
---|---|---|---|
硬路由刷固件 | 高 | 较弱 | 贵,而且固件容量小,但可以充分利用现有硬件。 |
原厂固件基于openwrt魔改的硬路由 | 较高 | 较强 | 看了一下glinet这些,但网上资料少,最后没敢下手。 |
ARM软路由 | 较低 | 强 | 某些ARM芯片对应的openwrt插件较少,别的没啥问题。 |
⭐️x86软路由 | 较高 | 强 | 插件丰富,性能强,除了价格稍贵没有任何问题。 |
搭建初期,使用了硬路由刷固件的方案,红米AC2100做主路由。
但128M的闪存大小实在捉襟见肘,遂换主路由为N100小主机,AC2100退居AP。
(P.S. N100的性能着实过剩,J1900跑千兆/N4500跑2.5G足足够了)
NAS
方案 | 💰价格 | 🧩拓展性 | 备注 |
---|---|---|---|
成品NAS | 高 | 较弱 | 费钱省事 |
⭐️自建NAS | 较低 | 强 | 省钱费事,拓展性强 |
作为爱折腾一族,自然是选择自建NAS;-)
我对NAS的需求很简单:
- 网络存储服务;
- 最大程度的数据完整性。
至于容器等其它应用?我个人的态度是专业的人干专业的事。搞一个额外的linux虚拟机装容器并不多费多少事,但却带来了解耦的关键优势。
- 万一哪天把容器玩坏了,我只需要重装一下负责容器的虚拟机;
- 但如果与NAS耦合,就只能重装NAS系统了。
后者显然给数据安全带来了更多的不确定性。
因此,我最后的选择是TrueNAS Core,两块HC550组raid1进行冗余。ZFS的快照功能实在强大,再也不用担心误删文件了。
对了,还花了18/月买了1TB的Onedrive存储空间,由TrueNAS自动对工作文件夹进行每日备份。Win系统下可以直接访问,可太友好了。
容器
我的选择是Docker。就这么点设备,实在没必要上集群管理,搞一台linux虚拟机装一下就好了。
那么这台虚拟机装在哪里好呢?
- 工作机?并非24小时开机,Pass;
- 路由器?网络设备我还是希望稳一点,不然炸到连网都上不了就完了;
- 独立物理机?确实挺好,但是贵,买不起啊;
- NAS?好像不错,刚好因为挂载点的原因,容器服务器需要与NAS同时启动。
但在NAS一节,已经说过想把NAS系统和容器虚拟机分开了。怎么破?
答案是虚拟环境。通过在底层虚拟环境上启动两个虚拟机,第一个为NAS,第二个是容器服务,即可完美实现解耦。
更棒的是,虚拟环境提供启动顺序选择功能,可以设置开机时NAS先启动,容器后启动,便不会有挂载点失效的问题了。
关于具体的虚拟环境选择,常用的有Esxi、PVE等。我选择了PVE,无它,硬件兼容性好(方便我淘洋垃圾10G网卡),而且网上教程实在太多了,very方便。
技术路线总结
拉个表来总结吧。
对应需求 | 技术选型 | 具体技术方案 | 物理宿主 |
---|---|---|---|
需求1、2 | 软路由 | x86 Openwrt | N100小主机 |
需求3、4 | NAS | TrueNAS Core + Onedrive | i3-8100主机with PVE |
需求5 | 容器 | docker on linux | i3-8100主机with PVE |
好,看起来没啥问题了,开干。
当然,这会已经干完了。
已实现功能&网络拓扑
基本功能
基本功能即以上五点需求,均已按照技术路线顺利完成。主要的容器服务如列表。
功能名称 | 使用软件/镜像 |
---|---|
自建git仓库 | gitea |
容器管理 | portainer |
音乐服务 | navidrome |
微信 | docker-wechat |
百度网盘 | baidunetdisk |
BT下载 | qbittorrent |
网站部署 | docker-fuwari |
完成后将会发现,不经意间再次解锁了两项成就:存算分离/软件隔离。
存算分离
所有工作电脑上,将不保存工作文件/仅保留临时文件。这给更换设备/重装系统带来了极大的便利。
- 传统的重装
- 哎,这破电脑,软件环境已经成依托了,想重装;
- 算了算了,备份太麻烦了,凑合用吧。
- 存算分离后的重装
- 今天心情不好,重装就重装;
- 挂载下NAS,装好软件又可以开用了!
再也不用操心手动备份的事,也不怕丢数据了。
软件隔离
部分软件,尤其是国内部分软件的开发质量实在一言难尽,已经到了完全不想在工作机上装的程度。难受的是,还不得不用,这对我这样的赛博洁癖患者简直难以忍受。
那么,解法是什么?
统统打包丢进容器!对某聊天软件和某网盘已经采取了相关策略。设置要点如下:
- 关键文件夹挂载:将聊天文件夹/下载文件夹直接挂载到NAS上,即可直接在其它设备上找文件;
- VNC访问:提供VNC访问端口,方便访问软件GUI。
这样,工作机不用装对应的软件,也可使用对应的功能了,爽!
拓展功能
完成了基础功能的搭建,自然想着多干些什么。搭建完成的系统具有很强的拓展能力,现在已经拓展出了公网访问与远程桌面两个功能。
远程桌面
鉴于Todesk、向日葵等远程桌面软件常常爆出安全漏洞,最近吃相也比较难看,选择自建远程桌面。
选择了Apache Guacamole远程桌面网关。打开工作机的RDP端口,即可通过浏览器享受到RDP via HTTP的访问服务。
公网访问
仅在内网提供服务虽然也挺好,但我们的目标不止于此。公网访问是提升使用体验的重要一环,否则局限还是太大。
为了实现公网访问,购买了一台某平台的云服务主机。其上部署了本网站,同时使用SSH隧道实现内网向公网的映射。
公网访问的安全性是很重要的一环,直接进行端口暴露还是过于冒险了。为了提升安全性,形成了一套Nginx反代 + HTTPS终止代理 + base_http_auth + fail2ban的安全方案,服务器本身的SSH也配置成了禁止root登陆+仅允许公钥访问,安全性max。
总结而言,投入使用的公网服务如下:
功能名称 | 部署地点 | 使用软件/协议 | 公网访问性 |
---|---|---|---|
数据存储 | NAS | TrueNAS | ✔️ WebDAV |
SSH | NAS/主路由/AP/台式机/Gitea | OpenSSH | ✔️ SSH ProxyJump |
远程桌面 | 台式机 | RDP | ✔️ Apache Guacamole |
自建git仓库 | NAS - Docker | gitea | ✔️ HTTPS, SSH |
最终网络拓扑
完成了以上所有功能的部署,最终的网络拓扑图如下所示。真是个大工程呢喵(×
参考设备清单
❌参考设备清单
✅不得不品的军火展示环节~~(存不下钱的原因找到了~~
名称 | 功能 | 附加说明 | ¥ |
---|---|---|---|
台式机 | 高性能处理 | Windows 10 | 没自己花钱 |
笔记本 | 外出携带 | Windows 11 | 4000 |
NAS | 存储+Docker | PVE (内含TrueNAS和Docker虚拟机) | 2400 |
HDD | 存数据 | HC550 16T * 2 | 2*900 |
路由器 | 主路由 | PVE (内含Openwrt) | 750 |
10G交换机 | 拓展网口 | / | 149 |
云服务器 | 公网访问 | Debian | 99/年 |
onedrive | 云端存储 | / | 18/月 |
小结
碎碎念了许久,写得也不太有章法,十分感谢能看到这里的你!
后续计划:详细写写每一部分的详细配置过程,但科研任务实在比较多,随缘更新~
就酱!