如何解决 DNS 污染
笔者又购入了一台 Nanopi R5S 置于南京的出租屋中,并同样部署了 openclash。 但移动宽带的网络条件比校园网差了不止一星半点,很多常用域名如 Github 等都无法解析。
此外,笔者还需要将特定域名通过 tailscale 转发到校园网内网进行解析。 在这种情况下,openclash 自带的 dnsmasq 就有些捉襟见肘了, 经过一系列尝试,笔者找到了一个较为合适的方案,可以实现如下效果:
- 对于一般网站,可以通过运营商 DNS 解析来找到最快的 CDN。
- 对于外网域名,通过国际公共 DNS 解析,并且支持通过代理查询来找到最快的 CDN。
- 对于校园网域名,通过 tailscale 转发到校内的另一台软路由。
总览
DNS 查询的转发路径如下图所示:
flowchart LR
Client --> Dnsmasq[OpenWrt dnsmasq]
OpenClash[OpenWrt OpenClash] --> SmartDNS[OpenWrt SmartDNS]
Dnsmasq --> SmartDNS
SmartDNS --> Upstream[上游 DNS]
为了 openclash 的可用性,需要保证 openclash 查询到的 IP 和 client 一致,因此 DNS 查询的总出口是 smartDNS。
为了保证某些本地服务的可用性,笔者选择保留 dnsmasq 并将其上游设置为 smartDNS。
smartDNS 设置
正确配置好其他应用的上游之后,通过 smartDNS 即可接管局域网内所有 DNS 解析服务。只需要在这里添加对应的三组上游服务器并配置好分流规则就能实现前文所述的所有功能。
校内域名
需要配合分流规则食用,笔者粗暴的配置了 *.nju.edu.cn,这会导致校外也可访问的网站通过校内的服务器解析,但看起来影响不大,之后可能会考虑进行更细粒度的配置。
对于仅校内解析的域名,笔者选择了让在校内的主路由运行的 dnsmasq 同时监听 tailscale 网口,并向校内的上游服务器转发。也许也可以直接指定校园网 DHCP 下发的服务器,并在 tailscale 上配置好转发规则。
国内域名
没什么好说的,一般来说选择运营商下发的 DNS 服务器即可。
国外域名
需要配合分流规则食用,可以从 github 获取到适用于 SmartDNS 的分流规则。服务器选择上,不推荐使用 UDP 服务器和国内服务器,其他随意。
fallback
这是保证 DNS 分流高可用的关键。最新版本的 SmartDNS 支持 -fallback 参数设置备用服务器,在主服务器超时时启用。推荐将运营商下发的 DNS 设置为 fallback。