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

国内最佳 dns resolver 解决方案之一

  •  1
     
  •   faicker · 2019-03-09 13:59:47 +08:00 · 22635 次点击
    这是一个创建于 2122 天前的主题,其中的信息可能已经有所发展或是发生改变。

    greendns

    项目地址:greendns

    项目介绍

    一个 python 写的 dns resolver,上游是现有的公共 dns resolver,不依赖 V.P.N。

    • 解析结果无污染并且 cdn 友好
    • 支持多上游,防止单点

    原理和使用方法可以打开 github 项目页面看,应该比现有的 dns 方案都要好。

    使用

    最佳使用方式是用 docker stack。

    • 国外解析无污染、高可用,交给 dnscrypt-proxy
    • 国内解析近距离、高可用,交给 pdnsd

    再提供一个 docker stack 配置,greendns-stack

    个人在 Linux 下已经用了一段时间了。

    最后,欢迎讨论 && Star。

    第 1 条附言  ·  2019-03-23 22:49:20 +08:00
    如果用国外的 DNS 服务器,解析出来的 IP 不是最佳(包括线路和距离)的。
    greendns 对于非污染的域名,还是用的国内公共 DNS 或者运营商 DNS (可配)的解析结果。
    这个就是 CDN 友好。
    26 条回复    2020-02-14 14:17:57 +08:00
    hinate
        1
    hinate  
       2019-03-09 14:02:06 +08:00 via iPhone
    晚上部署试一下
    23f0baf3
        2
    23f0baf3  
       2019-03-10 17:17:08 +08:00
    https://github.com/pymumu/smartdns
    这个也可以考虑,支持平台多包括路由器,协议多包括 TCP,UDP,DOT
    exkernel
        3
    exkernel  
       2019-03-10 17:33:16 +08:00
    @23f0baf3 这货不开源啊 不敢用
    faicker
        4
    faicker  
    OP
       2019-03-11 13:08:34 +08:00
    @hinate 用得怎么样
    taobibi
        5
    taobibi  
       2019-03-12 13:40:03 +08:00
    感谢楼主,二楼的我也打算测试一下,公司已经有一台闲置服务器部署了 dnsmasq,才有 host 列表国内+5353 端口 open dns 的方式一直很不理想,这个打算试试效果
    taobibi
        6
    taobibi  
       2019-03-12 13:45:29 +08:00
    有两个问题,作为 dnsmasq 上游的时候,可以在一个服务器上面同时跑么?
    另外如果独立使用的话,是不是需要卸载 dnsmasq 避免端口占用。
    目前单独的这台 dns 服务器大概需要维持一千多个终端的 dns 解析
    ylx
        7
    ylx  
       2019-03-12 17:40:38 +08:00
    docker 下面不知道怎么玩 lede
    faicker
        8
    faicker  
    OP
       2019-03-13 13:00:56 +08:00
    @taobibi 可以作为 dnsmasq 的上游,改下 greendns 的监听端口,比如 127.0.0.1:54。再在 dnsmasq 里配置上游是 127.0.0.1:54。
    greendns 独立对外提供服务的话,要把监听改为 0.0.0.0:53。要把 dnsmasq 停掉。
    faicker
        9
    faicker  
    OP
       2019-03-13 13:03:06 +08:00
    @ylx 现在这个是 python 版本的,对于 lede 可能占用空间过大(需要 python 环境)。。
    等有时间写个 golang 版本,就能解决了。
    gitopen
        10
    gitopen  
       2019-03-20 09:21:02 +08:00
    正在 macOS 上用 CoreDNS。。。
    learningman
        11
    learningman  
       2019-03-21 18:52:44 +08:00
    golang 的已经有了,https://github.com/AdguardTeam/AdGuardHome
    这玩意儿甚至有一个中文的 Web 前端,巨好用
    faicker
        12
    faicker  
    OP
       2019-03-23 22:45:13 +08:00
    @learningman 不一样。
    adguard 是去 ad,支持 DoH/DoT/DNSCrypt,可以做到无污染。
    greendns 还能做到解析出来的 IP 对于本地访问是最佳的。举个例子,访问国内网站时,是用的国内的公共 DNS 或者运营商的 DNS,这样解析出来的 IP 是最近且访问速度最快的。
    LazyZhu
        13
    LazyZhu  
       2019-03-25 22:35:56 +08:00
    python 写的便携性和性能肯定不如 golang,overtrue 比你好用的多吧

    https://github.com/shawn1m/overture
    faicker
        14
    faicker  
    OP
       2019-03-26 13:10:33 +08:00
    @LazyZhu 非也,我这个不是 dns 服务器,overture 跟 pdnsd,dnsmasq 类似,可以作为 greendns 的后端。
    用我这个,既解决了 dns 污染的问题,又解决了 IP 最佳的问题。
    learningman
        15
    learningman  
       2019-03-30 11:25:18 +08:00
    部署了一下
    我发现这个如果想在 Windows 上运行需要很多修改
    比如说 setup.py 的 data 路径
    比如说默认启动时的 route 路径
    问题主要出现在不同的文件系统格式和环境变量上,希望添加兼容
    LazyZhu
        16
    LazyZhu  
       2019-03-31 16:24:53 +08:00   ❤️ 2
    @faicker 解决 IP 最佳的问题 是 DNSChooser/smartdns(通过对解析到的 ip 逐一连接测延迟,选取最佳), 你的最多像 chinadns 那样用 chnroute 区分国内外.

    @learningman
    推荐两个 chinadns 的替代都比楼主的方便好用
    https://github.com/GangZhuo/CleanDNS
    https://github.com/cherrot/gochinadns
    LazyZhu
        17
    LazyZhu  
       2019-03-31 16:38:41 +08:00   ❤️ 1
    @learningman
    另外两个:
    https://github.com/shawn1m/overture
    https://github.com/sticnarf/yadd

    以上四个都是类似于 chinadns 利用 chnroute 区分国内外解析的且都支持 windows.
    learningman
        18
    learningman  
       2019-03-31 22:50:27 +08:00
    @LazyZhu 我拿来给 ADGuard 做上游了
    ADGuard 有前端界面实在是太友好了
    faicker
        19
    faicker  
    OP
       2019-04-03 13:25:09 +08:00
    @LazyZhu 看了一下其他的,达不到 greendns 这个效果。其他的只有部分功能。
    morphyhu
        20
    morphyhu  
       2019-04-08 16:29:34 +08:00
    @faicker 刚启动了一个,貌似不是很稳定。faicker/dnscrypt-proxy-2:latest 这个不停的重启。
    root@localhost greendns-stack]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    063de39cbf81 faicker/dnscrypt-proxy-2:latest "dnscrypt-proxy -con …" 8 seconds ago Up 2 seconds dnscrypt_dnscrypt-proxy-2.1.1nan8qou1vdfr1bsmyic1xben
    c2f0369c4a9c faicker/greendns:latest "./entrypoint.sh" 9 minutes ago Up 9 minutes dnscrypt_greendns.1.uktbjcz69gxyi2tcdi4axlfoo
    6377dfad7305 vimagick/pdnsd:latest "pdnsd" 9 minutes ago Up 9 minutes dnscrypt_pdnsd.1.hwwfz77r41kd29lyz9v759tq2
    morphyhu
        21
    morphyhu  
       2019-04-08 16:38:11 +08:00
    [2019-04-08 08:29:54] [INFO] Loading source information from URL [https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v2/public-resolvers.md]
    [2019-04-08 08:29:56] [INFO] Loading source information from URL [https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v2/public-resolvers.md.minisig]
    [2019-04-08 08:29:58] [INFO] Loading from [https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v2/public-resolvers.md] failed
    [2019-04-08 08:29:58] [INFO] Loading source information from URL [https://download.dnscrypt.info/resolvers-list/v2/public-resolvers.md]
    [2019-04-08 08:30:00] [INFO] Loading source information from URL [https://download.dnscrypt.info/resolvers-list/v2/public-resolvers.md.minisig]
    [2019-04-08 08:30:02] [INFO] Loading from [https://download.dnscrypt.info/resolvers-list/v2/public-resolvers.md] failed
    [2019-04-08 08:30:02] [CRITICAL] Unable to use source [public-resolvers]: [read udp 192.168.216.130:50367->223.5.5.5:53: i/o timeout]
    [2019-04-08 08:30:02] [FATAL] No servers configured

    貌似是公司屏蔽了第三方 DNS 导致。

    有个新问题 监听地址如何改为 0.0.0.0
    udp 0 0 127.0.0.1:53 0.0.0.0:* 4771/python
    faicker
        22
    faicker  
    OP
       2019-04-09 13:21:51 +08:00
    @morphyhu 在 greendns.env 里添加一行 LISTEN=0.0.0.0:53
    然后重新 deploy,
    docker stack rm dnscrypt
    docker stack deploy -c ./dnscrypt.yml dnscrypt
    Kobayashi
        23
    Kobayashi  
       2019-06-10 17:17:15 +08:00
    @LazyZhu 这个 yadd 不错,IP 分流外加上游转发(支持 TCP 和 TLS ),看来可以替换 ChinaDNS。因为 overture 好像还不支持导入多个配置,准备暂时 dnsmasq+yadd。

    Smartdns 对于解析结果测速不错,但是防不了污染的。它所采取的方案是 IP 黑名单,这个根本不靠谱。另外一个方案,检查结果的 edns option 信息,也只对境外 DNS 返回结果有效。目前有效的防污染方案还是 IP 分流对结果过滤,即要求境内 DNS 返回结果为境内 IP,境外 DNS 返回结果为境外 IP。
    Kobayashi
        24
    Kobayashi  
       2019-06-10 17:35:24 +08:00
    从功能上看,greendns 好像和 overture, yadd 等并没有太大区别,CDN 友好就是根据 IP 分流选取结果吧。楼上 LazyZhu 举出的几个都带有 IP 分流查询,毕竟大家都是借鉴 ChinaDNS。有些还内置了 TCP 和 TLS 转发支持,也就是内置了防污染查询策略。

    另外,楼主这个作品是 forwarding DNS,并不是 recursive DNS。
    NyaMisty
        25
    NyaMisty  
       2020-02-14 14:10:06 +08:00
    我想问问这个 greendns 到底原理是什么。顺便 github 上面写的是什么玩意,矩阵既然都标出来 abcd 了我倒是想知道下面说的 ac ab bc bd 都是什么东西。

    Ref: Github 上 readme 是这么写的
    ```
    First filter poisoned ip with blocked iplist with -b argument.
    Second,
    | A record is local | A record is foreign
    local and poisoned dns server | a | b
    unpoisoned dns server | c | d

    From the matrix, we get the result as follows,
    ac: use local dns server result
    ad: use local dns server result
    bc: impossible. use unpoisoned dns server result
    bd: use unpoisoned dns server result

    Conclusion,
    Using local dns server result if returned A record is local.
    Using unpoisoned dns server result if returned A record is Foreign.
    ```
    NyaMisty
        26
    NyaMisty  
       2020-02-14 14:17:57 +08:00
    @NyaMisty 没事了是我 zz 了)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2611 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:19 · PVG 18:19 · LAX 02:19 · JFK 05:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.