家庭网络的最终形态:All-in-Boom?

家庭网络优化记录

起因前几天一觉起来,发现家里的网又炸了,后面排查发现是旁路由istore的虚拟网口崩了,重启之后就恢复正常了。但是家里偶尔的断网确实还是带来很多麻烦,如何利用已有的网络设备让家庭网络更加稳定好用,这是一个很庞大也很繁琐的问题。好在现在AI非常强大,借助Gemini我开始对家里的网络进行了一次增强部署。

最终实现的网络拓扑图如下:

网络拓扑

一、家用网络设备

先简单介绍一下家里的几个网络物理设备:

1. 小主机:倍控G31N5105风扇版

小主机ESXI主界面

原版只有8G内存,自己改装了16G内存+2T的M2固态,用来作为家庭网络设备性能妥妥的够用,目前安装了ESXI 7.0用来做虚拟机母系统。

2. 交换机:水星1万兆光+8口2.5G

网上找攻略随便买的交换机,主要解决有线设备多缺网口的问题。

3. NAS:威联通TS-264C

QNAP-TS264C

当年很有性价比的一款基础家庭双盘符NAS,也是配了16G内存+两个4T酷狼机械硬盘,外加之前电脑拆下来的一个128GM2固态做高速缓存,日常使用也够用了。最近本来想升级成更大的企业级机械硬盘,奈何目前硬盘价格飙升,只能先等等看了。

另外为了保护NAS硬盘还购入了以下这款UPS做断电保护,目前使用了快1年多了一切正常。

4. 路由器:华硕AC86U

最初入坑时买来折腾的硬路由,刷过koolshare的梅林和官改固件,也搞过什么虚拟内存挂载,后面因为折腾的越多性能不够用,就拿来只当作AP发射WiFi了。

二、小主机虚拟机

接下来介绍一下小主机上的虚拟机,值得注意的是,除了ESXI的管理网卡eth0之外,其他三个2.5G网卡全部推荐设置为硬件直通:

1. ikuai主路由

直接下载ikuai最新固件上传到小主机,然后基于Linux创建ikuai虚拟机,并将直通的eth2和eth3分配给ikuai分别做lan口和wan口,在ikuai管理界面绑定网口后使用物理wan口eth3进行拨号上网,将eth2 lan口桥接到原有的eth0 lan口以作备用lan口。

接下来只需要将光猫改桥接就可以了,可以直接求助宽带师傅,桥接成功联网后开启DHCP功能,将192.168.11.11~192.168.11.254设置为DHCP动态分配池,10及以内用来静态分配一些重要的虚拟机系统或者设备。最后网关统一设定为VRRP虚拟网关192.168.11.10,至于VRRP具体配置请参见下一部分旁路由设置。

另外最好能要到公网ip,有公网ip会让家里的网络体验上升一个档次。有了公网ip,推荐直接在ikuai配置动态域名,利用接口获取的公网ip比网站或者脚本获取的更加稳定。

2. istoreOS和immortalWrt旁路由

这一部分是最近部署的主要改动,为了解决旁路由网关一挂全家断网的问题,这次我使用双系统来做VRRP备份网关(当然还是all in boom:)。

首先是分别安装istoreOS和immortalWrt两个虚拟机,这里选择两个不同的固件也是为了差异备机防止出现相同问题全部挂掉,缺点就是每个都需要单独配置,不过因为内核一致,大多数软件包中的配置文件都可以备份通用,也算是省事儿了不少。

另外值得注意的是,可以将之前直通的eth1分配给ImmortalWrt或者istoreOS,使用直通网卡的稳定性肯定远远大于eth0的虚拟网口,具体选择取决于个人,直通之后将eth1口连接至交换机即可,我这里选择将这个物理网口eth1分配给immortalWrt以作为更稳定的主用机。

关于一些必备的安装包这里我也不再赘述,我目前使用的MosDNS+OP+AdguardHome这一套方案。

重点是要开启VRRP服务,首先是分别在两台机器安装VRRP服务,然后分别编辑配置文件/etc/keepalived/keepalived.conf。备旁路由Backup也就是我的istoreOS设置为:


global_defs {
   router_id LVS_DEVEL
   enable_script_security  # ................................. notify.sh
   script_user root        # ..................
}

vrrp_instance VI_1 {
    state MASTER           # ...............
    interface br-lan       # ..................
    virtual_router_id 51   # .....................
    priority 90           # .....................
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234      # ...............
    }
    virtual_ipaddress {
        192.168.11.10      # .................. IP
    }

    # ....................................
    notify_master "/etc/keepalived/notify.sh INSTANCE VI_1 MASTER"
    notify_backup "/etc/keepalived/notify.sh INSTANCE VI_1 BACKUP"
    notify_fault  "/etc/keepalived/notify.sh INSTANCE VI_1 FAULT"
}

