编注:

本文是少数派 2021 年度征文 活动 #生活 21 标签下的入围文章。本文仅代表作者本人观点,少数派对标题和排版略作调整。

和往年不同,今年文章的数据表现将很大程度上决定征文活动的最终走向,包括「双倍稿酬(由飞书赞助)」活动奖励、最终票选名单以及征文奖品类型。如果你喜欢这篇文章,不妨通过充电或评论的方式支持作者。


前言

环境介绍

我的寝室是一个大约 15 平的双人间,因为不是上床下桌的结构,两个人的床和衣柜占据了寝室中绝大多数空间,剩下留给我的私人空间,仅是一张 120cm 长,带有书架的学习桌,加上周围零零碎碎的空间,总共约 4 平米大小。在这个不大的空间内,仅仅放下两台显示器都稍显局促,可能学校在设计之初就并不希望我们花费大把的时间浪费在寝室的书桌上(笑)。

图源自网络

在这个不大的空间内,原本我并没有什么期待,能够打个游戏/吃个外卖,就已经不错了。但我是一个爱折腾的人,其实在远在 1300KM 的家中,我早就部署好了全屋 HomeKit,无死角的 Wi-Fi 网络,NAS 等等极客爱玩的东西。在学习之外的时间,我对着寝室这巴掌大的地方,内心只有无限地失望和抱怨。而在疫情返校之后,「为什么不让它变得更舒适些?」这样的念头就一直萦绕在我的脑中。

舒适的网络,是一切的开始

网络是现代人生活的基础,也是我们与世界连接的桥梁。好的网络环境是我们这些科技爱好者舒适生活的大前提,然而我们宿舍的网络环境并算不上优秀。

宿舍的基础网络,问题很多

现在的校园,基本上都是以教育网为主,我们学校也是如此。校园网有其独特的优势比如:

  • 每一个分配的 IP 都是独立的教育网公网 IP
  • 上行带宽大
  • 访问学术网站可以有文献库授权
  • 在校内即使网段不一样也可以通过三层交换机互相访问1

但是校园网对我来说也有一些不可忽视的问题:

  • 校园网需要繁琐的认证过程
  • 受限于公网IP的数量,每个学生只能有 5 个设备同时在线。
  • 由于宿舍建造时间比较久远,宿舍内的网口最高只支持 100Mbps
  • 按流量计费

繁琐的认证过程对于桌面设备而言还有简洁的实现办法,但是对于移动设备而言整个设置过程可以说是灾难级的体验;特别是学校封锁了 HTTP 认证方式而全部转为 HTTPS 认证之后,整个验证过程就变得更加糟糕了。不过好在学校也开放了 802.1x 的认证方式,经过一番操作以后移动端的体验稍微好了一些。但同时在线设备数量限制对于我来说则是一个巨大的痛点,设备数量繁多的我必须要套一层 NAT 并且设置端口转发或者 DMZ 才能获得较为不错的远程和局域网体验。

而流量计费则是彻底扼杀了我对于校园网的幻想,如果按照我的网络消耗量来看,将会是一笔不可忽视的支出,相比起来 100 Mbps 的带宽反而并不那么不可接受。

不过好在我生活的宿舍楼还算比较新,近几年移动宽带也把光纤拉进了每个寝室内。这对于有极大流量需求的我来说算是一根救命稻草,不过移动宽带也有一些致命的缺点:

  • 没有公网 IP
  • 天生 NAT 3,并且由于移动宽带的特性,联网游戏的丢包率极高体验非常糟糕

我改了一点点,就差一点接近完美

两种网络都有他们独自的优势和劣势,那对于一个成年人来说,当然是「我全都要」,取其所长,弃其所短。那么接下来我就来和各位盘盘我的宿舍网络结构。首先先上一个网络拓扑图:

宿舍网络拓扑图

入网

首先,移动的光纤接入房间之后,连到光猫上,为了获得最好的上网体验,肯定需要使用桥接模式进行 PPPoE 的上网设定,好在移动校园宽带本身为了多播(让同寝室多个同学用不同的宽带账号),本身就是带有 VLAN 的桥接模式,这省去了我很多时间。光猫 LAN 口直连我的路由器—— Unifi Dream Machine Pro (以下简称 UDM Pro)的 WAN 口进行播号上网。给宿舍局域网,我设定了 192.168.31.0/24 的网段,这也是我宿舍的主要局域网络,各个设备都在同一个网段下进行通信。

 

