别墅组网方案
2022 年 3 月,阳光明媚,春回大地,绿意盎然。无奈受疫情影响,我又没法回学校了。抓住在国内的最后机会,解决痛点、重整链路,踏出全屋智能的第一步。没想到的是,升级网络挑战重重,峰回路转,跌宕起伏,总结式的说明文已经没法 hold 住这么多内容了。因此我用日记(流水账)的形式记录折腾的过程。希望能给读者带来几分钟的乐趣。
IPv6 地址
COVID-19 Ο 变种在中国各地爆发。深圳多地被划为中风险区域。大四的我有毕设任务,却不能回学校做实验。好在计算机专业的大多数实验可以通过远程连接完成。只要设备联网,我们就能使用。
学校因为网络安全的原因,原则上禁止私自假设反向代理。想要在校外访问内网地址,需要主管部门审批 VPN 资质。南科大使用了深信服开发的 VPN 系统(这家公司因为开发员工监视软件而臭名昭著),它的软件缺乏很多功能:例如,做实验时我经常一边访问 Google 一边访问校内网络,开启 VPN 后我的常规代理就失效了。有同学试着将深信服 VPN 包进 Docker 容器,向外暴露 SOCK 接口,用 SwitchOmega 这类插件进行代理分流。很不方便。
我的实验设备放在工学院,通过网线连接到实验室的交换机,交换机连接到墙角的网线接口。这样的有线连接可以同时获取到内网的 IPv4 地址和公网的 IPv6 地址。设备有了公网地址,就不用费劲整校内 VPN 了。
问题是,我在家里没有 IPv6 地址,也就没法通过 IPv6 协议直接连接学校的设备。
❯ curl 4.ipw.cn
223.68.97.161
❯ curl 6.ipw.cn
curl: (56) Recv failure: Connection reset by peer
2022 年,三大运营商早就提供了 IPv6 地址,各设备也早就支持了 IPv6 协议。拿不到地址的问题肯定出现在家庭网络的配置上。我要从源头开始逐项检查,首先是入户的光纤调制解调器,然后是各层楼的路由器,最后是我手上的终端设备。
问题排查
入户的光纤调制解调器(后称 “光猫”)是中国移动装宽带时附赠的方盒子,装在弱电箱里,默认是全家的网关 (Gateway),是所有网络流量的统一出入口。光猫有一个 Web 管理界面,固定 IP 地址为 192.168.1.1
,账号和密码贴在设备的底部。
超级密码
不过中国的运营商不信任用户,因此贴在机身底部的账号密码没有管理员权限。在网上搜索 “光猫超级密码”,可以获得管理员的账户信息。移动光猫管理员账号的用户名为 CMCCAdmin
,密码为aDm8H%MdA
。
进入光猫管理界面检查,发现确实开启了 IPv6 功能,并且通过 PPPoE 拨号正确获取了 /64
的 IPv6 地址范围。排查之前,我预测问题十有八九是因为光猫没有正确配置。但现在的结果说明问题在错综复杂的下游里。
「下游」包括各楼层路由器和终端设备。IPv6 地址可以通过 SLAAC (StateLess Address Auto Configuration) 或者 DHCPv6 等协议从路由器向终端设备分发。
DHCPv6
DHCP (Dynamic Host Configuration Protocol) 协议主要负责分发内网动态 IP 地址。设备接入网络后广播 DHCP 请求,随后 DHCP 服务器返回一个 IP 地址,设备使用这个 IP 地址上网。
DHCPv6 是 IPv6 版本的 DHCP,负责分发内网 IPv6 地址,地址以 FC 或 FD 开头。但这个协议遭到了广泛批评,因为它破坏了 IPv6 的公共属性,违背了 IPv6 消灭 NAT 的愿景。由于谷歌的强硬态度,Android 系统直到现在(Android 12)也没有支持 DHCPv6。家用网络的配置需要避免 DHCPv6 的使用。
然而,公网 IPv6 分配无形中增大了攻击面。由于每个设备都有公网地址,针对隐藏端口的扫描和攻击会更加容易。所以工业界大规模使用 DHCPv6。
回到正题。我继续向下排查,检查各层楼的路由器。我使用的路由器是 TP-Link 的 TL-WDR5620。产品介绍网页里写着 “支持 IPv6”,支持手册里也有调整 IPv6 设置的章节。但路由器 Web 管理界面里却无论如何也找不到 IPv6 相关的设置。
这里我遇到了第一件离谱的事情:支持手册里的路由器叫做 “TL-WDR5620 千兆版”,而我的路由器叫做 “TL-WDR5620”,少了一个 “千兆版”。我以为千兆版和普通版只有最高无线速率的区别,没想到普通版连 IPv6 功能都阉割了。
行吧,不支持 IPv6,没有千兆带宽,这样的路由器在 2022 年确实不像话。现在我有充足的理由更换新的路由器。该跨入下一个时代了。
深入调查
我说「我家的网络情况很复杂」,真的不是在夸大其词。为了更直观的说明,我画了一张简易地图。
家庭网络布局
2017 年组装网络的师傅跑上跑下弄了整整一天,最终弄出了这样的网络:
- 地下室:108_underground
- 一楼:108_A (2.4GHz), 108_B (5GHz)
- 二楼:108_2
- 三楼:108_3A (2.4GHz), 108_3B (5GHz)
2017 年方案
各层楼有的用着新路由器,有的用着搬家带着的祖传路由器;有的支持 5GHz 频段,有的只有 2.4GHz…… 总之各层楼路由器各司其职,互不关心。 在这个网络里,光猫兼具拨号和网关两个功能。路由器通过 WAN 口连接光猫后,自己又成为二级网关。如果听上去太绕了,可以看这个例子。
- 光猫创建了子网
192.168.1.0/24
,自身作为网关的 IP 为192.168.1.1
。 - 一楼路由器通过 WAN 口连接光猫后广播 DHCP 请求。光猫返回 IP
192.168.1.2
,于是一楼路由器获得了 IP192.168.1.2
。 - 路由器在 LAN 口创建了子网
192.168.2.1/24
,自身作为网关的 IP 为192.168.2.1
。 - 手机连接一楼路由器后广播 DHCP 请求。路由器返回 IP
192.168.2.2
,于是手机获得了 IP192.168.2.2
。
这样组网带来的坏处是:
- 各层楼独立 SSID。上下楼需要手动切换接入的 WiFi。例如我从三楼走到一楼吃饭,如果不主动切换 WiFi,手机仍会连接到三楼的路由器,网络不稳定。
- 各层楼的网络设备不连通。由于各路由器均使用 Router 模式,都占用了 192.168.0.0/16 的 IP 段,不同楼层之间无法通过局域网直接连接。例如我在连接三楼 WiFi 的条件下,无法控制一楼的智能设备。
- Double NAT。[光猫 - 路由器] 是一层 NAT,[路由器 - 设备] 是二层 NAT。导致 P2P 无法穿透。这在 BT 下载、联机游戏时会有明显的延时。
- QoS(服务质量)差。即使开启了 WMM 协议保证同一 WiFi 下关键设备(如机顶盒)信道的优先抢占,但各路由器在光猫视角是平等的,跨楼层的网络抢占问题严重。
- 路由器在 /64 网段下通过 SLAAC 拿到的 IPv6 地址只能使用 DHCPv6 向下分配。
这么多坏处,看来家庭网络需要一次大改。
无缝漫游
停停停一下。在跳进过度设计的深渊之前,先来搞清楚一点:既然光猫已经承担了网关的功能,只要把路由器调整成 AP 模式,上述的问题不是都能解决吗?
路由器工作模式
Router 模式指路由器工作在 “三层”(无线路由器,是一种网关)。它能够识别 IP 地址,分辨数据转发的接口。例如,将内网 IP 地址向 LAN 接口转发,外网 IP 地址向 WAN 接口转发。开启 NAT 功能时路由器工作在 “三层”。它修改了链路层报头,通过识别与替换 [IP - 端口] 的二元组,实现向不同接口的数据转发。
AP 模式指路由器工作在 “二层”(无线接入点模式,类比无线交换机)。它能够通过识别 MAC 地址分辨数据应向何处转发。
话是这么说没错。如果路由器都工作在 AP 模式下:
- 各层楼网络设备互相连通
- 不存在 Double NAT
- SLAAC 分发 IPv6 的问题也解决了
- 但是上下楼仍然需要手动切换接入的 WiFi
智能手机切换 WiFi 的逻辑是一个 [离线 - 搜索 - 自动连接 - 上网] 的循环。如果当前网络不可用,则会搜索 WiFi 并尝试自动连接。
前面提到这样一个例子:「从三楼走到一楼吃饭,如果不手动切换,手机仍会连接到三楼的路由器,网络不稳定」。如果所有 AP 的名字设成一样,体验反而更糟糕了 —— 由于 SSID 的统一,你甚至没法主动选择应该连接到哪一个的路由器(WiFi 列表里只有一个网络,没得选)。上下楼层后,必须把手机的 WiFi 关了再开一遍,强制它搜索最近的 AP 信号。
那么有没有什么方法能让手机在无线接入点之间无缝无感地切换呢?
把 AP 信号限制在同一层楼,让楼下搜不到楼上的信号,这样不就能自动切换了吗?也许可以往路由器天线上盖一个易拉罐,把它信号变差一点?
有没有优雅的方案呢?那就是 802.11k/v/r。
802.11k/v/r
802.11k 无线资源测量协议。简单说就是向终端提供找到最好的 AP 的信息。
802.11v 无线网络管理协议。允许终端设备交换网络拓扑的信息,包括射频环境。用于解决 AP 之间的负载均衡问题,也帮助终端设备减少耗电。
802.11r 快速漫游协议。也叫快速 BSS 切换(Fast Basic Service Set Transition)。用于加速手机或者电脑在漫游时的认证流程。
802.11k/v/r 是面向设备的协议。不同 AP 之间如何互相协调、如何实现这些协议,则并没有特别规定。我查找了在售的网络设备,发现这个协议通常在同品牌 AC+AP 上,或者能够参与 mesh 组网的设备上有实现。
非常合理,AC+AP 是用硬件管理硬件,同一品牌的设备之间随便怎么传递私有报文都行。Mesh 组网目前也没有规模化的通用行业标准,都是各家厂商各搞各的(WiFi 联盟的 EasyMesh 人走茶凉)。
结论是 —— 想要实现自动漫游,必须要买同一品牌的。接下来就是选择一个品牌路由器,然后抱 4 个回家~
Mesh 组网
好,想要满足自动漫游无感切换,就需要购买支持 802.11k/v/r 的新硬件。之前在实验室里用小米路由器觉得它的 Web 管理做得不错,比较了一下,决定购买这两种路由器。
硬件名称 | 数量 | 旗舰店单价 |
---|---|---|
Redmi 路由器 AX3000 | 3 个 | 249 元 |
小米路由器 AX6000 | 1 个 | 599 元 |
参考价格 元。实际购买时赶上了 38 节日大促销,AX3000 降价到 199 元,总计花费 1196 元。
小米路由器支持 Mesh 组网。Mesh 很大程度上还是一个营销概念,通常包含自动组网(灵活使用无线和有线链路相互通信)、配置同步(路由器间同步 SSID、密码、AP 链路等信息)、无缝漫游等功能。
Mesh WiFi
Mesh WiFi (或称 “全屋 WiFi”)包括一个直接连接到调制解调器的主路由器,以及一系列卫星模块或节点,放置在你的房子周围以实现全面的 WiFi 覆盖。与传统的 WiFi 路由器不同,它们都是单一无线网络的一部分,共享相同的 SSID 和密码。
各家厂商各说各话(「一 Mesh 各表」),充斥着宣传和营销话术。这里我谈谈自己对 Mesh 的见解:在 Mesh 出现之前,网络工程师需要在心中对网络拓扑有明确的认识,并且正确配置每一个节点,使其能在自己的位置上正确通信。Mesh 组网赋予了网络设备即插即用的特性,设备能自行发现网络拓扑结构,并且自动以合适的配置连入网络。
所以 Mesh 组网特别适合家庭网络:甭管墙里的网线是
-
串联:
Internet → [WAN - LAN] → [WAN - LAN]
; -
还是并联:
Internet → { [WAN - LAN], [WAN - LAN] }
; -
还是压根就不联(通过无线信号桥接)
路由器接电后都会自动构建出最快的拓扑,顺利同步配置,拓展网络的覆盖范围。
方案设计
尽管 Mesh 组网是自动的,但它只能在已有的结构上自适应,不能超越物理线路的限制。网络拓扑的构建(说白了:线怎么连、网线插哪些口)仍然需要我们手动优化调整,以搭建最佳网络结构。
Mesh 组网方案有三种:有线回程、无线回程、AP 模式。其中无线回程是指路由器通过无线频段交换数据实现网络拓展,带宽损耗大、延迟高,不建议使用。
AP 模式类似我现有的网络拓扑。仍然是光猫负责拨号和网关,但路由器会失去很多功能。例如:数据包只经过二层就被转发走了,因此路由器无法通过 iptables 名单进行广告拦截或透明代理。
AP 模式
有线回程是最合适的组网方案。光猫桥接到一个主路由器,由主路由器负责拨号和网关,子路由器接入主路由器的 LAN 口作为 AP 使用。
有线回程
可以把广告拦截、透明代理、端口转发等附加功能全部放在主路由器上,一处配置,全家所有设备均可享用。
No, no, no。这个方案里有一个致命的不可抗力因素没有考虑。主路由器从弱电箱里拖了两根网线和一根电源线出来,导致弱电箱箱门关不上。弱电箱在门口,美观不能得到保障。美观高于功能性,难缠的甲方呵。
我们不妨把目光重新移到上面 “有线回程” 那张图上。主路由不能拖在弱电箱外面,那也许可以放在一楼,利用墙里的线作为 [光猫 - WAN] 的连接线。可是,[LAN - 交换机] 的这条线咋整?墙里只有一根线啊?
进阶方案设计
扯远了,我需要继续优化 “有线回程” 的方案设计。现在面临的困境依次是:
- 路由器拖在弱电箱外面很丑
- 路由器可以通过墙里的网线连接到弱电箱
- 路由器需要两根网线但墙里只有一根
不管三七二十一,我们先假设墙里有两根线,交汇到交换机旁边。如何配置交换机使得这个网络成立?
回想一下计网的知识:一个交换机上可以通过划分 VLAN 的方式隔离出两个子网。在下面这张图里,蓝色的两根线属于 VLAN 1,红色的三根线属于 VLAN 2。
努力回想计网的知识,想到一个叫做 802.1q 的玩意。802.1q 让交换机之间通过一根网线支持横跨交换机的 VLAN。我还翻出了当年的课件~
802.1Q
如果在一楼加一个交换机,在新交换机上把 VLAN 设置好,然后通过 trunk port 把一楼交换机、弱电箱交换机连接在一起,岂不是就能完美达成设计要求?
进阶版有线回程
计网学得不亏。这个方案我们都能接受,就这样做吧~
组装
今天硬件全到了。先在弱电箱前把各种网络都调试好,再用墙里的线搭建真实网络。不然就等着爬上爬下锻炼身体吧~
调试现场
图里的 AX6000 的七根天线很吓人,但信号也一般般 😂
测速
原以为组装完成后家庭网络改造就可以宣告胜利了。但今天我在三楼进行测速时发现,网速只有 40Mbps,远远低于 300M 宽带应有的速率。
分析原因前,我们先来看看现有的网络拓扑。假设我们要从三楼发送一个数据包,这是数据包的流动路径。
发送数据包
- 从三楼经墙内网线到达弱电箱交换机
- 再由 trunk port 经墙内网线到达一楼交换机
- 进入主路由器 LAN 口后被 NAT 修改报头,从 WAN 口发出
- 再一次由 trunk port 经墙内网线到达弱电箱交换机
- 从弱电箱交换机进入光猫出户
整个流程中如果有一处出现传输瓶颈,网速就会被降下来,这就是木桶效应。一开始我以为是 VLAN trunk 那条线(即连接两个交换机的网线)因为被单线复用了而导致网速下降。查看了交换机的管理界面,发现那条线协商的速率是 1Gbps,远远高于我的带宽。那么瓶颈到底在哪里?
于是我拿着笔记本电脑逐根网线测量速率。最后发现竟然是三楼路由器到交换机的网线出现了问题,协商速率竟然只有 100M。看来墙里预埋的网线是五类线,把整个网络卡在了 100M 上下。除了换线,似乎没有别的解决方案了。
今早醒来转念一想,VLAN truck 线能协商出 1Gbps,为什么三楼到交换机的网线只有 100M?难道装修工人在装修时用了两种不同的网线?这没有道理啊。所以我去恶补了一下通信相关的知识。
百兆时代
首先,网线中传输的都是 CLK 时钟信号与 DATA 数据信号,而且需要双向传输,因此需要传输 TX_CLK、TX_DATA、RX_CLK、RX_DATA 一共四种信号,这样就需要至少四根线。
网线里一共有 8 根芯,在百兆网时代,网线中只有 4 根线被使用,另外留 4 根备用。为了减少布线,装修工人会把一根网线里的 8 根芯拆成两拨,一拨 4 根芯,两端分别压制两个水晶头。这样一条网线就被拆分成两条网线,可以布在一个房间的两个网口上。
千兆时代
千兆网络以太网的铜缆标准有 1000BASE-TX 和 1000BASE-T 两种。其中 1000BASE-TX 的标准是采用 2 对双绞线的,一对收、一对发,和百兆网络原理基本一样。不过对线缆要求高,我家埋的超五类网线是达不到这个要求的。
而 1000BASE-T 标准采用 4 对双绞线(两根两根拧巴在一起)同时发送与接收数据,在接收端采用算法将自己发送的信号滤除掉,只剩下对方发送的信号。这是现在最常用的千兆铜缆标准。因为选择使用这种差分传输,因此需要使用 8 根线。
而我家三楼的网线已经被装修工人拆成四芯网线了,因此速度协商上线是 100M。这就是我在三楼只有百兆网络的原因。
至于换线这件事,因为我家这种复式户型里布线全是墙内直角弯,很容易在重新布线的时候把原来的线扯断。所以暂时不考虑。
总结
峰回路转,总算到达了组网的终点。这么多天,我有了哪些收获呢?
- 入户光猫升级为千兆光猫
- 采用 Mesh 组网的方式统一了 SSID 和密码
- 利用 AP 模式组网消除了 Double NAT
- 使用 SLAAC 分配了 IPv6 地址
- 利用 802.11kvr 协议实现了无缝漫游
- 尝试了有线回程
有哪些遗憾呢?
- 受限于网线布局,二、三楼网络协商速率上限为 100M
虽然网络改造工程伴随着遗憾结束了,但我写出了这篇博客,梳理了整个过程,给未来搭建新网络提供了基础。也许下一次搭建网络是我自己买房自己装修之时,到那时又会出现哪些新思路、哪些新技术呢?也许是万兆网络的普及?也许彻底抛弃了有线?也许第 N 代移动通信技术最终淘汰了宽带?进步永无止境,那我们就之后再见啦~
© LICENSED UNDER CC BY-NC-SA 4.0