整顿家庭网络架构 Part1

老家的网络一直很复杂,很久以前用铜线拨号的时代就不提了,前两年宽带免费升级换成了光纤入户,但是白送的光猫 NAT 性能十分垃圾,设备一多就爆炸,不得已搞了第二层路由当主路由,后来干脆把光猫改成了桥接让光猫拨号。但是我家的房子由于网线布局我没参与过,弱电箱非常小,而且客厅只拉了一根网线,所以除非搞单线复用,否则只能将每个房间分隔成独立的内网,无论是 Mesh 漫游还是 NAS 访问都很难搞。

老网络架构
老网络架构

这个架构从光纤入户一直用到去年初,在这期间由于工资不高,没攒下几个钱,所以只是逢年过节增补一个 Mesh 路由,增加一下 Wifi 的覆盖率。不过事情在去年出现了转机,去年由于开始驻扎新加坡,公司提供了住房省下了一大笔钱,所以年中回家的时候下狠心买了一个 R4s 作为旁路由以及一个很小的网管交换机放入了弱电箱,这使得我终于打通了客厅和我房间的网络,能够直连 NAS 了。

不过,由于弱电箱很小,塞进了一堆东西之后光纤受到了挤压,导致光纤信号变差,而且本来我在 R4s 上配置了 AdGuard 过滤各种设备的广告和跟踪,但是由于 OpenWrt 的不稳定因素过多,例如 ROM 本身的配置有问题、同时负载 NAT 和去广告导致防火墙规则混乱,时不时会出现网络回环,所以近半年来上网一直不稳定,家里人时不时在群里抱怨。

思前想后决定今年春节决定好好整理一下老家的网络,把整个网络梳理通畅。

0x0 方案设计

首先需要确定方案的选择,目前的网络架构核心问题在于光猫路由性能太差,导致带机量极低,于是不得不挂二级路由,而挂二级路由会导致不同房间的拥有不同的内网,而且无法做 Mesh 有线回程,如果想要 Wifi 直连网线,就只能开独立的 Wifi 了。

所以首要任务是把光猫铲了,在几年之前,光猫通常会分为 2 部分,第一部份是光转电,把光纤转换为 RJ45 接口,第二部分才是路由器,但是现在的光猫是 all in one 的,光纤插进光猫,出来的直接就是带 NAT 的 lan 口。因此比较流行的代替方案就是找一个服务器用的SFP 光模块以及一个支持 SFP 的路由器,这样就可以以单个高性能设备替换掉原来性能底下的运营商光猫了。

SFP 光模块通常被用在服务器上,用于让多个服务器机柜通过通讯,由于有稳定性需求,每年都会有不少从服务器淘汰下来的光模块流入淘宝之类的地方,不过这些光模块是不能直接用在民用网络上的,运营商通常会验证入网光模块的 sn 之类的数据,因此这些光模块通常需要刷一个 OpenWrt 之类的系统,然后把各种验证数据模拟成原光猫的数据。不过正如前面所提到的,我对这些自行编译的系统,尤其是 OpenWrt 的稳定性比较担忧,所以考虑再三我决定买一个由 Odi 生产的全新 PON Stick,这家店 Pon 所使用的转换芯片制程相比市面上常见的中兴、华为之类的服务器 PON 更优,因此发热也更低一些。

第二步是选择支持 SFP 的路由器,一种选择是直接选交换机,由 Pon Stick 进行拨号,不过这样的话对内网的控制权就会变低,Guest 网络限速、AP 隔离之类的都难以做到,因此我选择另一种方式,即 PON 只负责光猫模拟及光电转换,拨号及数据交换均由路由来完成。一番挑选之后最终弱电箱内的硬路由选择了 MikroTik RB760iGS,虽然硬件本身并不出彩,甚至比不少一两百的新消费级路由都要低,但是其优势在于 RouterOS,ROS 提供了一个友好的 GUI(WinBox)并尽量把 Linux 的内部配置暴露出来,并且自带了一系列网络协议的实现,这些实现虽然可能不复杂,但是在 OpenWrt 中自己安装配置通常会很麻烦(例如 WireGuard 和防火墙配置),很多消费级路由甚至无法配置(虽然它们在实现面向客户的功能时实际上用的就是这些协议,例如隔离 Guest 网络用的 Vlan)。

MikroTik RB760iGS 和 ODI Pon Stick
MikroTik RB760iGS 和 ODI Pon Stick

最后一步是选择 Wifi Mesh 方案,此前我帮别人配置过 Asus、小米、TP-Link 和华为的 Mesh 方案,总体而言我认为 TP-Link 是最稳定的,小米次之,另外俩只能说 Just Work,让我来选还是免谈。小米由于最近激进地限制手机解锁,所以我观感不是很好,而且小米的路由器现在都做得特别大块,也没有隐藏天线的款式,因此我还是决定用 TP-Link。目前我的房间里用的是小米,客厅、主卧和阳台都是 TP-Link,正好再买一个新的换掉客厅的主路由,然后把老路由放到我房间里就行了。最终的网络架构图如下:

