home-networking.drawio (2).png

##

Chapter 1: Network

一般家庭常见的网络接入有两种,一种是光纤入户,另一种是小区宽带。

光纤入户一般是与联通,电信这种运营商签订协议,施工人员上门从信号井里面拉出光纤到家里,然后做光纤熔接,接到送的光猫的光口上,有的光猫还有无线功能,所以我们就可以接入网络了。

而小区宽带则是由一个二级运营商与多家网络运营商接入,再经过交换设备连接网线到家里,家里用路由器插上网线进行 PPPoE 拨号就可以上网了。

一般的光猫都有路由的功能,那路由是什么呢,路由本质上也是计算机的一种,它完成了 PPPoE 拨号、DHCP 网络配置、NAT 转换、DNS 域名解析等功能。

路由拨号以后会经由 NAT 转换,也就是说经由 NAT 转换后我们实际上是这个路由的子网,这意味着我们的流量可以出站,而进站流量是无法访问内部网络的设备的。

要解决这个问题需要将光猫的工作模式修改为 「bridge 桥接模式」,即让光猫将 光口和 LAN 口桥接起来。由后端主路由来进行 PPPoE 拨号动作。

一般的消费级路由器的功能都比较简单,支持的功能会比较少,如果我们希望路由拨号后能获得更多的网络控制权还需要下一番功夫。

这个主路由我们装 OpenWRT 或者是其他的 Linux 发行版充当 Gateway 网关的作用做更细粒度的掌控,来合理分配网络资源,包括端口,NAT、VLAN、Firewall 策略等等。还可以在上上面部署 HAProxy 或者 Nginx 来做 Web Proxy 将流量分发到应用服务器上。

当主路由拨号成功后我们可以获得一个临时分配的公网 IP 地址,租期是根据运营商的在线人数决定的,有时甚至一个月都不会变化,我们可以将获得的 IP 地址同步到域名的 DNS 服务器上,这个就是所谓的 DDNS 动态 DNS 解析。

为了让这个过程更加自动化,我们可以检测当前 IP 地址后与上一个周期的地址进行对比,如果不同则认为IP发生了变化,那么触发同步更新脚本进行修改并推送通知到手机或邮箱防止与网络失联。

这样我们通过域名就可以与家庭网络进行互联,访问到 Home Gateway 以后就可以根据一些策略将流量分配给应用服务进行处理。

上面讲了入站连通性的问题,另一个需要解决的问题是互联网出站连通性的问题,要解决这个问题我们需要知道两个比较重要的概念:DNS 污染、TCP 阻断。

要了解 DNS 污染,首先我们了解一下 DNS 基本运行过程,我们在访问网络的时候会先将域名转换为 IP 地址,这个过程是由 DNS Client 来进行的,DNS Client 通过 UDP 协议将域名请求打包为 Question 数据包,发送给 DNS Server 服务器,DNS 服务器是一个分布式架构,采用树状结构拓扑,DNS 客户端会将 DNS Question 发送给多个 DNS Server 来获取最先应答的 Answer 结果。

正因为这个特性,DNS 可以利用抢先应答的方式来污染解析结果到一个「黑洞IP」(曾经也有解析到 127.0.0.1 的案例)。

也有一些运营商会直接丢弃 Google DNS(8.8.8.8,8.8.4.4) 的 DNS Query 查询请求,来做到 Access Control 的效果。

扩展阅读:https://zh.wikipedia.org/wiki/黑洞_(网络)

**TCP 阻断 **则是当与对方服务器建立连接时,由于该 IP 在 Black List 黑名单中,所以运营商会对该 TCP 建联过程进行 TCP Reset 回执,导致 TCP 连接失败。

通过上面我们可以发现,DNS 的查询过程是明文的,所以运营商可以根据查询的请求内容来决定是否干扰、阻断。那么要解决这个问题可以通过将 DNS 查询请求加密传输来绕过,有两个办法可以做到:DNS over HTTPS、DNS over Socks5 Proxy。

DNS over HTTPS 相比于 DNS over Proxy 会好一些,因为 Proxy 以后 DNS Server 会返回距离 Proxy Server 比较近的应答 IP,会影响 CDN 的作用,导致访问比较慢。

在实践中我们会选择使用 dnsmasq 做前端,因为功能比较强大,可以配置规则,将 gfwlist 中的域名分发给 DNS over Proxy (or DoH)去做解析,这样解析速度会快一些,对国内网站的影响也会比较小。

TCP 阻断是因为运营商可以检测我们建立连接对方的 IP 地址是否在黑名单中,那么可以通过将连接通过 Proxy Server 来绕过。

将 Proxy Server 的地址信息配置到系统的网络设置中,系统中的应用会读取这个设置,来主动经由 Proxy 访问,注意是主动读取这个配置,也有很多应用是不去读取这个配置的,所以就没办法走 Proxy 了。

为了解决这个问题需要在更 low-level 来解决这个问题,通过 iptables(netfilter) 可以在 kernel 层面处理系统的所有流量,通过一些规则将处于 gfwlist 中的 IP 地址转发到 Proxy Server 来做到透明无感知代理。

但是有个问题,我们可以知道哪些网站被 block 了,并且我们整理了 gfwlist 来收集这些信息,但是 IP 地址这么多,而且域名对应的 IP 会随着时间推移而变化,我们如何知道哪些 IP 需要走 Proxy 呢?

两个办法,黑名单和白名单模式。

因为全球 IP 很多,国外的 IP 很多,但是国内常见的网络服务相比起来是要少一些的。所以将所有非国内 IP 走代理也是可行的方案。 ​

多线接入 / 宽带多拨

如果你的家里有条件可以同时接入多个运营商的宽带以获得更好的容灾可靠性,在其中一条宽带断连后另外一条线路依然可用。 ​

同时,你也可以通过一些策略来实现负载均衡和带宽翻倍的效果。 ​

**宽带多拨 **是利用一条线路多次拨号来获得多条网络连接来实现带宽翻倍的软件实现。

跨区域组网

如果你在多个地点都有网络设施,你可以将他们组成一个虚拟的大内网,这样在两个节点之间都可以互相访问彼此的内网设备。 ​

Chapter 2: Hardware

光猫

首先需要把光猫破解掉让它支持 bridge 桥接网络,原理就是利用光猫的漏洞进入后台来调整系统设置,因为不同地区的不同运营商的光猫型号都不太一样,没有统一的答案,这个网络上教程比较多,可以根据自己家里的光猫型号自行解决。

Gateway 网关

我需要在 Gateway 网关这个设备中解决上面 Network 章节中所有的问题,也就是说我希望这个叫做「Home Gateway」 的设备接入网络以后,无论是家里的网络访问外部,还是从外面访问家里的网络,都能畅通无阻。 ​

KEY VALUE
     
CPU J900  
RAM 4GB  
DISK 64GB  
NIC 4 * 1G  

J1900 是 x86 架构的主机,低功耗、无风扇设计,比较适合长时间运行,性能够用价格便宜。 ​

这个 Gateway 我没有使用 OpenWRT 和 iKuai 爱快以及 pfSence 之类的系统,理由如下: ​

  • iKuai 爱快虽然有着不错的 UI 界面以及多线接入和流控功能,但是系统的开放程度不高,我不能控制特定的端口背后运行的服务,比如我想在网关上跑 Nginx 和 HAProxy 之类的就比较困难。
  • pfSense 是很专业的 Firewall 防火墙系统,功能非常强大,但是同样有上面的类似的问题,可定制能力有限。
  • OpenWRT 非常接近我的需求,事实上我在另外一个网络中也一直在用,只是在 J1900 上使用它有点浪费了。

最终,我选择安装 debian server 系统,具体安装过程参见「如何从头搭建路由系统」 ​

Switch 交换机

  • Ubnt Switch USW 24 Port

Server 服务器

# HP Microserver Gen8 DELL PowerEdge r720
CPU Xeon E3 1230v2 Xeon 2560
RAM 16G(2slot) 64GB(24slot)
DISK 10TB(4Ray)  
(2T * 2 RAID1 + 8T * 2 RAID1) 12TB(8Ray)  
3T * 2 RAID1 + 4T * 2 RAID1    
NIC 2 * 1G + iLO 4 * 1G + iDRAC
Power 200W 740W * 2

UPS 在线式后备电源

VMware Sphere 虚拟化

ESXi vCenter

Chapter 3: Application

K8S