而校园网则需要专门调整一下,原本校园网设计上是普通学生从宿舍墙面上的 86 面板上连接路由器或者交换机,学生再通过进行自建局域网或者用自己的 IP 分配名额再给不同的设备分别获取 IP,而由于我平时只有两台主力桌面端设备—— PC 与 Mac mini 需要连接校园网,所以我使用 VLAN 技术对其进行划分:

VLAN:Virtual LAN,又称虚拟局域,是一种建构于局域网交换技术(LAN Switch)的网络管理的技术,可以借此技术透过控制交换机有效分派出入局域网的分组到正确的出入端口,达到对不同实体局域网中的设备进行逻辑分群(Grouping)管理,并降低局域网内大量资料流通时,因无用分组过多导致壅塞的问题,以及提升局域网的信息安全保障。

而划分 VLAN 再加以适当的防火墙规则就可以隔离校园网和局域网中的广播,让我的各个设备不至于串台,也可以让我的两个主力设备获得不同的独立校园网 IP。

宽带网线从光猫接出之后,连接到 UDM Pro 的 WAN 口上,通过 PPPoE 进行播号。校园网端口则直接连接到 UDM Pro 的 LAN 口上,在配置中为其专门划分一条 Campus LAN 的 VLAN 网络,设定为 VLAN-only 网络,而局域网则设置为 LAN 打开 DHCP 服务器。如此设置,两个网络环境就已经接入我的路由器了。

网络划分

UDM Pro 的下级,连接着我需要有线上网的设备,包括了:PC,Mac mini,Apple TV 4K,PS5,树莓派以及无线接入点 (Access Point)。不过下级网络的构造上就稍显复杂,为了让 PC 和 Mac 都可以同时连接宽带,首先要在 UDM Pro 连接两台桌面设备的端口上设定为 Untagged 口(由于 UnifiOS 中的 VLAN 设定与其他厂商逻辑不一样,这里用更大众化的表述方法)。在 macOS 的网络设定中可以很轻松的划分一条或者多条 VLAN,而 PC 由于主板就带有双网卡,我就毫不客气的接上了两条网线,每个端口对应一个局域网/校园网。

光是接上网线并不能让设备在宽带和校园网中无缝穿梭,于是我针对我需要访问的特定网络,在设备的路由表中指定了学校的网关,和更小的「跃点数」2,来让需要用学校路由访问的 IP 段能在设备中获得更高的优先级。同时,也指定了 0.0.0.0 以及更大的「跃点数」来让非校园网内容统一走宽带的路由地址。至此,我的两台主力设备才算完美的接入到「双网络」环境中。

 

不过稍显可惜的是 UDM Pro 并不支持双 WAN 接入,如果是支持的设备(比如 OpenWRT/RouterOS 等系统的设备),仅需要在路由器上配置规则就可以做到局域网内的所有设备均可以访问两个广域网而非对于特定设备设定路由表制作双局域网了。而对于局域网内的其他一些设备比如 Apple TV 4K,我则直接选择 Mac mini 上的 Surge 进行接管,以获得更良好的冲浪体验。

这是我的寝室网络树状图

还有一些不足,但是我克服了一些

经过我的改造以后,寝室的网络确实已经接近完美的状态,但是还有一个暂时没有找到方法克服的痛点,那就是校园网的 IP 问题,由于学校并不可能给我们分发固定 IP,而自己设定固定 IP 的时候很有可能会和其他同学的设备冲突导致无法上网。因此在两台在双局域网的环境下的设备,我依然选择了 DHCP 上网的方式。

平时我在实验室工作的时候,偶尔需要使用 Microsoft Remote Desktop (以下简称 RDP) 远程访问我寝室中的 PC 来处理一些 macOS 无法处理的数据。

Microsoft Remote Desktop」をApp Storeで
Microsoft Remote Desktop

不过由于寝室网络和实验室的网络并不在同一个二层网络中,所以按照主机名进行远程登录的方法就被堵死了,但是通过 IP 还是可以借由学校的三层交换机互相访问。而因为 IP 地址是由学校的 DHCP 服务器分发的,会随着时间变化的 IP 就成了令我头疼的问题,因此我在我的 PC 上设置了一个 DDNS 服务:

DDNS:Dynamic DNS又称动态DNS 是域名系统(DNS)中的一种自动更新名称服务器(Name server)内容的技术。根据互联网的域名订立规则,域名必须跟从固定的IP地址。但动态DNS系统为动态网域提供一个固定的名称服务器(Name server),透过即时更新,使外界用户能够连上动态用户的网址。

