Chapter 1: Network

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

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

需要注意的是,这种接入方式光猫负责了这几件事情:光电转换和路由功能(PPPoE 拨号、DHCP 网络配置、NAT 转换)

也就是说经由 NAT 转换后我们实际上是这个光猫的子网。这意味着我们的流量可以出站,而进站流量是不能主动接入的(Port-Forwding 也不行)。

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

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

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

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

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

首先我们了解一下 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 的作用,导致访问比较慢。

如果不能用 DoH 可以用 dnsmasq 做前端,因为功能比较强大,可以配置规则,将 gfwlist 中的域名分发给 DNS over Proxy 去做解析,这样解析速度会快一些,对国内网站的影响也会比较小。

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: Server Layout

  • 交换机
  • 摄像头
  • 服务器

Chapter 2: Application

  • VMware ESXi 虚拟化
  • Kubernates