我的家庭科学上网方案:基于Hyper-V的 OpenWrt 和 AdGuard Home

最近2年我都使用透明网关的方式,在路由器下接一台 x86 的 OpenWrt 软路由跑 Open-WRT,将路由器的网关设置为 OpenWrt ,这样的好处是当这台“破烂 x86 机器”坏掉了,只是不能上网,内网还是通的,登录到路由器上将网关设置为主路由器 IP 即可常规上网。OpenWrt 透明网关设备没坏的情况下,局域网内的其他设备都会通过 OpenWrt 设备上网,OpenWrt 内运行 SSR Plus 设置为绕过中国大陆 IP 模式,实现“科学”上网。

上述方案运行两年多一直挺稳定。最近使用的机场改变了 SS 协议,我之前编译的 OpenWrt x86/64 不支持,所以新编译一个,顺便折腾了下家里的网络。先是想使用一台闲置的 UBNT ER-X 设备替换掉 X86 盒子,因为 ER-X 可以使用交换机的 POE 供电,这样既节省空间又显得清爽。实际运行了一天发现 ER-X 的性能还是太弱一些,看 Youtube 4K 比较卡,查看控制台只能跑到 2w Kbps 左右,所以起了换回 X86 的心。

后来又想起了以前尝试过的 DNS 方案,看到很多人推荐 AdGuard Home,也想试试。AdGuard Home 除了去广告(说实话 DNS 去广告效果不如浏览器的去广告插件,但胜在全家可用,一定程度避免老人访问到诈骗网址),我还比较在意的就是 DNS 服务器功能。但我又不想将 AdGuard Home 编译进 OpenWrt 中,一方面对于非官方的东西缺少信任,另一方面也有一些洁癖心理,担心混在一起会弄乱。这样就需要一台额外的设备跑 AdGuard Home 服务。尽管家里有闲置的台式机,但毕竟 10700 CPU 比较费电,所以就突发奇想在 X86 盒子上装上 Windows Server,将 OpenWrt 和 AdGuard Home 都泡在 Hyper-V 里面。

Hyper-V 安装 OpenWrt

之前在公司的设备上折腾过 Hyper-V 装 OpenWrt,网上的教程都没说明白,虽然最后成功了,但心里其实还是糊涂的,既不清楚怎么不行,也不清楚怎么突然就行了。经过在家反复尝试,终于实践出真知,理解之后才发现其实很简单。

单网卡的 Windows Server 在 Hyper-V 中安装 OpenWrt,需要先将 OpenWrt 虚拟机网卡设置连接到内部交换机,在电脑上配置好其 IP 地址,再将 OpenWrt 虚拟机的网卡切换成连接到外部交换机,这样 OpenWrt 就能连接到主路由器了。另外还有一点,如果你的主路由的 DHCP 设置为 192.168.1.0/24 网段,那么就会存在问题。因为 Lean 的 OpenWrt 编译出来默认是 192.168.1.1 的地址,所以如果虚拟机的网卡连接到外部交换机,则与主路由器一般会冲突从而无法上网;而如果是内部交换机,则电脑的虚拟网卡也需要设置成 192.168.1.0/24 网段的才能访问到 OpenWrt,这就与外部网络冲突了;所以解决方式只能是将主路由器的 DHCP 设置为非 192.168.1.0/24 的网段。

AdGuard Home 设置上游 DNS

AdGuard Home 则使用一台 Ubuntu 虚拟机,照着官方 Github 教程很容易安装,安装后自动设置服务,很方便。比较麻烦的配置是上游 DNS 设置。一般来说,我们想要海外网站获取不被污染的 DNS 解析结果,又想国内网站和服务能不被解析到海外从而享受国内的速度。AdGuard Home 支持根据不同的域名使用不同的上游 DNS,那我们只需要知道哪些域名是海外的或者墙外的即可,gfwlist 是一个不错的数据源。经过一番搜索,找到了一个转换 gfwlist 到 AdGuard Home 规则脚本。

该脚本只包括 gfwlist,所以还需要修改,最基础的是将非 gfwlist 域名的上游 DNS 也做处理,比如我将非 gfwlist 中的域名都设置为使用腾讯和阿里的 DoT 和 DoH 服务器。如果想定时更新这个配置的话,需要判断更新 gfwlist 的任务是否正常完成,如果不做判断,原来的脚本会直接不包括 gfwlist 的条目覆盖掉上次成功更新的内容也不妥。我不太会写 shell 脚本,所以就简单的根据行数判断,新文件行数少于老文件的,则视作更新失败,不覆盖之前的文件。修改完成后的代码在这里:https://gist.github.com/robustmaster/7f6618aa778f85da0e6499ee7b98ea2a。如果需要定时跑的话,添加如下 cronjob 即可:

0 4 * * * /path/to/gfwlist2adguardhome.sh -s tls://dns.google >/dev/null 2>&1

以上代码表示在每天 4 点运行 gfwlist2adguardhome.sh(记得替换脚本的路径),使用 Google 的 DoT DNS 服务器 解析在 gfwlist 列表中的域名。

最终的网络结构

家里的设备基本都是已有的,只是替换了 OpenWrt 的承载设备,并增加了 DNS 服务,最终的结构也就比较简单,如下图:

跑了下 FAST 测速,网速 300-400 Mbps,看 Youtube 4K 也有100~200 Mbps 的速度,非常流畅, CPU使用也较低,不像 ER-X 那样跑到 70-80 Mbpbs 就 CPU 100% 了,性能够用。为什么使用 Windows Server 而不是 ESXi 或者 PVE?只能回答是个人偏好,喜欢比较傻瓜一点的。

后记

使用 AdGuard Home 后,发现小米智能家居设备大量连接小米的服务器,连接可以理解,但请求频率是不是太高了点?还发现电视盒子也不断的发起请求,正常的统计类请求倒还好,怎么电视盒子还隔段时间请求 12306,莫非盒子也产生了自主意识想出去看看?遂重置盒子系统,以后只装几个视频应用算了。

# # #


《 “我的家庭科学上网方案:基于Hyper-V的 OpenWrt 和 AdGuard Home” 》 有 3 条评论

  1. 沉舟侧畔说道:

    以前也曾经折腾过,后来想想有这功夫还不如好好学习外语、出国去定居,就不用折腾这些东西了

  2. 青木说道:

    我也是类似的设计 ikuai做主路由,部分有特殊需要的设备,给他们分配的网关指向openwrt,爽歪歪

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注