wenxuan1999

十一天组网日记

Wenxuan Shi /
March 15, 2022
34 min read

2022 年 3 月,阳光明媚,春回大地,绿意盎然。无奈受疫情影响,我没法回学校了。抓住在国内的最后机会,解决痛点、重整链路,踏出全屋智能的第一步。没想到的是,升级网络挑战重重,峰回路转,跌宕起伏,总结式的说明文已经没法 hold 住这么多内容了。因此我用日记(流水账)的形式记录折腾的过程。希望能给读者带来几分钟的乐趣。

Day1. IPv6 地址

☀️3月2日 周三 3~18℃

COVID-19 Ο 变种在中国各地爆发。深圳多地被划为中风险区域。大四的我有毕设任务,却不能回学校做实验。好在计算机专业的大多数实验可以通过远程连接完成。只要设备联网,我们就能使用。

学校因为网络安全的原因,原则上禁止私自假设反向代理。想要在校外访问内网地址,需要主管部门审批 VPN 资质。南科大使用了深信服开发的 VPN 系统(这家公司因为开发员工监视软件而臭名昭著),它的软件缺乏很多功能:例如,做实验时我经常一边访问 Google 一边访问校内网络,开启 VPN 后我的常规代理就失效了。有同学试着将深信服 VPN 包进 Docker 容器,向外暴露 SOCK 接口,用 SwitchOmega 这类插件进行代理分流。很不方便。

我的实验设备放在南科大的工学院,通过网线连接到实验室的交换机,交换机连接到墙角的网线接口。这样的有线连接可以同时获取到内网的 IPv4 地址和公网的 IPv6 地址。设备有了公网地址,就不用费劲整校内 VPN 了。

问题是,我在家里没有 IPv6 地址,也就没法直接连接学校的设备。

❯ curl 4.ipw.cn
223.68.97.161
❯ curl 6.ipw.cn
curl: (56) Recv failure: Connection reset by peer

2022 年,三大运营商早就提供了 IPv6 地址,各设备也早就支持了 IPv6 协议。拿不到地址的问题肯定出现在家庭网络的配置上。我要从源头开始逐项检查,首先是入户的光纤调制解调器,然后是各层楼的路由器,最后是我手上的终端设备。

Day2. 问题排查

🌤️3月3日 周四 6~22℃