主旁路由ImmortalWrt配置为:

global_defs {

   enable_script_security  # .......................................
   script_user root        # ......... root ..................
}

vrrp_instance VI_1 {
    state MASTER           # ...............
    interface br-lan       # ..................
    virtual_router_id 51   # .....................
    priority 100           # .....................
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234      # ...............
    }
    virtual_ipaddress {
        192.168.11.10      # .................. IP
    }

    # ....................................
    notify_master "/etc/keepalived/notify.sh INSTANCE VI_1 MASTER"
    notify_backup "/etc/keepalived/notify.sh INSTANCE VI_1 BACKUP"
    notify_fault  "/etc/keepalived/notify.sh INSTANCE VI_1 FAULT"

另外在两台机器分别设置消息提醒脚本,在旁路由网关发生切换时自动发送信息,修改/etc/keepalived/notify.sh文件内容为:

STATE=$3
HOSTNAME=$(uci get system.@system[0].hostname 2>/dev/null || hostname)
SENDKEY="你的server酱Key"
NOW=$(date +"%Y/%m/%d %H:%M:%S")

if [ "$HOSTNAME" = "iStoreOS" ]; then
    ME="iStoreOS (11.4)"
    PEER="ImmortalWrt (11.5)"
else
    ME="ImmortalWrt (11.5)"
    PEER="iStoreOS (11.4)"
fi

# ..................
logger "Keepalived ...........................=$HOSTNAME, ............=$STATE"

if [ "$STATE" = "MASTER" ]; then
    # ...... 3 ...........................
    #sleep 3

    TITLE=".... ....................."
    # ........................ Markdown ............
    DESP=" 

...............${ME} ...
...............${PEER}

 
......IP...192.168.11.10
......................................................
.........${NOW}"

    # .................................
    RES=$(curl -s -S -X POST "https://sctapi.ftqq.com/${SENDKEY}.send" \
        --data-urlencode "title=${TITLE}" \
        --data-urlencode "desp=${DESP}" 2>&1)

    logger "ServerChan ............: $RES"
fi

最后一步将VRRP服务启动时,读取配置文件修改为已经设置好的配置文件,进入 /etc/init.d/keepalived 编辑页面:

1.修改变量路径: 将 KEEPALIVED_CONF=/tmp/keepalived.conf 修改为: KEEPALIVED_CONF=/etc/keepalived/keepalived.conf

2.注释掉配置处理函数: 找到 start_service() 段落中的 process_config 这一行,将其注释;

完成后保存退出,使用 /etc/init.d/keepalived enable/etc/init.d/keepalived restart命令确保开机时服务自启。至此VRRP服务就设置好了,可以通过 /etc/init.d/keepalived stop 停止主旁路由服务之后,使用ip addr show br-lan 命令查看备机显示是否包含192.168.11.10以及server酱消息是否成功提醒。

如果服务正常运行,那我们就拥有了一组比较稳定的网关服务器,即便以后自己捣鼓其中某一个旁路由,家里其他设备也能正常上网。

3. 基于Debian服务器的Docker服务

为了尽可能各司其职,我单独设置了新的虚拟机Debian来专门跑Docker服务,并将一些偏计算的docker服务从NAS迁移至小主机。

针对一些需要读取NAS资源的服务也可以使用NFS服务进行远程挂载,以Calibre为例,将docker默认配置的/library/autoaddbooks指向到已挂载到Debian的NFS共享文件夹/shere/Public/Books。这样即便docker丢失也不会影响已保存的书籍资料。

最后一步就是将Lucky也移动到Debian上,并重新配置web反代和重定向http到https,除此之外,将个人域名的证书服务也配置到Lucky以实现自动续签,这样基于https公网访问家庭网络服务也搞定了。

三、NAS服务

在将NAS上一些服务迁移之后,NAS就可以回归家庭存储的本质服务,只留下Jellyfin和qBittorrent这种需要大量硬盘读写的服务。

我的NAS主要使用Qsync同步公司/家里电脑的工作文件,备份一些重要的个人数据,比如出去旅游的照片Vlog等等,另外还设置了macOS Time Machine,以及为家里的小米摄像头提供录像存放本地位置等等。

经过上面的这些配置,家里的网络就已经比较舒服了。在这样的网络环境下,不管是在家办公还是娱乐,基本上都可以满足日常需求了。由于时间篇幅所限,文章很多内容只是粗浅带过,相信能看懂这篇文章的人肯定也知晓基本的一些网络配置,详细教程网上一搜也比比皆是所以我这里不再赘述,我的重点是分享目前家庭网络的总体拓扑架构,说不定可以给有相似需求的朋友一点启发,如果有问题也可以评论留言,再次感谢阅读。