作为本站的第一篇文章,那必须是“吃水不忘挖井人”,那就写写这个网站的搭建环境和目前我的整一套网络架构吧,或许可以给同行、同好一定的思路借鉴,私以为本方案甚至可以直接应用于小微企业的工作环境部署当中,因篇幅所限及精神不佳,只能先综述思路,后面有空再分开细讲。

概述

为控制成本,部署服务时我完全抛弃了现在大吹特吹的各种存算分离、分布式结构,甚至将个人用网与对外服务糅合在一起,下面就分这两大部分进行介绍。实际部署中主要涉及以下组件,结构还是比较简单的

项目

描述

阿里云服务器

在阿里云优惠购得的一台2U2G 200M的ECS弹性计算服务器

5G CPE

相当于路由器+交换机+无线网卡,型号是鲲鹏的C8-668

NAS

服务器的主体,存算一体,型号是绿联的DX4600

用网设备

包括手机、电脑、平板等,需要访问广域网,也需要访问上面的几台设备

对外服务

各位读者所看到的此网站正是该网络结构中对外服务的体现,广域网设备访问NAS服务器的路径如图所示

NAS

NAS原为“网络附属存储”设备,但因其全天候运行、存储容量大、算力有较多剩余,我就同时也把它作为了我自己的服务器,毕竟自托管的服务器自己知根知底,配置也比阿里云的最低配要高一些,一次购买则可以终身使用,不需要续年费。

我的NAS部署在宿舍内,搭配UPS实现停电后自动关机以保护硬盘(不设计断电后继续运行的能力),拥有8G运行内存,x86架构,支持Docker部署,有四个机械硬盘位,目前是插了两块希捷的16G红盘组Raid 1作冗余备份,另外加一条致钛的2T SSD(长江颗粒)日常运行Docker和NAS系统本身,以便让机械硬盘及时休眠。

NAS上的服务均以Docker形式部署,方便快捷且环境隔离,自认为十分适合自己的需求,部署NPM中文版(nginx-proxy-manager-zh-cn)统一反向代理以对外提供服务,隐藏服务实际端口,同时提供SSL证书统一管理,实现https访问。

具体各项服务也是通过Docker的方式部署,而后暴露服务端口,再由nginx反向代理此端口

  1. 本站,基于Halo,通过Docker部署Halo 2的镜像

  2. 自己开发的项目:在IDE辅助下打包成Docker上传到NAS上运行

  3. 一些静态网站:一般以nginx为基础镜像打包成独立的Docker,上传到NAS上运行;如经常有内容修改需求的考虑将html目录映射到宿主机指定目录,更新时直接改目录即可

  4. 其它优秀的Docker项目:用Alist搭建文件共享服务、用LibreSpeed搭建测速站点用来测试各种不同网络环境下的连接速度、卷王用于自定义问卷、Clash和yacd用于学术研究、tailscale用于虚拟组网进行后台管理等、aria2用于离线下载、openp2p作为虚拟组网的备用方案、gitea搭建了私有的git托管服务管理自己的代码和项目、adguard home已搭建好但还没在用、homeassistant用于管理宿舍内的物联网设备

5G CPE

CPE实际上就是个无线上网终端,其实可以理解为类似于开了移动热点的手机,将电话卡或流量卡的信号编程WiFi信号或有线网络共享给大家用,但是相比于手机开热点就更为稳定,且提供更高速率的接入,我的CPE采用的是鲲鹏的C8-668,8G存储足够部署很多服务,出厂支持双系统,简单操作后即可刷入OpenWrt系统,实现高度的自定义,具体怎么折腾的后面有空再慢慢道来。对外服务这块,因为CPE实际上就是采用了流量上网,而我国大陆地区的流量上网现在已经全部支持ipv6了,经过测试,我通过CPE上网也能够获取到一个动态的公网ipv6地址,不再需要对着运营商的NAT唯唯诺诺了,在OpenWrt上部署了Lucky进行动态域名解析(DDNS),随后通过端口转发将NAS上的nginx-proxy-manager端口映射到外网的80端口和443端口,实现http和https的访问,也能一定程度上保护内网设备端口。在外网(指广域网)如需管理设备,或者访问任何设备的任何端口,需要通过Tailscale搭建VPN后才能访问,实现了个人的安全连接。

虽然CPE也支持Docker部署,但是考虑到其算力和存储均有限,且还要担负起交换机、路由器等任务,故不在CPE上部署Docker服务

经过Lucky动态解析后,就可以通过域名访问到CPE了,又因为有80端口和443端口的转发,通过域名访问无论是http还是https都能直接转发到了nginx-proxy-manager上,由nginx根据请求域名的不同转发到不同的内网端口,这样就能访问相应的服务了。

但是,由于运营商只提供了ipv6的公网ip地址,所以目前只能保证用网设备(如手机,或者别的用户)也处在ipv6环境下才能访问,如果用户使用的是流量,那一般都没问题,但是现在还有很多有线接入、WiFi、校园网等尚未支持ipv6,因此需要加入Cloudfare的CDN能力。