入户的光纤调制解调器(后称 “光猫”)是中国移动装宽带时附赠的方盒子,装在弱电箱里,默认是全家的网关 (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 年确实不像话。现在我有充足的理由更换新的路由器。该跨入下一个时代了。

Day3. 深入调查

🌤️3月4日 周五 11~24℃

我说「我家的网络情况很复杂」,真的不是在夸大其词。为了更直观的说明,我画了一张简易地图。

家庭网络布局
家庭网络布局

2017 年组装网络的师傅跑上跑下弄了整整一天,最终弄出了这样的网络:

  • 地下室:108_underground
  • 一楼:108_A (2.4GHz), 108_B (5GHz)
  • 二楼:108_2
  • 三楼:108_3A (2.4GHz), 108_3B (5GHz)
2017 年方案
2017 年方案

各层楼有的用着新路由器,有的用着搬家带着的祖传路由器;有的支持 5GHz 频段,有的只有 2.4GHz…… 总之各层楼路由器各司其职,互不关心。

装宽带的师傅告诉我,这种组网是复杂户型里最常见的模式。

主要还是偷懒。“又不是不能用” 的思想非常危险。

在这个网络里,光猫兼具拨号和网关两个功能。路由器通过 WAN 口连接光猫后,自己又成为二级网关。如果听上去太绕了,可以看这个例子。

🌐
  1. 光猫创建了子网 192.168.1.0/24,自身作为网关的 IP 为 192.168.1.1
  2. 一楼路由器通过 WAN 口连接光猫后广播 DHCP 请求。光猫返回 IP 192.168.1.2,于是一楼路由器获得了 IP 192.168.1.2
  3. 路由器在 LAN 口创建了子网 192.168.2.1/24,自身作为网关的 IP 为 192.168.2.1
  4. 手机连接一楼路由器后广播 DHCP 请求。路由器返回 IP 192.168.2.2,于是手机获得了 IP 192.168.2.2

这样组网带来的坏处是:

  1. 各层楼独立 SSID。上下楼需要手动切换接入的 WiFi。例如我从三楼走到一楼吃饭,如果不主动切换 WiFi,手机仍会连接到三楼的路由器,网络不稳定。
  2. 各层楼的网络设备不连通。由于各路由器均使用 Router 模式,都占用了 192.168.0.0/16 的 IP 段,不同楼层之间无法通过局域网直接连接。例如我在连接三楼 WiFi 的条件下,无法控制一楼的智能设备。
  3. Double NAT。[光猫 - 路由器] 是一层 NAT,[路由器 - 设备] 是二层 NAT。导致 P2P 无法穿透。这在 BT 下载、联机游戏时会有明显的延时。
  4. QoS(服务质量)差。即使开启了 WMM 协议保证同一 WiFi 下关键设备(如机顶盒)信道的优先抢占,但各路由器在光猫视角是平等的,跨楼层的网络抢占问题严重。
  5. 路由器在 /64 网段下通过 SLAAC 拿到的 IPv6 地址只能使用 DHCPv6 向下分配。

这么多坏处,看来家庭网络需要一次大改。

Day4. 无缝漫游

☀️3月5日 周六 11~24℃

停停停一下。在跳进过度设计的深渊之前,先来搞清楚一点:既然光猫已经承担了网关的功能,只要把路由器调整成 AP 模式,上述的问题不是都能解决吗?

📶

路由器工作模式

在部分读者的强烈要求下,我先简单解释两种路由器工作模式的区别。

Router 模式指路由器工作在 “三层”(无线路由器,是一种网关)。它能够识别 IP 地址,分辨数据转发的接口。例如,将内网 IP 地址向 LAN 接口转发,外网 IP 地址向 WAN 接口转发。开启 NAT 功能时路由器工作在 “3123\frac{1}{2}层”。它修改了链路层报头,通过识别与替换 [IP - 端口] 的二元组,实现向不同接口的数据转发。

AP 模式指路由器工作在 “二层”(无线接入点模式,类比无线交换机)。它能够通过识别 MAC 地址分辨数据应向何处转发。

话是这么说没错。如果路由器都工作在 AP 模式下:

  • 各层楼网络设备互相连通
  • 不存在 Double NAT
  • SLAAC 分发 IPv6 的问题也解决了
  • 但是上下楼仍然需要手动切换接入的 WiFi
难道不是两个 AP 把名字设成一样就能自动漫游了吗?
🎵 没那么简单~

智能手机切换 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 个回家~

Day5. Mesh 组网

⛅3月6日 周日 5~13℃

好,想要满足自动漫游无感切换,就需要购买支持 802.11k/v/r 的新硬件。之前在实验室里用小米路由器觉得它的 Web 管理做得不错,比较了一下,决定购买这两种路由器。

硬件名称数量旗舰店单价
Redmi 路由器 AX30003 个249 元
小米路由器 AX60001 个599 元

参考价格 249×3+599=1346249\times3 + 599 = 1346 元。实际购买时赶上了 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] }

  • 还是压根就不联(通过无线信号桥接)

路由器接电后都会自动构建出最快的拓扑,顺利同步配置,拓展网络的覆盖范围。

Day6. 方案设计

☀️3月7日 周一 5~17℃

尽管 Mesh 组网是自动的,但它只能在已有的结构上自适应,不能超越物理线路的限制。网络拓扑的构建(说白了:线怎么连、网线插哪些口)仍然需要我们手动优化调整,以搭建最佳网络结构。

Mesh 组网方案有三种:有线回程、无线回程、AP 模式。其中无线回程是指路由器通过无线频段交换数据实现网络拓展,带宽损耗大、延迟高,不建议使用。

AP 模式类似我现有的网络拓扑。仍然是光猫负责拨号和网关,但路由器会失去很多功能。例如:数据包只经过二层就被转发走了,因此路由器无法通过 iptables 名单进行广告拦截或透明代理。

AP 模式
AP 模式

有线回程是最合适的组网方案。光猫桥接到一个主路由器,由主路由器负责拨号和网关,子路由器接入主路由器的 LAN 口作为 AP 使用。

有线回程
有线回程

可以把广告拦截、透明代理、端口转发等附加功能全部放在主路由器上,一处配置,全家所有设备均可享用。

