谈谈我的 DNS 治污方案

2021-10-19 23:50:01 +08:00
 shinichii
开个小号来聊聊……可能是出于性格原因,我对 DNS 有一种近乎于洁癖的要求,所以在意识到 DNS 的重要性之后,就在两年前摸索适合自己的解决方案。在经过反复折腾和长时间运作之后,感觉效果基本达到预期,也就有了这篇碎碎念,大家可以根据自己情况来改进。

这个方案需要两只小鸡,小鸡一号位于不远的异国他乡,运行 AdGuard Home,作用是从源头得到尽可能干净安全的 DNS,兼顾去广告。上游使用加密 cloudflare 和 Google 的 DNS,需要设置客户端白名单,把家里的 IP 地址段加进来。一号鸡本身申请个证书,拿到后在 AdH 里面启用加密来运行自己的 DNS 服务,根据需要可改端口。

小鸡二号在家里或单位,可以是 WS 或 Linux,看程序支持情况。这里我选择的是 Overture (其他轮子还有 smartdns 、coredns 等等)。二号只运行在局域网内,只通过加密方式获取一号的 DNS 信息,另外还要承担分流、缓存等作用,如果你高兴还可以再次去一遍广告。最后家里各个客户端使用这个二号鸡做 DNS 服务器就可以了,如此这般就基本做到了从始至终都是走加密通道,彻底排污治污。

有些细节要说一下,为啥叫“基本”呢,因为目前为了快一些国内部分我在二号鸡上用的是国内 DNS,如果想更纯,国内也可以加密,但不知道实际意义有多大,我觉得有点太过于极端,但还是要根据各自的实际情况。

第二个是如果路由器上用的是梅林和那个插件,那么还要额外设置才能让路由器也走二号鸡,可以用关键词“KoolShare 梅林固件设置自定义 DNS”来搜,插件里的“DNS 劫持”功能也最好关掉。

第三是这个方案缺点是无法在 AdH 里面看到各个终端的情况,当然你可以在二号上套娃一个 AdH,但分流不太方便,没有 Overture 灵活。另一个缺点是对于一号鸡的稳定性是个考验,你可以配置多个一号鸡,那么成本就高上去了,或者事先想好备用用啥,或者不做路由器上的调整,不至于全部 gg 。

另外还有一些细节可以讨论,比如缓存设置多大、用 DoT 还是 DoH 、是否有更好的 AdH 替代品等等。希望能抛砖引玉,看看还有没有优化空间(那么只有砸钱了)。
14449 次点击
所在节点    DNS
29 条回复
valuable
2021-10-19 23:54:11 +08:00
感谢分享
yanqiyu
2021-10-20 00:01:22 +08:00
其实 Google DoT 能在国内直接访问,我是国内开个 AdGuard Home 上游指向 Google DoT,对公网开放 DoT,然后到处用的
shinichii
2021-10-20 00:06:38 +08:00
其实还有个缺点,就是得到的 DNS 是根据一号鸡的位置而定的,有可能不是最快的,除非和你的那啥比较近,所以这套方案也是无法满足每个人的需求。
jinliming2
2021-10-20 00:23:11 +08:00
@shinichii 关键词:EDNS Client Subnet (ECS)。部分上游 DNS 是支持的( Google 支持,Cloudflare 不支持)。
请求的时候指定个国内离你比较近的 ip 网段,就可以得到比较近的解析结果。
lns103
2021-10-20 00:45:23 +08:00
@jinliming2 但是本地化不行,之前我不开代理在路由器上用 Google 以及 cloudflare 的 doh 作为上游,一些国内网站会解析到国外的 CDN 去,造成上网缓慢
xiaoun001
2021-10-20 04:20:46 +08:00
我的方案 异国 ser 一个,本地 lan ser 隧道接入异国,1,路由默认国外,国内静态路由( 5000 多条,汇聚后 200 左右)走国内。2,本地开 bind9 dns,默认转发国内 114,119,gfwlist 国外网站转发上游服务器 dns,我的是 8888,这样,dns 纯净了。 也不会国内龟速了。有兴趣的话,啥时候开个帖子,详细分享一下流量操控。
Kasumi20
2021-10-20 09:41:24 +08:00
写一个 DNS 加密代理不就行了?速度方面客户端和服务端都做一下缓存,为了真实牺牲点速度有何不可。
有兴趣的可以看看我写的:
https://github.com/develon2015/dnsd/tree/client-server
missdeer
2021-10-20 09:51:53 +08:00
fetich
2021-10-20 09:53:29 +08:00
嗯,和我的方案差不多,只不过在海外的小鸡上,我只是简单的把 53 请求转发到公共解析。