简单的来说,当你需要访问一个网址的时候,你的电脑会先向 DNS 服务器请求这个网址对应的 IP 地址。通过 IP 地址,设备之间才可以建立起连接。而 DDNS 则是把我动态的 IP 地址映射到 DNS 服务器上的一种服务,每当我的 IP 变化,DDNS 服务就会把变更后的 IP 地址反映给 DNS 服务器。这样当我输入域名网址时,DNS 服务器就能正确的返回我 PC 目前的 IP 地址。

通过我自己一直在用的 CloudFlare 托管我的 IP 地址,这样在使用 RDP 进行访问的时候只需要通过我的域名进行 DNS 解析,就可以指向正确的远程地址了。

通过域名远程访问寝室的 PC

而当校园网 IP 变更时,我也设置了一个基于 Python 的邮件提醒服务。这样不管我寝室的 IP 如何变更,我都可以最快的知道,以防部署的 DDNS 服务失效,无法访问寝室设备的窘境出现。

IP 变更邮件提醒服务

至此,我寝室的网络结构搭建,到这里结束了,虽然不排除未来会有升级的可能性,但是目前的结果对于我来说已经非常满意了。

自动化的娱乐系统,是幸福感提升的根源

搞定了网络,接下来的着眼点就应该在从实验室回归的短暂的空闲时光了,但是空闲的时间有限,经常有时候会因为媒体搜刮的烦恼不愿意去占用宝贵的休息时间,最后放弃一个影片或者剧集。为此我改造了我的媒体流程。

如何管理我的媒体,才能缓解一天的疲劳

我的影音管理主要分为两个部分,在线流媒体和本地媒体。在线流媒体主要用来看一些及时更新的剧集电影:比如 Disney+,Netflix,YouTube 等等,这些流媒体我都在我的 Apple TV 4K 上进行观看,配合 tvOS 仪式感满满。而从流媒体直接观看内容,也省去最麻烦的资源搜刮过程。

我的 Apple TV 主页

但是对于一些不在这些主流流媒体的内容,比如日本动漫新番,以及日剧。我则采用了本地媒体进行观看的方式,通过 Plex Server 管理本地剧集,搜刮元数据,再通过 infuse 客户端(iPhone/iPad/Mac/Apple TV)进行观看。

经历过早些年番剧下载时期的朋友肯能会有所感触,资源的收集和整理是一件相当痛苦的事情。为此,我搭建了我的自动追番系统:

自动追番系统

我的自动追番系统主要搭建在我的树莓派上,依靠一个外置 2.5 寸机械硬盘存储数据,详情可以参考这篇文章 树莓派搭建低配版文件存储及家庭影音库。可能会有人问为什么不选用 NAS ,第一是因为相比于树莓派 NAS 的价格较高,第二则是使用 3.5 寸硬盘的 NAS 非常吵闹,非常不适合寝室这种狭小的环境。

而在树莓派中,自动追番系统主要依靠 qBittorrent 这个 BT 软件。qBittorrent 支持 RSS 订阅下载。通过「蜜柑计划」的生成的个人 RSS 订阅链接,qBittorrent 可以在你订阅的每一部番剧追番的时候收到RSS推送更新。

自动追番系统示意图

由于 qBittorrent 中 RSS 的自动下载规则设置起来相当繁琐,因此我使用 qBittorrent Web API 和「快捷指令」搭建的「追番规则建立器」来简化添加自动下载规则这一步骤。这样搭建下来,每一季度仅需要两步:

  1. 在「蜜柑计划」中点击你想要追的番剧
  2. 运行快捷指令并输入你追番剧的名称

简简单单两步设置,就完成了一部番剧的订阅和归类。在这部番剧更新的周期内,一旦更新,第一时间,qBittorrent 就会开始自动分类下载,下载完成之后,配合 Plex Server 的元数据搜刮整理功能,你就可以在你所有设备使用 infuse 上无感的追番看番。

当然如果有其他搜刮的资源,也可以用「快捷指令」配合 qBittorrent Web API ,直接用右键选单中进行下载

完美的游戏联网体验,往往就是一小步

在网络搭建的部分的开头,我提到过移动宽带的丢包多,NAT 类型差,不适合主机联机游戏等等问题。当然这些问题解决的方法也很简单,那就是给主机挂一个加速器。我是一个多年的 「UU 加速器」用户,因此也知道通过 PC 给主机加速的操作着实复杂且不友好,先不提复杂的代理地址配置,并且在想要给主机加速的时候 PC 还要保持常开,并且需要在电脑上点击加速,一旦电脑不加速,主机就会断网。使用代理设置之后主机客户端和其他联网设备也不在一个网段中,无法通过局域网远程游玩进行畅玩。这着实称不上优雅方便。

操作繁杂的 UU 加速器

目前我体验过最为方便的加速方案当属路由器中自带的 UU 加速插件:使用简单,无需额外配置,手机端切换节点,自动加速等等优势令我眼馋。然而可惜的是目前市面上仅有寥寥数款路由器支持这一功能, UU 官方也并没有给 Unifi 系列网关进行适配(笑)。

而我的解决方案则是在树莓派上用 Docker 挂载一个 UU 加速器的 OpenWrt 插件,只需要让主机的网关和 DNS 地址都指向 UU 加速器容器的地址,并且在手机上绑定一回就可以获得和路由器自带的加速插件相同的体验:

并且这个版本的 UU 加速器还可以同时加速两个设备,加上电脑与手机端,一份会员可以同时加速四个设备,这样算下来 UU 加速器原本高昂的售价也变得超值了。

操控的便利性,是舒适感的敲门砖

有了网络基础和娱乐基础,懒人的智能化就是下一步目标。对于苹果用户来说 HomeKit 一定是首选,一来有着极高的安全性,全部依靠局域网广播实现控制。而来还有 Homebridge 这样的万能插件,可以给我更多操作的可能性。

HomeKit 设备,不多不少刚刚好

除了上文提到的 Apple TV 4K ,我的寝室还有一些不贵的 HomeKit 原生配件。寝室不大,能接入智能家居的配件也不算很多,但是各个都能提升我的生活质量。

寝室中的 HomeKit 配件

温度控制——Aqara P3 空调伴侣

好在学校并没有使用中央空调来降温,独立的悬挂式空调让智能化变得简单。我选用了Aqara P3 空调伴侣,其原理也很简单,是通过安置在插座上的红外发射装置学习空调的遥控器发射信号来控制空调。我简单设置了几个自动化,来实现在夏天时回到寝室前提前制冷,以及应对出门忘关空调导致跑走巨量电费的应急措施。

Nanoleaf Essentials light bulb

这款灯泡主要是由于我对 Thread 协议的好奇而购入的,现在摆放在我书桌的另一侧当照明补足使用,偶尔还能当当氛围灯。

Thread 极其快速的响应时间

满打满算我的寝室也只有这两件是原生接入 HomeKit 的配件了,剩下的一些控制都小用了一些奇思妙想。

我的第三方控制整合主要依靠 HomeBridge 插件,相信深入玩过 HomeKit 的朋友都不陌生:

SwitchBot Hub mini & SwitchBot Bot

改造宿舍强电是一个非常不明智的选择,一来可能会埋下安全隐患,而来校规中也有明令禁止的条款。因此我选择了一个讨巧的方法来控制两站宿舍的日光灯。那就是日本品牌的 SwitchBot Bot,开关控制器。这个小玩意原理非常简单,通过蓝牙接收信号之后可以伸出一个机械卡扣,用物理的方式控制开关的通断。

通过 SwitchBot Bot 控制开关

一方面不用顶着安全和校规隐患改造开关,另一方面这个小东西也可以随时带走。再接入 SwitchBot 家的 Hub 之后,就可以用 HomeBridge 接入到 HomeKit 当中控制宿舍两盏灯的状态了。

而 SwitchBot Hub mini 的红外控制功能也十分强大,可以自主定义并且学习电器的红外遥控信号,然后通过 Homebridge-Switchbot 插件桥接进 HomeKit 中后,仅需要一些简单的设置就可以控制我寝室显示器的 KVM,再配合上细致化的场景设置。四台设备可以无缝的在一台显示器上切换显示输出内容。

通过 HomeKit 唤醒和的 Mac 和 PC

相比其他用 HomeKit 实现的花里胡哨的功能,唤醒 PC 和 Mac 显然有用多了。因为我 PC 的主板和 Mac 都支持「网络唤醒」功能,因此使用 HomeBridge 中的 Homebridge-WoL 插件,就可以轻松把 PC 和 Mac 的电源接入整个 HomeKit 系统中。

homebridge-wol

相比于传统的开机棒,使用 Homebridge + HomeKit 的安全性和整合度更高,响应迅速。不论是在局域网还是广域网中,都可以快速控制寝室中的电脑设备。再配合「晚安」场景关闭 PC ,到达实验室打开「工作」场景拉起 PC 等等自动化,实现不论是在工作中,还是上床休息,都可以按照所需状态打开或者关闭 PC。

