ChinaDNS-NG

自从上次大费周章搞定了 OpenWRT 的编译以及一系列软件的设置后,软路由一直稳定运行了近一年时间,期间我也从 N4500 升级到了 N100。性能上限的提升也让我可以多跑几个 docker 容器,充分玩转例如像 Alist 这样的工具。

直到有一天,正当我需要访问一个网站时遇到了问题。这个网站是湾湾的一个类 kickstarter 的团购网站,网址为 flyingv.cc。网址和网页内容看上去都一切正常,但在不使用全局模式,或将该域名加入名单强制访问代理的情况下,网站无论如何都无法打开。

这种情况一般都是由 DNS 污染所引起的,通过本地以及软路由上 ping flyingv.cc 得到的 IP 也应证了我的判断。这让我再一次认真审视 OpenWRT 下所有和 DNS 相关的服务以及他们所起的作用。

首先 SSRPLUS 无论是 GFW 模式还是大陆 IP 模式,都是基于域名名单匹配,并不能完全杜绝 DNS 污染(许多域名不再列表内,但被 DNS 污染,此时解析出的国外域名即便通过代理也无法访问)。没有匹配到的域名都会由国内的 DNS 负责解析(运营商下发的 DNS 或者 114 等国内常用的 DNS),对于上述问题,我确认后发现,国内的 DNS 无论哪家解析出的 IP 都是一个无法访问的国外 IP。

ChinaDNS-NG 正是为了解决以上问题而生,它基于一个 DNS 污染的假定,就是被污染的 DNS 解析出的 IP 都是国外的。因此如果一个域名由国内的 DNS 解析出国外的地址,则默认不可信,需要用代理服务器的 DNS 重新解析才接受最后的 IP。虽然大陆 IP 的判定仍然是基于名单,但大陆 IP 的名单相比域名名单,改动频率低,匹配可信度高,总体更为稳定和可靠。

ChinaDNS-NG 同样由 chinalist/gfwlist 域名匹配以及 chnroute/chnroute6 IP 匹配组成,前置的域名匹配为了提高性能,如果匹配成功则可以节省一次访问上游(配置文件中 china_dns 这里我设置为 114)DNS 服务器的开销。而如果通过国内 DNS 服务器得到的是国外 IP(通过 chnroute/chnroute6 匹配判定),则需要通过可信 DNS(配置文件中 trust_dns 通常配置为 SSRPLUS 中设定的 DNS,如 DNS2TCP 或 DNS2SOCKS 的地址)再次解析以得到最终 IP,在这里我我使用的是 DNS2TCP 运行在 127.0.0.1:5335 上。ChinaDNS-NG 运行在本机 5353 端口上,因此需要将 dnsmasq 中的 DNS 转发到 127.0.0.1#5353 最后整体 DNS 解析流程如下。

  • dnsmasq @ *:53/UDP => chinadns @ 127.0.0.1:5353/UDP
  • (若域名匹配) => dns2tcp @ 127.0.0.1:15335/TCP => 8.8.8.8:53 (得到最终 IP 结束)
  • (若域名未匹配) => 114.114.114.114:53 (使用国内 DNS 解析)
    • (若结果为国内 IP) => (得到最终 IP 结束)
    • (若结果为国外 IP) => dns2tcp @ 127.0.0.1:15335/TCP => 8.8.8.8:53 (得到最终 IP 结束)

结果验证

dig <domain.com> @127.0.0.1 -p <port>

直接使用代理服务器 (DNS2TCP) 解析目标域名得到可信的最终结果

dig flyingv.cc @127.0.0.1 -p 5335

使用国内任意 DNS 解析域名得到收到污染的 IP

dig flyingv.cc @114.114.114.114 -p 53

使用 ChinaDNS-NG 解析域名得到可信的最终结果

dig flyingv.cc @127.0.0.01 -p 5353

然而我当我觉得大功告成之时,最后验证本机 53 端口,也就是通过 dnsmasq 源头解析域名时,得到的仍然是收到污染的 IP。

dig flyingv.cc @127.0.0.01 -p 53

Turbo ACC 网络加速设置


原来还有另一层影响着 DNS 的最前端解析,就是 Turbo ACC 中的 DNS 加速设置,而它加速的原理则是将自己设置在最前端(如果打开默认会将 dnsmasq 的转发设置到 PDNSD 上),并且自带缓存,由于它无法和 ChinaDNS-NG 配合使用(上游服务器无法设置成 ChinsDNS-NG),因此目前的解决方案是关闭它。

dig flyingv.cc @127.0.0.01 -p 53

最后确认本机 53 端口返回正确的 IP 地址。在操作过程中还需要注意 dnsmasq 自身的缓存等干扰因素。

参考资料

OpenWRT之科学上网
好好学习,天天向上!
GitHub - zfl9/chinadns-ng: chinadns 重构增强版,支持域名分流、ipset/nftset、UDP/TCP/DoT
chinadns 重构增强版,支持域名分流、ipset/nftset、UDP/TCP/DoT. Contribute to zfl9/chinadns-ng development by creating an account on GitHub.
Lean OpenWrt DNS解析流程研究
背景 自己使用的是k2p路由器,安装Lean大的openwrt后非常好用,尤其是ssr plus插件,开启绕过中国大陆模式后,无论国外网站是否被
官方openwrt软路由科学上网状态下可以完美IPV6及科学上网
编译官方openwrt加入ssrp及smartdns完美解决国内域名IPV6上网和科学上网不和谐问题。