V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shinichii
V2EX  ›  DNS

谈谈我的 DNS 治污方案

  •  1
     
  •   shinichii · 2021-10-19 23:50:01 +08:00 · 14299 次点击
    这是一个创建于 891 天前的主题,其中的信息可能已经有所发展或是发生改变。
    开个小号来聊聊……可能是出于性格原因,我对 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 替代品等等。希望能抛砖引玉,看看还有没有优化空间(那么只有砸钱了)。
    第 1 条附言  ·  2021-11-22 11:59:45 +08:00
    后续:增加了软路由并在上面配置好了 smartdns ,基本达到完美状态。可参考 https://www.kafuuchino.fun/archives/675
    第 2 条附言  ·  2022-05-07 17:55:43 +08:00
    后后续:目前已转投 mosdns ,可参考 https://www.right.com.cn/forum/thread-7612747-1-1.html ,相关插件 https://op.supes.top/packages/x86_64/
    29 条回复    2022-01-29 13:33:36 +08:00
    valuable
        1
    valuable  
       2021-10-19 23:54:11 +08:00
    感谢分享
    yanqiyu
        2
    yanqiyu  
       2021-10-20 00:01:22 +08:00
    其实 Google DoT 能在国内直接访问,我是国内开个 AdGuard Home 上游指向 Google DoT,对公网开放 DoT,然后到处用的
    shinichii
        3
    shinichii  
    OP
       2021-10-20 00:06:38 +08:00
    其实还有个缺点,就是得到的 DNS 是根据一号鸡的位置而定的,有可能不是最快的,除非和你的那啥比较近,所以这套方案也是无法满足每个人的需求。
    jinliming2
        4
    jinliming2  
       2021-10-20 00:23:11 +08:00
    @shinichii 关键词:EDNS Client Subnet (ECS)。部分上游 DNS 是支持的( Google 支持,Cloudflare 不支持)。
    请求的时候指定个国内离你比较近的 ip 网段,就可以得到比较近的解析结果。
    lns103
        5
    lns103  
       2021-10-20 00:45:23 +08:00 via Android
    @jinliming2 但是本地化不行,之前我不开代理在路由器上用 Google 以及 cloudflare 的 doh 作为上游,一些国内网站会解析到国外的 CDN 去,造成上网缓慢
    xiaoun001
        6
    xiaoun001  
       2021-10-20 04:20:46 +08:00 via Android   ❤️ 2
    我的方案 异国 ser 一个,本地 lan ser 隧道接入异国,1,路由默认国外,国内静态路由( 5000 多条,汇聚后 200 左右)走国内。2,本地开 bind9 dns,默认转发国内 114,119,gfwlist 国外网站转发上游服务器 dns,我的是 8888,这样,dns 纯净了。 也不会国内龟速了。有兴趣的话,啥时候开个帖子,详细分享一下流量操控。
    Kasumi20
        7
    Kasumi20  
       2021-10-20 09:41:24 +08:00
    写一个 DNS 加密代理不就行了?速度方面客户端和服务端都做一下缓存,为了真实牺牲点速度有何不可。
    有兴趣的可以看看我写的:
    https://github.com/develon2015/dnsd/tree/client-server
    missdeer
        8
    missdeer  
       2021-10-20 09:51:53 +08:00
    fetich
        9
    fetich  
       2021-10-20 09:53:29 +08:00
    嗯,和我的方案差不多,只不过在海外的小鸡上,我只是简单的把 53 请求转发到公共解析。

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

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

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

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

    家里软路由的 linux 上跑个 glider,配好规则,家里问题就解决了,在外面时手机和电脑都 ss 全局连回家也很方便。
    缺点是没有 web 管理界面,不过配置好后一般就不用管了
    Sekai
        12
    Sekai  
       2021-10-20 14:17:52 +08:00
    @missdeer coredns 之前用过也很不错,不过运行时偶尔会有一些报错,具体什么忘了,但仍然是个不错的选择。
    @fetich 如果没白名单可能会有很多奇怪的访问以及造成滥用,udp 方式与海外鸡沟通也是明文,我个人无法接受啊。
    @xiaoun001 隧道接入方式是…酸酸乳?
    @jinliming2 AdH 有 EDNS,不过感觉开了和没开我的体验没啥特别区别,做好国内分流还是比较重要。
    @yanqiyu 把一号鸡放在国内我个人还是无法接受……成本倒是比较低。
    Kobayashi
        13
    Kobayashi  
       2021-10-20 14:20:44 +08:00 via Android
    > 小鸡一号位于不远的异国他乡,运行 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
        14
    fetich  
       2021-10-20 16:54:36 +08:00
    @Sekai 白名單可以使用 iptables 來實現,或者用雲服務商的防火牆;海外小雞和內地小雞異地組網,兩機的通信是加密的。

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

    :doge
    naizhao
        15
    naizhao  
       2021-10-20 17:04:27 +08:00
    累不累。不花钱能搞定的东西,非要花几百块钱租个🐔来搞,还只解决了一个小问题。
    enrolls
        16
    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
        17
    ciyiyi290  
       2021-10-20 20:17:06 +08:00
    牛 B 新手是完全看不懂
    nbweb
        18
    nbweb  
       2021-10-20 22:20:18 +08:00 via Android
    V2ray 内置 dns,本地加密后用异国服务端解密解析,可以分流,可以自定义 gfwlist,部署在网关即可,用了几年了。
    fonlan
        19
    fonlan  
       2021-10-21 07:23:50 +08:00 via Android
    国外这鸡完全没用,都能连到国外了直接 Google DoH 或者 DoT 不就行了,ADH 放家里作为真正用的就好,还能看得见统计
    xiaoun001
        20
    xiaoun001  
       2021-10-21 17:08:12 +08:00
    @Sekai 隧道是到异国 SER 的 虚拟专用网( V.P.N)隧道啊。至于服务啥的,看个人爱好,想用啥都可以,只要能突破。
    Rilimu
        21
    Rilimu  
       2021-10-23 08:51:51 +08:00
    感谢分享。同 #13 楼,推荐楼主去看看 mosdns 。一个软件能干好几个软件的活。可配置性极高,谁用谁知道。我的方案跟楼主也差不多。之前我也是用了很多个不同的软件,后来全部换成 mosdns 了。很稳而且延时比用 Adh 低很多。不知道是不是我之前 adh 配置有问题。
    shinichii
        22
    shinichii  
    OP
       2021-10-24 16:31:04 +08:00
    @Rilimu 非常感谢,抽空研究一下。
    @fonlan 目前确实可以直连,不过速度有快有慢,如果以后情况有变就可能需要这种方案了。
    HalloCQ
        23
    HalloCQ  
       2021-10-26 10:07:27 +08:00
    累不累。不花钱能搞定的东西,非要花几百块钱租个🐔来搞,还只解决了一个小问题。
    HalloCQ
        24
    HalloCQ  
       2021-10-26 10:10:47 +08:00
    adh 可以分流,去广告,支持 ecs.
    在国内装一个 adh 就能解决所有问题了,没必要这么麻烦
    shinichii
        25
    shinichii  
    OP
       2021-10-26 13:10:25 +08:00
    @HalloCQ 我自己算是乐在其中,小鸡也没多少钱,不超过 15 块,而且同时还干别的事情。adh 是可以分流,但不够优雅,同时也担心性能。
    shudongin
        26
    shudongin  
       2021-10-29 15:18:08 +08:00
    @lns103 很显然,4 楼的“关键词:EDNS Client Subnet (ECS)”,你并没有留意。
    leido
        27
    leido  
       2021-11-10 07:41:26 +08:00 via Android
    @Kobayashi 你举的例子过时了,电信联通和移动已经没有网间结算费了
    https://zhuanlan.zhihu.com/p/157578993
    jarodvip
        28
    jarodvip  
       2021-12-29 00:43:59 +08:00
    国内的 VPS 不是都不能开 53 端口么,怎么解决的?
    mike163
        29
    mike163  
       2022-01-29 13:33:36 +08:00
    https://github.com/mikechen163/dohproxy

    支持 doh ,国内域名使用国内 dns,找不到的,去海外域名使用 doh 或者 coredns ,

    cn.txt 文件包含国内域名,可以自定义
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3388 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:37 · PVG 18:37 · LAX 03:37 · JFK 06:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.