在国内的小鸡上用 AdGuard Home 从 119 和海外的小鸡上获得正确的解析(这里可以启用最快 IP 选项)

所有的机器都使用国内的小鸡。

完美!
cache
2021-10-20 10:26:16 +08:00
@Kasumi20
没看懂,你这个和直接用加一层 tunnel 透传 dns 请求的区别在哪?
还是不能解决楼主说的国内 cdn 加速问题

我能想到最干净的方案是
本地部署一个 dns 缓存服务(解析性能),上游调用一个完美支持 ECS 的 doh 服务器(解析准确性)
github2020
2021-10-20 11:30:15 +08:00
GXXList 里的域名走 dns over proxy 解析,解析完通过 proxy 访问,目标离 proxy 最近;
其它域名通过本地运营商 dns 解析就可以了

家里软路由的 linux 上跑个 glider,配好规则,家里问题就解决了,在外面时手机和电脑都 ss 全局连回家也很方便。
缺点是没有 web 管理界面,不过配置好后一般就不用管了
Sekai
2021-10-20 14:17:52 +08:00
@missdeer coredns 之前用过也很不错,不过运行时偶尔会有一些报错,具体什么忘了,但仍然是个不错的选择。
@fetich 如果没白名单可能会有很多奇怪的访问以及造成滥用,udp 方式与海外鸡沟通也是明文,我个人无法接受啊。
@xiaoun001 隧道接入方式是…酸酸乳?
@jinliming2 AdH 有 EDNS,不过感觉开了和没开我的体验没啥特别区别,做好国内分流还是比较重要。
@yanqiyu 把一号鸡放在国内我个人还是无法接受……成本倒是比较低。
Kobayashi
2021-10-20 14:20:44 +08:00
> 小鸡一号位于不远的异国他乡,运行 AdGuard Home,作用是从源头得到尽可能干净安全的 DNS
机器多的没处用吗?直接本地 DoT 、DoH 或者代理转发 DNS 请求到国外公共 DNS 不就行。都是转发 DNS 请求,你开台机器转发和本地直接转发没区别。你搞台机器在国外完全多此一举。
你可以直接用 Overture 把一号机的活儿干了。不过我更推荐 mosdns,没有 overture 那种只能引入 2 个配置文件的限制。另外他们 DoT 、DoH 实现上游不一样。历史上 overture 出现过 DoT 实现 bug,一个 DoT 到 8.8.8.8 花了我 1s…… 而 mosdns 还自己实现了连接复用。coredns 就更算了,连个好的 IP 过滤实现都没有,每次还得重新编译。

> 如果想更纯,国内也可以加密,但不知道实际意义有多大,我觉得有点太过于极端
这个通常不需要,国内走加密不是为了应对 DNS 污染,而是运营商 DNS 劫持。这个涉及运营商网间收费。比如,你移动宽带用户访问我联通宽带资源,联通就要收移动的钱。小运营商为了省钱会自己建立一些反代缓存,通过 53 口 NAT DNS 劫持把用户请求导过来。不过,这个要不要防劫持还有待商议,因为小运营商网络不是很好,很多网都是租来的,你不打到它的反代上速度肯定会变慢。

