我的 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
不知道怎么想的,我想着给老电脑超频。最后的结果就是烂了。我哥听到这个之后就把他那边用不到的电脑给我了,之后跟上一台电脑一样,做着一模一样的工作。
这台电脑的 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。
没过不久,我在闲鱼上看到有人卖 Dell Optiplex 就也买下了,这导致我的经济状况雪上加霜了,不过精神需求有了,并且还换掉了一直以来在用的我哥的 PC,一举两得,:D。
下面这张图是 蜗牛星际(左)、QNAP(中)和黑群晖(右)在一起时候的照片。
第 4 代 homelab
在今年年初的时候,将人生中的第一份年终奖除了用于南下第一次去广州 & 深圳 & 香港的非常小一块(这里应该也有一份咕咕咕的游记……)之外,还购置了一台 Synology。感谢群晖特有的 SHR-2,我可以不用那么着急的批量购置硬盘。除此之外节后还购置了一款华为的鲲鹏 W510,用于 aarch64 测试用。
又过了一段时间,cola 大老板送了一台他闲置的 Mikrotik 过来,遂把之前的老 Mikrotik 替换掉了。
2023 年 6 月的时候,我有做过一期影片,比下面这张图还老一点,不过我大概详细的讲了每个都是做什么的。
转眼间时间就到了 2023 年 9 月,比影片内多了一些设备和细节,新拉了一条没有公网的移动宽带想组双线,以及跟富黑黑家打了 wireguard 隧道。之前的树莓派上 Pi-Hole 从今年开始运行过几天就无响应了,需要重启,所以换到了 x86 机器上试一试。
第 4 代有什么缺点?
第一个缺点就是没有做好 VLAN 的划分。虽然我划分了 2 个 VLAN 分别给 IoT 和 Guest,但因为 Mikrotik 这样的一个特性导致让我十分不爽,非常想重新划分 VLAN:
- Mikrotik 的 IP 分配是倒过来的,其实这个都不是很大的问题
- 如果你接入的设备 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 通,所以打算重置所有的网络设备然后重来一次。
设计的图如下(这也是目前的样子):
- 原有的 VLAN 1 变成了 Management VLAN
- 专门给各种 Server 和 Service 设置了一个 VLAN 10
- 专门自己以及各种可信设备设置了一个 VLAN 20
- 专门给 MAC 地址变动的设置了一个 VLAN 30
- 专门给 UU 加速器,以及需要 UU 加速器的设备设置了一个 VLAN 40
- 老样子的 IoT 和 Guest VLAN 100 & 200
除了上面的 VLAN 划分之外,还有一些细节:
- 两个 OpenWRT 都作为交换机 & AP 使用
- Linksys 的所有 LAN 口都接入 VLAN 10
- Redmi 的一个 LAN 口接入 VLAN 10,剩下两个 LAN 口接入 VLAN 30
- 让 VLAN 10 出口走 China Unicom,剩下的 VLAN 出口走 China Mobile
- 所有 VLAN 都可以互通,除了 Guest 不能访问其它所有 VLAN
看起来非常复杂。不过在富黑黑的帮助下这都不是问题!
遇到的坑
Mikrotik 处 VLAN 设置
我的 Mikrotik 上 eth1 是留给 China Mobile 拨号的,而 eth2-eth7 分别有不同的用处:
- eth2 是 Huawei W510,预计接入 VLAN 10
- eth3 是 Dell Optiplex 7060 SFF,预计接入 VLAN 10
- eth4 目前是空的,估计作为 Management 接入 VLAN 1
- eth5 接入 Redmi AX6000,作为 AP 以及 VLAN 10&30 的有线 switch
- eth6 接入 Linksys E8540,作为 AP 以及 VLAN 10 的有线 switch
- 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:
- 对设置 Bridge 下的 Ports 进行设置,其中 eth2 & eth3 的 PVID 为 10,剩下均为 1
- VLAN 1: 对 LANBridge、eth5 & eth6 做 Unagged
- VLAN 10: 对 LANBridge、eth5 & eth6 做 Tagged,对 eth2 & eth3 做 Untagged
- VLAN 20、30、40、100 & 200: 对 LANBridge、eth2、eth3、eth5 & eth6 做 Tagged
两个 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
刚刚写完这篇文章不久就收到了一台替换掉蜗牛星际的新设备,非常开心。这是我觉得对于目前来讲一个十分完美的 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 设置了每日备份,没什么问题。
下一次升级大版本(?)估计是加很大的机器了,不过在此之前我还想再加一台小主机当新番盒子,顺便写篇配置的文章,这个就丢到明年的许愿池子吧。
如果喜欢本文,欢迎点击下方的「鼓掌」按钮!
如果上面没有加载出任何东西,可以点击这里。