Very well,LGTM,那这就是最终方案了?

No, no, no。这个方案里有一个致命的不可抗力因素没有考虑 —— 我妈。主路由器从弱电箱里拖了两根网线和一根电源线出来,导致弱电箱箱门关不上。弱电箱在门口,美观不能得到保障。美观高于功能性,难缠的甲方呵。

我们不妨把目光重新移到上面 “有线回程” 那张图上。主路由不能拖在弱电箱外面,那也许可以放在一楼,利用墙里的线作为 [光猫 - WAN] 的连接线。可是,[LAN - 交换机] 的这条线咋整?墙里只有一根线啊?

Day7. 进阶方案设计

☀️3月8日 周二 6~21℃

记得 16 级金融工程系的学长跟我开玩笑说:「学完计网,最大的用处就是可以去电信做上门安装路由器的师傅。」最后我的计网拿了 99 分,终于如愿以偿做了一次安装路由器的师傅。

扯远了,我需要继续优化 “有线回程” 的方案设计。现在面临的困境依次是:

  1. 我妈觉得路由器拖在弱电箱外面很丑
  2. 路由器可以通过墙里的网线连接到弱电箱
  3. 路由器需要两根网线但墙里只有一根

不管三七二十一,我们先假设墙里有两根线,交汇到交换机旁边。如何配置交换机使得这个网络成立?

回想一下计网的知识:一个交换机上可以通过划分 VLAN 的方式隔离出两个子网。在下面这张图里,蓝色的两根线属于 VLAN 1,红色的三根线属于 VLAN 2。

努力回想计网的知识,想到一个叫做 802.1q 的玩意。802.1q 让交换机之间通过一根网线支持横跨交换机的 VLAN。我还翻出了当年的课件~

802.1Q
802.1Q

如果在一楼加一个交换机,在新交换机上把 VLAN 设置好,然后通过 trunk port 把一楼交换机、弱电箱交换机连接在一起,岂不是就能完美达成设计要求?

进阶版有线回程
进阶版有线回程

计网学得不亏。这个方案我们都能接受,就这样做吧~

Day8. 组装

☀️3月9日 周三 6~22℃

今天硬件全到了。先在弱电箱前把各种网络都调试好,再用墙里的线搭建真实网络。不然就等着爬上爬下锻炼身体吧~

调试现场
调试现场

图里的 AX6000 的七根天线很吓人,但信号也一般般 😂

Day9. 测速

🌤️3月10日 周四 7~26℃

原以为组装完成后家庭网络改造就可以宣告胜利了。但今天我在三楼进行测速时发现,网速只有 40Mbps,远远低于 300M 宽带应有的速率。

分析原因前,我们先来看看现有的网络拓扑。假设我们要从三楼发送一个数据包,这是数据包的流动路径。

发送数据包
发送数据包
  1. 从三楼经墙内网线到达弱电箱交换机
  2. 再由 trunk port 经墙内网线到达一楼交换机
  3. 进入主路由器 LAN 口后被 NAT 修改报头,从 WAN 口发出
  4. 再一次由 trunk port 经墙内网线到达弱电箱交换机
  5. 从弱电箱交换机进入光猫出户

整个流程中如果有一处出现传输瓶颈,网速就会被降下来,这就是木桶效应。一开始我以为是 VLAN trunk 那条线(即连接两个交换机的网线)因为被单线复用了而导致网速下降。查看了交换机的管理界面,发现那条线协商的速率是 1Gbps,远远高于我的带宽。那么瓶颈到底在哪里?

于是我拿着笔记本电脑逐根网线测量速率。最后发现竟然是三楼路由器到交换机的网线出现了问题,协商速率竟然只有 100M。看来墙里预埋的网线是五类线,把整个网络卡在了 100M 上下。除了换线,似乎没有别的解决方案了。

Day10. 8in4

🌤️3月11日 周五 13~27℃

今早醒来转念一想,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。这就是我在三楼只有百兆网络的原因。

至于换线这件事,因为我家这种复式户型里布线全是墙内直角弯,很容易在重新布线的时候把原来的线扯断。所以暂时不考虑。

Day11. 中国移不动

☀️3月12日 周六 11~29℃

今天早上又无聊打开了交换机的管理界面,突然发现光猫到交换机的协商速率只有 100M。瀑布汗 ( ̄ ▽  ̄")

赶紧趁周末打电话给移动客服,质问他们为什么 300M 的宽带只给我百兆光猫。客服在电话里辩称系统上显示我家装的是千兆光猫,还说光猫不是所有 LAN 口都是千兆的,我应该换一个 LAN 口试试。于是我向客服描述了我的光猫只有一个 LAN 口的事实,他终于明白是所谓「系统里的真相」只是一个错误的标注。

打完电话后一个小时宽带维修师傅就上门了,话不多说就给我换了新光猫。我坐在旁边看宽带师傅忙活,看他注册新设备。他的工作流程是接上设备,登录 Web 管理,选择「新设备注册」,填入我的宽带账号,接着发一条微信给他的同事,让他的同事在管理机房向我下发网络信息。

接着他给我带来了这几天最大的噩耗:新版移动光猫不能桥接了。

我理解不桥接是因为用户自己乱设网络 99% 的后果都是上不了网,然后打电话给移动增大宽带师傅的工作量。但是不桥接显然是一个谎言 —— 硬件是必然支持桥接的 —— 你只是想减轻自己的工作量。我心想,你走之后我还能用超级密码把桥接打开,你不帮我配置我就自己来。

过了半小时我得知了这几天第二大的噩耗:新版移动光猫的超级密码变了。

最终我只能回到 AP 模式组网的备用方案。

为什么中国运营商不让桥接

软件工程领域有一个原则:一个程序应该负责干好一件事,而且只负责干好一件事。这个原则放在光猫、路由器上是一样的。光猫负责调制解调就行,不用凑热闹提供网关、DHCP、路由表等等服务。这些服务应该由拥有更强 CPU、更多内存的路由器承担。

但三大运营商提供的光猫尝试把所有事情都包揽,有的甚至还支持无线 WiFi 功能,把无线路由器也给省了。这是好事吗?对于普通用户也许是:宽带师傅上门安装网络后就能直接用,不用担心出问题。

但对于想要追求更多网络功能的用户来说:作为服务提供商绑架消费者的行为非常恶心。宽带师傅被培训不帮忙开启桥接;甚至 V2EX 论坛里还有网友反应:如果强行开启桥接,运营商会通过限速的手段惩罚你。

我开始好奇不让桥接背后的根本原因。我知道光猫在接入互联网的同时会接入一个城域网,叫做 “中国移动宽带管理中心”,会在 10.255.0.0/16 子网中自动获取一个 IP 地址。这个地址光明正大地写在光猫的 Web 管理页面上,用作 “远程管理”。这个远程管理还关不掉。也就是说远端机房的工作人员可以随时接入我家的光猫,通过光猫访问到我的子网。他还可以看到我接入网络的所有设备,包括设备的 IP 地址和 MAC 地址。如果光猫和路由器桥接,所有设备就躲进了路由器的 NAT 背后,远端就无法查看我的网络情况了。

哪些东西属于隐私,哪些东西不属于隐私,我不知道法律如何定义。但当被窥视的不适感始终包围之时,我不想为潜在的窥探者争辩。

总结

峰回路转,总算到达了组网的终点。这么多天,我有了哪些收获呢?

  • 入户光猫升级为千兆光猫
  • 采用 Mesh 组网的方式统一了 SSID 和密码
  • 利用 AP 模式组网消除了 Double NAT
  • 使用 SLAAC 分配了 IPv6 地址
  • 利用 802.11kvr 协议实现了无缝漫游
  • 尝试了有线回程

有哪些遗憾呢?

  • 受限于中国移动,有线回程被迫取消
  • 受限于网线布局,二、三楼网络协商速率上限为 100M

虽然网络改造工程伴随着遗憾结束了,但我写出了这篇博客,梳理了整个过程,给未来搭建新网络提供了基础。也许下一次搭建网络是我自己买房自己装修之时,到那时又会出现哪些新思路、哪些新技术呢?也许是万兆网络的普及?也许彻底抛弃了有线?也许第 N 代移动通信技术最终淘汰了宽带?进步永无止境,那我们就之后再见啦~

© LICENSED UNDER CC BY-NC-SA 4.0