部署家中网络的流水帐

我今年 9 月搬家到了藤泽,签了一个非常恶心人的 Softbank 的网络合约之后,花了大半个月才搞清楚这个网络的状况。于是就基于自己的需求,在家中部署了多项服务。今天写这篇文章就是来分享一下部署过程中遇到的困难以及解决的方案。

需求

  1. 能够有稳定的有线、无线网络
  2. 每个设备都有 IPv6 支持
  3. 访问学校资源时自动通过 VPN 连接学校内网
  4. 在局域网内提供 NAS 服务
  5. 在局域网内提供私有 git 服务来维护代码
  6. 支持通过 VPN 访问家中网络
  7. 对外提供 Web 网络服务

之所以定成这样有几个理由。一个是我从来不相信所谓的云网盘,一定要自己存文件才是安全的。其次是经过测试,我的网络基于 IPv6 的传输速度比 IPv4 快不少,上下行都能稳定在 600Mbps 左右。这也使得家中不止要有无线网络,千兆有线网络对于压榨性能也是必不可少的。

为了达成这个网络部署,前后也是经历了两三个月时间细心打磨方案,下面就是具体的过程。

网络拓扑

Home Network

光纤自 NTT 的 GPON 接入 Softbank 的路由。之所以要接入 Softbank 的路由而不是直接接在自己的路由上,是因为 Softbank 使用了一个非常诡异的 IPoE + IPv6 的网络分配形式。其 IPv4 的地址是基于 IPoE 下发的,而其鉴权过程写死在了其定制的路由器中。如果使用 PPPoE 进行拨号,没有办法达到最高的网速,经过实测,PPPoE 只能达到 30Mbps 上下行对等的速度。

路由系统

路由进来后就需要考虑自己的路由系统了,由于这个 Softbank 富士康路由器能调的选项实在是太少,有必要弄一个自己的路由器。考虑到我还打算部署服务,于是就决定弄一个服务器,通过虚拟化的方式来实现。既然说到虚拟化,那么面向个人免费的 ESXi 就是个不错的选择,挑一个对 ESXi 兼容性比较好的,适合放在家里的服务器就可以。

我最终的选择是 HP MicroServer Gen8,

  1. 首先 HP 这款设备虽然有点老,但是性能还是勉强够用,在二手市场上价格非常便宜。新版本甚至不支持 iLO,算什么服务器?
  2. 其次就是 HP 对这款设备在其官网上就有 ESXi 的配套驱动,不需要担心兼容性的问题
  3. 再者由于存储了文件,需要有 RAID 支持来保障文件的可靠性,而这款设备有原生的 RAID 1 支持
  4. 然后就是自带了三个网口,去掉一个 iLO 管理口,剩下两个还能做上下行,满足我们对路由设备的需求
  5. 最后就是这款机器定位家庭服务器、小型公司服务器,所以是静音且不需要机柜的,这可太适合我们这个项目了

HP MicroServer

最终,我在 Yahoo 拍卖上以 35,000 日元(折合人民币 2200 元)的价格买到了一台 Xeon CPU E3-1220L V2 2.3GHz CPU,8GB 内存,没有硬盘的设备。然后单独购买了两块 4TB 的硬盘做 RAID 1。

在 BIOS 中配置好 RAID 选项,直接从 HP 官网上下载相应的 ESXi 镜像,通过 iLO 连接远程安装系统,这一过程非常轻松。另一个网口自然就是要来接交换机的,我在日本亚马逊上以 3,180 日元(折合人民币 200 元)买了一台 NETGEAR GS308-100JPS 的交换机,一共 8 个千兆口,基本够家里使用了。

操作系统选了 OpenWRT 18.06.1,直接 img 拉下来转成 vmdk 塞进 ESXi 里,就可以直接运行了。在 ESXi 中虚拟两个交换机 vSwtich0 接路由器虚拟机、外网网口、管理网;vSwitch1 接路由器、交换机网口以及之后的各种服务。

启动后把外网 IPv4 做成 DHCP,IPv6 做成接力模式。配置内网的 DNS 服务为 ESXi 和 OpenWRT 设置好便于访问的别名,第一阶段完工。

外网服务

接下来来说这个外网服务的问题,这个问题是导致这个项目的网络拓扑变得如此复杂的直接原因。尽管 Softbank 宣称只要打开 DMZ 和防火墙,就可以从公网 IP 访问到设备。经过我将近一个星期的调试,我只想讲一句 fnndp。

在网上找了半天,找到一篇 博客,讲了它是通过开启路由的 PPPoE 穿透,在内网拨号,从而让家中上网走 IPoE + IPv6 的快速网络,而提供服务走的是 PPPoE 的较慢的网络。于是我也打算按照这个方法实施。

我在 ESXi 上安装了一个新的 Debian 虚拟机,也同时接入 vSwitch0 和 vSwitch1 两个虚拟交换机。在 vSwitch0 上进行 PPPoE 拨号,同时从 vSwitch1 上做 DHCP 客户端。然后通过手写 ip rules 的方法实现路由分流。从而让这台设备成为网关 (gateway) 设备,其它服务可以通过这台的端口代理完成部署。

接下来就是比较简单的,配置 StrongSwan 做了一个 IKEv2 的 VPN;安装 GitLab 做了一个私有的 Git 服务。为了方便更多的 Web 服务部署,我使用了 OpenResty,并在上面运行 lua-resty-auto-ssl 的方式自动签发 HTTPS 证书。有关安全的 HTTPS 配置,可以使用 Mozilla SSL Configuration Generator 生成。

内网服务

一个单独拿出来讲的是 NAS。我的选型是 OpenMediaVault。这个系统开源,而且基于 Debian,非常稳定。之所以没有选 FreeNAS,因为我一共只有 8GB 内存,跑 ZFS 还是太吃力了一些。我在 ESXi 上单独虚拟了一个 OpenMediaVault,需要虚拟两块硬盘出来,一块系统盘,一块存储盘,这样管理起来比较容易。

WiFi 的部分是个坑,我一开始觉得这个 Softbank 富士康自带的 WiFi 质量还挺好的,5GHz 能跑上 300Mbps。但后来发现一个严重问题,就是会莫名其妙断流,这个在比如联机玩个马里奥赛车的时候会抓狂。

Cisco AP

这时候某好友送了我一台 Cisco CAP-3502i。虽然这设备 5GHz 连 802.11ac 都不支持,只支持 n。但是却非常稳定。可惜这玩意使用 PoE 供电,如果换成 PoE 的交换机的话,实在是太浪费钱了。于是我就趁着回国间隙从京东买了一个 TP-LINK TL-POE150S PoE 供电模块(99 元)。TP-LINK 这设备又便宜又稳定,但是 赠品的 RJ45 网线还不如不送,送的竟然是 CAT-5 规格的线。我到现在都没搞清,在藤泽,扔网线属于哪一类垃圾,怎么才能扔出去。

杂项

除了上面说到这些,还做了一些小的东西。首先有一个台风天的晚上,我的房间断电了 1 秒不到,我感受到是因为我的服务器重启了。为了应对这种情况,我花了 5,980 日元(折合人民币 366 元)买了一台 255W 的 家用 UPS 以应对突发情况。(长时间的断电我也不防了,毕竟是家用。)

Switch Desktop

另外我给我的桌面上单独配了 Type-C 到以太网的网口,和电源一起接在适配器上,随时把 Macbook Pro 插上去就可以比较好地工作。另外给 Nintendo Switch 也单独配了网线和 USB 网口。千万 不要买任天堂官方的 USB 网口,那玩意甚至是 USB 2.0 的。随便在 Amazon 上都可以买到,比官方的又便宜,速度又快的网口转接器。

最后就是为了访问方便,还是搞一个 DDNS 服务来为家里配一个固定的域名。虽然这 Namecheap 的官方 Guidelines 里讲的花里胡哨的,结果连个 Debian 的例子都没有。我用的是 ddclient 客户端,反正配置还挺简单的。

结论

  1. 别签 Softbank
  2. 我不确定这套玩意跑两年加上电费和云主机哪个便宜
  3. 要是来个地震直接把硬盘砸穿了啥 RAID 都没用
  4. 手写过 iptables 和 ip rules,才知道里面有多少坑