> 当然你可以在二号上套娃一个 AdH,但分流不太方便,没有 Overture 灵活
部署一个 AdGuadHome 做记录统计和去广告,上游指向同机器上 overture 而不是外网 DNS.

> 比如缓存设置多大、用 DoT 还是 DoH 、是否有更好的 AdH 替代品等等。
缓存单人 500 条就够用,我从来没打满过。家庭用我觉得 1000 条肯定够。
以前我用的是 dnsmasq/unbound+chinadns. dnsmasq 和 unbound 做转发功能没 mosdns 多,但设计的其他方面比 overture 、mosdns 这种业余的肯定要专业。dnsmasq 和 unbound 都可以查询一些统计信息,里边就包括缓存信息。

> 希望能抛砖引玉,看看还有没有优化空间(那么只有砸钱了)。
你 DNS 转发到小鸡一号,和直接 DoT 、DoH 到外网公共 DNS 没有什么区别。小鸡一号完全没必要。

扩展一下关于 EDNS Client Subnet,我自己是不开这个。因为不仅要去污染,还要走代理。代理是不使用你本地解析的 IP 的,甚至都不需要解析到没有污染的 IP,只要能正确分流即可。参考 https://blog.skk.moe/post/what-happend-to-dns-in-proxy/
比如 Surge 就没实现 Clash 那种 DNS 分流加无污染。

所以严格来说,完全可以不做 DNS 无污染。电脑上我会部署 mosdns 。如果你部署在路由上,想要记录查询请求,前边套一个 adguardhome 即可。
fetich
2021-10-20 16:54:36 +08:00
@Sekai 白名單可以使用 iptables 來實現,或者用雲服務商的防火牆;海外小雞和內地小雞異地組網,兩機的通信是加密的。

是不是不小心用大號回覆了???

:doge
naizhao
2021-10-20 17:04:27 +08:00
累不累。不花钱能搞定的东西,非要花几百块钱租个🐔来搞,还只解决了一个小问题。
enrolls
2021-10-20 18:08:01 +08:00
@shinichii 请问,你手机不在 WIFI 的时候,你的 DNS 怎么查?
@missdeer 兄弟,你的版本我 view 过了,1 是 ads 不维护了,且 ads 加入 20~30W 规则好像会跪; 2 是 prepare.sh 替换好像比较多的东西

我的是远端机器 dnscrypt-proxy 2 个,分别叫 inside outside,差异于 edns_client_subnet 。树莓派 vless+quic 转发到远端,coredns 用于判断使用 inside 还是 outside 。coredns 插件自己来。

目前替代 ads 的插件基本上好了,降低了内存占用,加了 wildcard 匹配。不过感觉上游用 AdHome 去广告更好(它的引擎粒度更细)

转发的插件,从先 forward 抄过来,改了 match 的逻辑,100%转发 cn 域名到 inside,根据规则转发(support wildcard mode)到 inside,最后没走规则就 outside 解析。

现在最大的问题是,缺一份国内 top50 app 的域名列表,1-2 级域名,走 wildcard 模式。没有好项目去收集规则的话,就打算用 ksubdomain 或者捉取一下网上的 api
ciyiyi290
2021-10-20 20:17:06 +08:00
牛 B 新手是完全看不懂
nbweb
2021-10-20 22:20:18 +08:00
V2ray 内置 dns,本地加密后用异国服务端解密解析,可以分流,可以自定义 gfwlist,部署在网关即可,用了几年了。
fonlan
2021-10-21 07:23:50 +08:00
国外这鸡完全没用,都能连到国外了直接 Google DoH 或者 DoT 不就行了,ADH 放家里作为真正用的就好,还能看得见统计
xiaoun001
2021-10-21 17:08:12 +08:00
@Sekai 隧道是到异国 SER 的 虚拟专用网( V.P.N)隧道啊。至于服务啥的,看个人爱好,想用啥都可以,只要能突破。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/809036

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX