我的 homelab 历程 (Up to 2023-12) & 坑

Update(2023-12-11): 更新第 5 代,补了第 3 代的图。

记录一下我的 homelab 2023 改变了什么,顺便这里面整合了一篇去年写的草稿(因为太短就没有发布)。

什么是 homelab?

homelab 就是家庭实验室,任何东西都可以算 homelab(此处应搬出九宫格图?)。在我眼里,homelab 则是一个玩各种服务,以及各种环境演练的地方。

我为什么要整 homelab 呢?

首先就是为了好玩,想自己本地搭建一些服务,这样就不用怕自己的一些数据被搜集了。不仅如此,因为特殊的网络大环境,如果一些常用的服务无法访问,至少本地还有的玩。除此之外还逐步变成了松鼠党,想存储东西。More storage means more devices,设备就逐步增多了。

第 1 代 homelab

大概是高二的时候,我买了一台树莓派 2B。在此之前,我虽然有自己的台式机,但主要还是作为个人电脑用,虽然当年在极影动漫以及 VeryCD 为了 BT/eMule 下载有一些时间让它 7*24 小时运作。

当时的我刚知道 PT 是什么,所以这台树莓派 2B 被我安装了 Transmission,然后插上了一块 Toshiba 移动硬盘用。家里当时正好也有公网 IP,所以我在学校用手机也可以控制下载什么。

第 2 代 homelab

在高中毕业之后,准备上大学之前,我亲戚给了我一些钱用于购买大学用的电脑,我从其中拿了一半购买了一些硬盘,以及一台 Mikrotik 路由器(用到 2022 年),另一半则购买了一台在学校用的小米轻薄本。这时,之前的台式机就派上用场了!

这台台式机的 CPU 是 AMD Athlon II X2 250,内存我依稀记得是 4 GB,高中的时候加到了 8 GB,显卡是七彩虹主板板载的 HD3200。

我在上面装了个 Windows 10,然后安装了 qbittorrent。因为当时那台电脑支持 6 个 SATA 位,所以我将 6 个 SATA 位全部接满,而这也导致只要开机十多分钟之后硬盘的温度就在 60 度左右徘徊。不过好处就是,我可以轻而易举的在学校通过远程桌面连接连回家,然后控制下载,甚至能远程看影片(只不过画质很烂)。

在这样半年之后,温度方面的困扰让我终于将一些满了的硬盘取出,只留还没存满的硬盘,这样散热问题也解决了。为了持续满足存储需求,我还新增了每半年购置一块新硬盘的计划。

第 2.5 代 homelab

不知道怎么想的,我想着给老电脑超频。最后的结果就是烂了。我哥听到这个之后就把他那边用不到的电脑给我了,之后跟上一台电脑一样,做着一模一样的工作。

第 2.5 代 homelab.jpg

这台电脑的 CPU 为 i3-3240,内存依旧为 8 GB,显卡变成了 GT 630。比之前稍微高端了一点,所以我在上面除了下载以外,还跑了 ZeroNet、Syncthing 等等服务。不过依旧是 HDD 驱动,所以速度还是很慢,不过我能忍受!

这次我考虑到了电费——所以我设置了早上 9 点自动开机,晚上 10 点自动关机。唯一的缺点就是如果晚上 10 点之后我想远程控制 PC 的话就没门了。

至于第一代里面的树莓派?被我放在学校用于 Dr.com 的上网拨号了(Dogcom 开发者们辛苦了)。

第 3 代 homelab

随后的一段时间我都在使用这一台电脑作为服务器,直到去年我成为了打工人。虽然家里经济状况依然没有好转,但总算有点小钱钱可以升级一下配置——比如 HDD 换成 SSD 之类的。当然,各个朋友们的帮助也是不可或缺!像之前做的 1000 元将老电脑打造成 NAS 企划,如果我的同学没有送我那台老电脑的话,也不会有目前的情况。我在那台 1000 元老电脑上装了黑群晖,用了之后非常喜欢成品 NAS,所以就想购置一款。没过多久在京东上看到了 QNAP 促销就购入了 QNAP(当然一并购置了硬盘)。

之后我又在群内收了一个 4 盘位改的蜗牛星际,在上面装了 Windown Server 2022。而之前的树莓派除了被我安装了一个 Pi-Hole 用来当作 DNS 服务器外,还装了个 homeassistant。

2022.06 的构造.jpg

没过不久,我在闲鱼上看到有人卖 Dell Optiplex 就也买下了,这导致我的经济状况雪上加霜了,不过精神需求有了,并且还换掉了一直以来在用的我哥的 PC,一举两得,:D。

下面这张图是 蜗牛星际(左)、QNAP(中)和黑群晖(右)在一起时候的照片。

早期第 4 代 homelab.jpg

第 4 代 homelab

在今年年初的时候,将人生中的第一份年终奖除了用于南下第一次去广州 & 深圳 & 香港的非常小一块(这里应该也有一份咕咕咕的游记……)之外,还购置了一台 Synology。感谢群晖特有的 SHR-2,我可以不用那么着急的批量购置硬盘。除此之外节后还购置了一款华为的鲲鹏 W510,用于 aarch64 测试用。

又过了一段时间,cola 大老板送了一台他闲置的 Mikrotik 过来,遂把之前的老 Mikrotik 替换掉了。

2023 年 6 月的时候,我有做过一期影片,比下面这张图还老一点,不过我大概详细的讲了每个都是做什么的。

2023.09 的构造.png

转眼间时间就到了 2023 年 9 月,比影片内多了一些设备和细节,新拉了一条没有公网的移动宽带想组双线,以及跟富黑黑家打了 wireguard 隧道。之前的树莓派上 Pi-Hole 从今年开始运行过几天就无响应了,需要重启,所以换到了 x86 机器上试一试。

第 4 代有什么缺点?

第一个缺点就是没有做好 VLAN 的划分。虽然我划分了 2 个 VLAN 分别给 IoT 和 Guest,但因为 Mikrotik 这样的一个特性导致让我十分不爽,非常想重新划分 VLAN:

  1. Mikrotik 的 IP 分配是倒过来的,其实这个都不是很大的问题
  2. 如果你接入的设备 mac 地址会变化,Mikrotik 不会复用空闲的 IP 地址,而是会给你新的 IP 地址,频繁接入的话很容易造成设备可能就 10 多个但是 IP 地址已经从 x.x.x.254 分配到了 x.x.x.100。

第二个缺点是,我想开一些 VM 来安装国产软件 & 测试好玩的东西,但我不想让这些 VM 内的程序可以扫描到整个网段内的设备,这个说白了也是需要单独的 VLAN 分配。

第三个缺点是,我新购置了 Xbox,然后购买了 UU 加速器。我不想在我的设备上跑 UU 加速器,就想开一个 OpenWRT 来跑 UU 加速器。但我又不想让这个 OpenWRT 在我的主 VLAN 内,这个也是需要单独 VLAN 分配……

第四个缺点其实是 Pi-Hole,在我把相同的配置换到 x86 机器上后,依然是会过几天无响应,需要重启程序,这让我动了换 DNS 服务器的注意,正好我要重新整网络,那么就一起弄吧!

第 4.5 代 homelab

所以在某一天,我打算开始动工划分 VLAN。理论上我划分好了,但是我想让它们之间互通,却发现无法 ping 通。可能这时候有读者会说,VLAN 默认是无法互相通讯的呀?我的答案是,如果 Mikrotik 内的 Firewall 没有禁止的话,那就是允许的。但我此时的问题正好就是这个——我把所有的 drop 禁用掉还是无法 ping 通,所以打算重置所有的网络设备然后重来一次。

设计的图如下(这也是目前的样子):

2023.11 的构造

除了上面的 VLAN 划分之外,还有一些细节:

看起来非常复杂。不过在富黑黑的帮助下这都不是问题!

遇到的坑

Mikrotik 处 VLAN 设置

我的 Mikrotik 上 eth1 是留给 China Mobile 拨号的,而 eth2-eth7 分别有不同的用处:

在将这些 interface 桥接之后,要怎么在 Bridge 下设置 VLAN 呢?乱设置然后开启 Bridge 的 VLAN Filtering 的话,全家就没网了。

所以在配置的时候,这就要知道 Untagged(未标记) 和 Tagged(已标记) 是什么了。

当数据帧从一个设备传输到另一个设备时,如果携带有关其所属 VLAN 的标记信息,那么这个就是 Tagged 的。这允许同一物理链路上传输属于不同 VLAN 的数据。交换机和路由器通过这个标记可以正确地将数据帧路由到正确的 VLAN。

当数据帧在传输时没有关于所属 VLAN 的标记信息,这个就是 Untagged 的。这通常用于在同一物理链路上传输属于相同 VLAN 的数据。这种情况下,接收设备会假定这些数据帧属于特定的 VLAN。

简而言之,Tagged 用于在同一物理链路上传输不同VLAN的数据,而 Untagged 用于在同一链路上传输相同 VLAN 的数据。

说了这么一大堆,我要怎么配置呢?

从我们的构想可以看出,我们只需要让所有允许 Tagged,除了 eth2 & eth3 默认 VLAN 10,其余默认 VLAN 1:

两个 OpenWRT 交换机的配置

因为全部由核心 Router 下发 IP 地址等,所以只需要在 VLAN 1 下留一个 DHCP client interface 来方便管理。

两个都需要做的事情是,删掉 wan & wan6,然后将 wan 接口放入 br-lan 内,并将 br-lan 的网桥 VLAN 过滤启用,然后先添加各个 VLAN ID,此时可以将 wan 设置 Untagged,后续再来设置其它端口。如果不一次性做这些的话,你的 OpenWRT 将会失联。

首先说一下比较简单的 Linksys 吧:

VLAN ID Local lan1 lan2 lan3 lan4 wan
1 v - - - - U
10 v U U U U T
20 v - - - - T
30 v - - - - T
40 v - - - - T
100 v - - - - T
200 v - - - - T

设置好后,将各个软件 VLAN 创建各自的 bridge interface,协议选择不配置协议,然后按需绑定 AP 至桥内。

同样的,将上面的步骤应用在 Redmi 上:

VLAN ID Local lan1 lan2 lan3 wan
1 v - - - U
10 v - - U T
20 v - - - T
30 v U U - T
40 v - - - T
100 v - - - T
200 v - - - T

QNAP 作为 NUT 服务端的 UPS 构造

由于 UPS 只有一个 USB 信号输出口,无法直接给其余的 NAS 和 Server 提供各自独立的 UPS 信号。并且目前我的 homelab 设计只有 QNAP、Synology 和那台 WinServer 2022 蜗牛星际接入了 UPS,实际上如果 QNAP 检测到 UPS 断电之后是无法通过网络下法给各台设备的——因为核心提供路由的 Mikrotik 早已经断电了。所以最终选择了将 QNAP 和 Synology 通过 RJ45 接起来,组一个 /30 的网段。

待两边的网络都设置好之后,在 QNAP 侧设置 UPS 相关的设置。之后需要在 Synology 侧修改 /usr/syno/bin/synoupscommon,找到第 193 行(我是 DSM 7.x),将 ups@${server_ip} 修改成下面这个样子:

/bin/sed -i "/^MONITOR/c\\MONITOR qnapups@${server_ip} 1 admin 123456 slave" $UPSMON_CONF

Synology 在外部电源失去后,默认进入的是安全模式,而不是彻底关机。可以修改 /usr/syno/bin/synoups,找到第 183 行,将下方的 /usr/syno/sbin/synopoweroff -s & 修改成 poweroff 即可。

随后,可以通过这个指令来测试两者是否连接成功,成功的反馈是命令输入后输出 Synology 的 IP 地址:

我发现不加后面的东西只会提示 Init SSL without certificate database。

upsc -c qnapups@QNAP的IP地址 2>&1 | grep -v '^Init SSL'

Synology 作为 NUT 服务端的 UPS 构造

在 Synology 处设置好后,在 QNAP 处找到 /etc/config/ups/upsd.users,将其中关于 [admin] 部分的注释掉,然后在文档最后添加用户 monuser

[monuser]
    password  = secret
    upsmon slave

然后复制一份 /etc/config/ups/upsmon.conf 配置文件为 /etc/config/ups/upsmon_syno.conf,以免在 QNAP GUI 端设置 UPS 后被覆盖。 修改 upsmon_syno.conf 中的 MONITOR 一行为:

MONITOR ups@Synology的IP地址 1 monuser secret slave

修改 SHUTDOWNCMD 一行为:

SHUTDOWNCMD "/sbin/poweroff"

然后新建 /etc/config/ups/upsmon.sh,写入如下内容:

#!/bin/bash
UPSMONSH="/usr/sbin/upsmon"

case "$1" in
  start)
        # Start demons.
        if upsc -c ups@Synology的IP地址 | grep -q "QNAP的IP地址"; then
                echo "ups already run"
        else
                rm /etc/config/ups/upsmon.conf
                cp /etc/config/ups/upsmon_syno.conf /etc/config/ups/upsmon.conf
                killall upsutil
                killall upsmon
                $UPSMONSH
        fi
        ;;
  stop)
        # Stop demons.
        $UPSMONSH -c stop
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

最后,因为 QNAP 的 crontab -e 在重启后会失效,所以需要直接修改 /etc/config/crontab,加入以下内容:

* * * * * /etc/config/ups/upsmon.sh start

之后使用 /etc/init.d/crond.sh restart 重启 crontab,然后使用 upsc -c ups@Synology的IP地址 检查返回列表中是否有 QNAP 的 IP 地址,如果有代表设置成功。

如果 Synology 经常在几个小时后显示 UPS 掉线的话,可以通过 Control Panel > Task Scheduler 添加一个每小时用 root 用户执行的 Task:

upsdrvctl stop ups
upsdrvctl start ups

第 5 代 homelab

2023.02 的构造.png

刚刚写完这篇文章不久就收到了一台替换掉蜗牛星际的新设备,非常开心。这是我觉得对于目前来讲一个十分完美的 homelab。相比第 4.5 代,第 5 代解决了另外的一个痛点——UPS。

按照之前 4.5 代 homelab 的规划,实际上是以 QNAP 作为 NUT 服务端,然后预计断电时通过网络下发关机指令。但这有个非常大的缺点:在断电后虽然所有机器还在通过 UPS 供电,就算 OpenWRT 交换机还在通电,Mikrotik router 也早已断电,根本无法传递数据包。

所以通过活用 Synology 后面的 4 个 1 G 口,实现了以 Synology 作为 NUT 服务端,QNAP、WinServer 和 lpi4a 作为 NUT 客户端(还好这些设备都至少有两个 G 口),在断电之后服务端首先下发至各个客户端关机请求,然后 NUT 服务端在安全休眠之后对 UPS 本体下达关机指令以保留电量,经测试可以在 10 分钟左右完成所有的指令。这样最大化的保护了存储设备,并且也不耗尽 UPS 的电池,保存电力以备应急时刻使用。

当然,你会发现剩下的设备都没有被 UPS 保护到——主要是连接上述设备的 OpenWRT 和我房间内的所有设备。OpenWRT 和 Mikrotik 我倒不担心,至于两台 Server——一台是按需开启,另一台 Proxmox 设置了每日备份,没什么问题。

下一次升级大版本(?)估计是加很大的机器了,不过在此之前我还想再加一台小主机当新番盒子,顺便写篇配置的文章,这个就丢到明年的许愿池子吧。


如果喜欢本文,欢迎点击下方的「鼓掌」按钮!

如果上面没有加载出任何东西,可以点击这里