我的域名原本是在阿里云上购买的,默认使用阿里云的DNS解析服务,需要自定义DNS服务器为Cloudfare的那两个DNS域名,经过简单的配置后Cloudfare即接管了域名解析,记得在Lucky中也要相应修改DNS解析服务提供商为Cloudfare,对于需要实现ipv4访问的域名,在cloudfare的DNS中打开“代理”开关,即可实现通过CDN访问。

但是由于Cloudfare最近的服务器也在香港,大陆没有,所以访问延迟会比较高,实测大概在200ms到600ms不等,通过ipv4和ipv6访问的速度也会有明显差异,ipv4测试下载速度只有4mbps左右,ipv6下测试能到30mbps,内网实测上传速率是100mbps,不经过Cloudfare的CDN直连ipv6测速能有60mbps的下载速度,使用Tailscale测试下载速度1mbps出头的样子,由此可以看到不同网络环境下的差异,但是实际使用体验下来卡顿感觉也不算明显。综上,可以建议用户尽量用ipv6环境访问我们的服务。

CDN还有一个好处就是可以隐藏我们的真是IP地址,一定程度上降低我们被网络攻击的风险。

为了使用体验更好,后面还打算研究研究如何实现ipv6走直连,ipv4走CDN,毕竟ipv6地址又长又臭很难被扫描,而且动态地址经常变,为了速度牺牲一点安全性也未尝不可。

阿里云ECS

到这里你已经能在全球任何有网络的地方访问到我们的NAS服务了,那么ECS到底用来做什么呢?答案是没用。这台ECS是我布置好上面所说的网络环境前购买的,现在还没到期。目前还有一些没来得及迁移的服务在上面跑,但是配置是在太拉,多跑几个Docker就要负载超标,得等半个小时才连得上那种,所以现在正在逐渐减少使用它。

之前尚未实现ipv4访问NAS的时候,便是设置了几个域名的ipv4解析到ecs上,弹出"该网站仅支持ipv6访问"的提示

服务器是Debian的,现在是部署了1panel,常常需要借助面板才能更高效地管理服务器,所以部署了1panel服务,在服务器到期前,如果NAS这边出现了断电、断网或其它问题,则可以将部分服务以Docker容器的方式迁移到ecs上实现临时灾备,但我想我这也没有如此重要的项目。

个人用网

日常上网

除了对外提供服务之外,我的这套网络架构还需要支持局域网内设备的日常上网需求,我个人的主要需求就是带宽要够大(怎么着至少也得200mbps的下行速率吧),通过C8-668所配的内置流量卡可以实现,通过流量上网比校园网还是来得快多了。但毕竟流量有限,且无线信号受很多因素影响,基站负载也说不清楚,所以在CPE中我通过mentohust实现了有线校园网的接入和认证,通过mwan3负载均衡实现了带宽叠加,同时实现了分流,对于教育网的目标则全走校园网接口,对于联通的目标则全走联通的接口,其余则按照测速分配,即流量上网与校园网为5:1,由于校园网带宽极小(连标称都只有百兆),实测不超20mbps,所以带宽叠加效果不明显,但实测与叠加前扔有一定提升;校园网上传不限速,因此叠加后上传速度提升相对较明显,具体参数还需要后续调试优化,需要注意的是使用mwan3进行带宽叠加会导致网络延迟增大到三位数,如果对于打游戏需求较大的用户,建议不使用叠加或建立游戏ip列表,对游戏有关的ip指定走固定的一个接口。

我还在CPE上部署了OpenClash并进行了本地DNS劫持,实现只要连入我的WiFi或有线接入网络,即可访问谷歌学术等研究网站,使用ChatGPT等学术工具,不再需要额外配置本地代理,结合上一段所述的带宽分流,也可以访问到教育网内的资源和学校内网资源(广域网中有些是无法访问的,需要配置学校的VPN才能访问),基本上代表着只要接入此网络即可访问各种常用网站。

通过设置Clash的上游服务器指向NAS上的AdGuard Home,设想着在访问谷歌学术等研究网站的同时也能实现无感的广告屏蔽和跟踪屏蔽,但是尚未成功实现是,遂暂时停用AdGuard Home。

网络管理

在istore中安装了若干网络监控、流量监控、内网测速组件,实现简单的网络管理功能,实时查看各接口连接情况、控制设备外网访问权限、屏蔽指定网址等,可惜尚未能成功实现nfs-qos的安装以便限制设备的流量使用,如果能够成功安装便可考虑将网络共享给周围其它同学。

内网服务

上面所说的“对外服务”在内网也是完全可以访问的,我希望实现用户不需要额外记住ip地址,直接正常地访问域名,即可通过ipv6访问NAS上的各种服务,例如我在NAS上使用Alist搭建了一个地理信息数据库共享项目(总数据量2.2TB),连接进入局域网后即可高速(相比于广域网)下载数据且不需要消耗我的流量。实测直接访问ip内网速度如下图所示:

不知道为什么我的有线接入总是跑不满千兆,反而如果用手机测速能够跑到900mbps

目前还存在的问题就是如果用域名访问,即使用户处在内网,还是会走CDN,导致速度很慢(30mbps)左右,后面需要研究一下配置CDN判断在内网时则不走CDN而直接连接。