当然除了 PC 和 Mac,其他一些诸如路由器,树莓派以及 PlayStation 5 也可以通通用这个插件控制。有兴趣的同学可以看:一日一技|把 PlayStation 加入 HomeKit

通过 HomeKit 控制各类服务

实体的电器都接入 HomeKit 之后,虚拟的服务也不能少。不过相比于实体电器来说,接入服务需要一些小技巧。我这边挑选 qBittorrent 举个例子。插件上,我仅使用了 HomeBridge-Dummy 用于虚拟需要控制服务的开关。而控制 qBittorrent 我则用了家庭自动化中自带的「快捷指令」,根据 qBittorrent 给出的 Web API:

  • 暂停:/api/v2/torrents/pause?hashes=all
  • 继续:/api/v2/torrents/pause?hashes=all

再根据格式添加到 URL 命令中:

使用「快捷指令」调用 Web API

在点按 HomeKit 中的虚拟开关时,HomeKit 家庭中枢就会调用这一条快捷指令,向指定的 HTTP 地址发送请求,从而触发服务内的开关。

同样的方法也可以用于 Docker 容器的启停,Surge 上代理的开关,等等稀奇古怪的操作,不过可惜的是更新到 iOS 15 之后,HomeKit 自动化中的 SSH 指令就不能使用了,不然还可以对服务做更加细致的控制。

统筹规划,Web页面不可少

容器管理

我的所有服务基本都部署在树莓派的 Docker 上,而用命令行管理 Docker 容器是一件很痛苦的事情,因此我选择 Portainer 作为 Docker 的管理器。Portainer 作为一个轻量级容器管理 UI,可以替代几乎所有 Docker 的命令行操作,同时升级或者更改容器环境变量也变得异常简单,再也不需要因为一条命令写错而反复去找容器的 ID。作为 UI 而言,Portainer也十分美观,并且在最新版本也适配了黑夜模式。并且 Portainer 也有可供使用的 HTTP API,通过前文讲述的方法,可以很轻松的把容器管理接入到 HomeKit 中(当然也可以用 Homebridge-docker 这个插件来管理)

入口管理

有了 Portainer 管理运行的各类容器,但是如何快捷的转跳到 Portainer 等服务的 WebUI 界面呢。在搭建容器的时候,一般这些服务的的 WebUI服务 都会需要你在 IP 地址之后添加上繁琐的端口号,比如:

  • http://HOSTIP:8181 —— qBittorrent Web 服务地址
  • http://HOSTIP:8581 —— Homebridge Web 服务地址
  • https: //HOSTIP:9443 —— Portainer Web 服务地址

这显然给便捷管理带来了不便,因此我在 Docker 中运行了一个 Nginx(一种常见网页服务器) 来作为树莓派的导航页。Nginx 默认使用 80 端口,也就是万维网端口,因此只需要在浏览器中输入服务器的 IP 地址就会默认在后面添加 80 端口,转跳到 Nginx 服务中指定的 HTML 网页。

当然美观的页面也是必须的,作为一个网络乞丐,我去搜刮了一段 CSS 代码,完成了我的「服务器城门」,想要访问或者管理我的任何一个服务,只要点击对应的图标即可。

我自己搭建的 Web 服务端

当然,入口网址的地址我们同样可以托管到 CloudFlare 上。通过 DNS 服务器会返回一个私网的 IP 地址,是仅限内网使用的域名。

结语

写到这里,可能和大家想象的寝室桌面介绍大相径庭,稍微收拾了一下桌子给大家看一下我并不算整洁的桌面。就我个人而言,服务和网络相比于整洁美观的桌搭更符合我的需求,更像是在虚拟世界中搭建了属于自己的桃源,可能这某种程度也和当下互联网的某新型概念不谋而合,折腾的过程也确确实实变成了我枯燥的科研生活的调味剂。而这些项目虽然看起来繁多且复杂,但是大多数实际上手起来对于我这种非计算机科学的学生来说实现起来也不算困难。当然更重要的是有一个不妥协的心和去做的行动力,我想这可能是我作为一个刚入门的极客对于生活的态度和追求。

目前寝室的书桌全貌

非常感谢可以看到这里的你,也希望我折腾的这些东西中或多或少可以对你改善自己的生活娱乐体验有些许帮助!

> 下载少数派 客户端、关注 少数派公众号,找到数字时代更好的生活方式 🎊

> 年度回顾、好物推荐…… 更多精彩尽在 少数派 2021 年度盘点 🎉