聊聊我家的网络环境搭建
前言
众所周知,国内上网的时候会遇到一些DNS劫持,SNI阻断等问题。作为一个程序员,每天上一上Github,上一上V2EX也是家常便饭,所以这时候就非常需要一套可以直接出国的网络部署。基于这种需求,我便开始了对家中网络的折腾。
1.0版本
刚刚接触搭建网络的时候,由于没有什么经验,也没什么现成的方案,所以我选择了最简单粗暴的All in one部署策略。
硬件设施
- 软路由一台(OpenWRT)
部署方式
- 使用OpenWRT当做拨号主路由
- 直接在OpenWRT上使用出国插件,结合pdnsd等DNS解析工具来做国内外分流
优点
- 配置简单,对设备的要求很低,随便一台两网口的j1900小主机就能做到
缺点
- 对DNS的分流不准确,有时会无法获取到国外的IP
- 所有流量都会走出国程序,如果出国挂掉会导致网络不可用
- 对网络带宽有劣化,会降低最大可用带宽
- DNS和其他相关软件,例如AdguradHome不能很好的结合
- OpenWRT的插件依赖于一些第三方开发者的集成,稳定性不能得到保证
- 对不同设备是否出国的管理做的不好
这种方式我使用了大概3年,由于出国程序基本是一套混沌系统,各种原因都有可能导致他挂掉,所以当初老婆经常要让我帮她修网。
2.0版本
这次有了经验之后,添加了新的设备,设置起来更复杂了,但是解决了好几个之前的痛点。
硬件设施
- 软路由一台(爱快)
- 软路由一台(OpenWRT)
部署方式
- 使用爱快作为拨号主路由
- 将需要出国的设备IP添加到分流列表,将列表内的IP添加下一跳网关到OpenWRT
- OpenWRT使用旁路模式作为旁路网关
- 在OpenWRT上运行ShellClash
优点
- 非列表内的设备不会走出国,可以保持网络稳定
- 出国挂掉后,下一跳网关会失效,列表内的设备可以正常上网
- 可以使用AdguradHome作为ShellClash的DNS上游,用来处理去广告
缺点
- 带宽劣化,因为添加到下一跳网关的设备会多一层NAT
- 由于多了一层NAT所以导致NAT等级也会下降,影响一些P2P的应用
这种模式几乎可以解决所有的问题了,所以我也稳定的用了2年多,可以精细的控制哪些设备可以出国,哪些设备不能出国,而且出国挂掉也不会导致网络不可用。
但是随着家里的网络带宽来到了千兆,以及开始有了BT下载和异地组网等需求后,NAT降级和带宽劣化也成为了促使我寻找更加优秀的方案的理由。
3.0版本(当前使用)
这次需要的设备更多了……但是这次也许会是最佳的方案了!
硬件设施
- 软路由一台(爱快)
- 虚拟机/物理机设备一台
- 稳定运行的Docker容器
部署方式
- 使用爱快作为拨号主路由
- 在Docker容器内部署PaoPaoDNS
- 在虚拟机/物理机内部署PaoPaoGateWay
- 在爱快中将内网DNS设置为PaoPaoDNS,添加一条静态路由到PaoPaoGateWay
优点
- 国内网络不会进入旁路网关,所以带宽不会劣化,NAT不会降级
- 由于国内网路完全不进入旁路网关,所以出国挂掉后对国内网络没有任何影响
- PaoPaoDNS本身具有防劫持的能力,同时也能更好的兼容一些DNS相关软件
缺点
- 需要的设备太多了
首先我先来介绍一下PaoPaoDNS和PaoPaoGateWay。
PaoPaoDNS是一款在本地搭建的递归查询服务器。
我们平时用的本地DNS服务,例如dnsmasq,或者分流常用的smartdns、mosdns等,都是本地缓存服务器,他们依赖于上游的公共DNS的准确性,例如如果使用阿里DNS: 223.5.5.5,那他们对国内地址的解析则会和223.5.5.5是相同的,如果223.5.5.5因为种种原因返回了错误的地址,那smartdns、mosdns也会返回错误的地址。
而递归查询服务,会递归查询到权威DNS服务器,这样就可以保证查询的结果是百分百准确的。你也可以理解为你是在本地搭建了一个和223.5.5.5相同类型的服务器,而你的上游就是DNS的根服务器,这样自然准确性可以得到保证了。
PaoPaoGateWay是一款本地搭建的旁路网关。
这个旁路网关做的事情,就是相当于我在2.0版本中的OpenWRT旁路网关。他主要负责对分流到出国线路的域名做DNS(FakeIP)解析,以及转发到出国线路。
PaoPaoGateWay和PaoPaoDNS结合到一起,就可以成为一套配置简单效果理想的抗劫持,支持国内外分流的DNS+网关系统。
具体的配置方式可以去看他们的仓库。
PaoPaoDNS: https://github.com/kkkgo/PaoPaoDNS
PaoPaoGateWay: https://github.com/kkkgo/PaoPaoGateWay