新网络架构
新网络架构

新的网络架构下整个家庭内网只有一层 NAT,并且 R4s 不再作为主路由,而是变成旁路由,Lan 和 Wan 都连接到主路由上(具体处理在后面介绍),每个房间的路由都直接通过网线连接到主路由上,并组成有线回程的 Mesh。

在这个网络架构中,R4s 作为默认的 DNS 服务器,上面运行 OpenWrt、AdGuard 以及 Docker,Docker 中运行以 Tun 模式运行的 Clash,并且通过 VRRP 实现主备切换,当 R4s 抽风时 DNS 流量自动回落到主路由中。而对于特定的需要自动翻墙的设备,则通过路由规则转发流量到 Clash 的 Docker 中的 DNS 服务器,Clash 返回特定网段的 Fake-IP,对应的 IP 同样会被路由规则处理,全部发往 Clash 的容器中。这样便实现了可插拔的去广告及自动翻墙。在这个过程中几乎所有配置都只是一到两条防火墙规则,十分简洁稳定。在实际的测试中,R4s 掉线后 1 秒以内去广告及翻墙流量就可以自动切换回主路由,在 R4s 上线之前虽然去广告和翻墙失效了,但是所有上网功能仍然可用。

0x1 基础的网络配置

一、划分端口

根据前面的网络分区图,我将中间 3 个端口分配给客厅/次卧及阳台,其中客厅放置了一个 5 口千兆交换机,用于桥接客厅的主路由器和主卧的 Mesh 路由,次卧及阳台的 Mesh 路由则通过墙线直连交换机。

路由端口划分
路由端口划分

然后使用 RouterOS 的官方连接工具 Winbox 连接到路由器上。首先从左侧菜单打开 Interface List,然后双击接口列,点击 Comment,给每个端口都加上备注,Winbox 是个很完善的 GUI 配置工具,几乎所有 RouterOS 的功能都可以使用 GUI 配置,此处的备注将会体现在其他界面配置接口时的 UI 组件上。

端口备注
端口备注

二、配置 PPPoE 拨号

在我的用例中,我希望猫棒尽量少地运算,降低功耗和发热,因此我只在猫棒上配置了光猫型号、序列号等信息的模拟,VLAN 拆分及拨号都在路由器中完成:

  1. 首先右键点击 sfp1,然后点Add-VLAN,起一个好理解的名字,VLAN ID 填写宽带对应的 ID,例如在我的用例中 ID 是 41
创建vlan
创建vlan
  1. 然后右键点击Interface List窗口的空白处,选Add-PPPoE-Client,在General选项卡中的Interface选项里选择前面创建的 VLAN,此时你会发现,列表右侧正显示着上一步为每个接口添加的备注。我觉得正是这些细节使得 ROS 虽然配置项众多,但是配置和管理起来却不显繁琐。
配置PPPoE目标接口
配置PPPoE目标接口
  1. 最后是前往Dial Out选项卡,在UserPassword里填入账号密码,一些运营商可能只需要账号,按需填写即可,部分运营商可能还需要调整Profile,不过在我的场景里其他选项保持默认即可。
配置PPPoE拨号
配置PPPoE拨号

配置完成后点击Apply按钮,然后前往Status选项卡即可查看拨号状态。如果发现拨号失败,还可以点击 Winbox 全局侧边栏的Logs菜单打开日志窗口,查看详细的拨号信息,再按需调整拨号选项。

三、配置流量出口

通过前面的步骤,路由器已经成功拨号,不过此时路由器的默认eth1为 WAN 口,当产生访问非当前路由表的 ip 时,路由器会将流量往eth1发,所以还需要配置下桥接和 WAN 接口。

首先前往Interface List窗口的Interface List选项卡,在前面的步骤里,我已经通过VLAN InterfacePPPoE Client构建了一个能够直接联网的虚拟端口,因此流量直接打到sfp1上即可。此处可以直接双击 WAN 条目,并将端口选择为sfp1,至此内网客户端已经可以成功访问外网了。

最后是点击 Winbox 全局侧边栏的Bridge菜单,由于路由器默认将eth1作为出口,因此该接口不在默认网桥中,要想让这个接口也能访问互联网和局域网里的其他的设备,还需要将它加入默认网桥中。在Bridge窗口中点击Ports选项卡,同样在空白处右键并选择AddInterface选择eth1Bridge选择唯一的网桥bridge即可。

添加eth1至默认网桥
添加eth1至默认网桥

至此基础的网络配置已经完成了,通过简单的配置,路由器目前将分流 vlan 并拨号,并通过插入 sfp1 的猫棒连接外网,内网则通过简单的桥接和默认配置的 DHCP 服务器允许局域网内设备互联并连接外网。

由于文章已经比较长,我在此打住,将后续的局域网 QoS、去广告及 Mesh 配置放在下一篇文章中。