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

用吃灰的树莓派建了一个自动 DNS

  •  
  •   adrianzhang · 2018-06-05 21:34:14 +08:00 · 14039 次点击
    这是一个创建于 2123 天前的主题,其中的信息可能已经有所发展或是发生改变。
    0 ) 你懂得
    1 ) 使用普通 DNS 软件,bind 和 unbound,无其他 xxdns。
    2 ) 无需人工参与编辑列表。
    3 ) 良好使用 CDN

    需要的前提条件:有个自动的路由器。

    原本这里写了教程,点击“创建”后收到提示:抱歉,能不能不要在这里讨论这个。
    好吧,那就不发了。有需要的发邮件吧。
    第 1 条附言  ·  2018-06-06 16:43:51 +08:00

    感谢 @marenight ,不需要发邮件了,直接看这里

    第 2 条附言  ·  2018-06-06 17:06:25 +08:00
    感谢 @XiaoxiaoPu
    reverse dns ==> recursive DNS
    70 条回复    2021-05-10 07:09:06 +08:00
    pluto
        1
    pluto  
       2018-06-05 21:55:49 +08:00 via Android
    只是解决了 dns 污染吧。
    adrianzhang
        2
    adrianzhang  
    OP
       2018-06-05 21:58:10 +08:00
    @pluto 是的
    wjm2038
        3
    wjm2038  
       2018-06-05 22:25:49 +08:00 via Android
    用户名 @gmail 多谢
    Charkey
        4
    Charkey  
       2018-06-05 23:34:27 +08:00
    可以弱弱的问一句什么是“自动的路由器”吗
    divint3
        5
    divint3  
       2018-06-05 23:36:25 +08:00 via Android
    @Charkey 大概是接通电就启动,有写启动脚本和守护进程。防止当机吧。
    marenight
        6
    marenight  
       2018-06-05 23:45:03 +08:00
    可以写个博客,或者 http://telegra.ph/
    divint3
        7
    divint3  
       2018-06-05 23:48:55 +08:00 via Android
    Charkey
        8
    Charkey  
       2018-06-06 00:09:48 +08:00
    @divint3 那和这个自建 dns 怎么搭配
    adrianzhang
        9
    adrianzhang  
    OP
       2018-06-06 00:14:37 +08:00
    @Charkey 就是干净的,且不需要维护 list 的。
    adrianzhang
        10
    adrianzhang  
    OP
       2018-06-06 00:16:03 +08:00
    @wjm2038
    @divint3
    已发。
    adrianzhang
        11
    adrianzhang  
    OP
       2018-06-06 00:19:48 +08:00
    Tink
        12
    Tink  
       2018-06-06 00:20:08 +08:00 via iPhone
    i ### tink. im
    adrianzhang
        13
    adrianzhang  
    OP
       2018-06-06 00:25:31 +08:00
    @Tink 看上一条回复
    XiaoxiaoPu
        14
    XiaoxiaoPu  
       2018-06-06 01:31:12 +08:00   ❤️ 1
    reverse dns ==> recursive DNS
    bind 本身就有缓存功能,不需要再加 unbound 了
    bao3
        15
    bao3  
       2018-06-06 03:20:20 +08:00 via iPhone
    直接用 chinadns 的 docker 不就好了,既能防污又能缓存,再不济,你直接装个 pi-hole,既能过滤广告,又有 dnsmasq 区分列表,列表在 github 上有
    adrianzhang
        17
    adrianzhang  
    OP
       2018-06-06 08:20:06 +08:00
    @bao3 这两种方法,都无法 100%得到每个名字最准确的解析。这也是萌生本文办法的根本原因。
    bao3
        18
    bao3  
       2018-06-06 09:45:00 +08:00 via iPhone
    @adrianzhang 你配置 dnssec 就可以保证国外的解析,国内的 dns 自然也自动解析准确
    a1114262301
        19
    a1114262301  
       2018-06-06 10:05:50 +08:00
    adrianzhang
        20
    adrianzhang  
    OP
       2018-06-06 10:17:15 +08:00
    @bao3 https://www.v2ex.com/t/329560
    建议你看完方法的思路后好好想想
    hzqim
        21
    hzqim  
       2018-06-06 10:24:00 +08:00
    dns-adrianzhang#register.hzq.im
    谢谢。
    cye3s
        22
    cye3s  
       2018-06-06 10:31:43 +08:00
    你这是国内 DNS 也丢外面去解析了?所以有 CDN 优化的要求?我直接 dnsmasq+ipset+gxwlist,dns 用 dns-forwarder tcp 走科学通道丢 vps 上去解析,反正后继流量也走科学通道,cdn 应该也对了吧?国内正常的 dns 没多少污染吧?运营商做的?没碰到过
    adrianzhang
        23
    adrianzhang  
    OP
       2018-06-06 10:34:09 +08:00
    @cye3s 国内外分开的。你的方案里始终离不开个 list,gxwlist 不也是 list 么。
    billchenchina
        24
    billchenchina  
       2018-06-06 10:34:22 +08:00
    YmlsbGNoZW5jaGluYTIwMDFAZ21haWwuY29t 谢谢!
    billchenchina
        25
    billchenchina  
       2018-06-06 10:37:11 +08:00
    感谢!抱歉看到您已经在 telegraph 发文章了,那就不用您发 Email 了,
    huiyifyj
        26
    huiyifyj  
       2018-06-06 10:38:20 +08:00 via Android
    adrianzhang
        27
    adrianzhang  
    OP
       2018-06-06 10:44:24 +08:00
    @huiyifyj 请看 telegraph
    cye3s
        28
    cye3s  
       2018-06-06 10:55:52 +08:00
    @adrianzhang
    那你是国外站全走通道了?我还是需要 list,不想国外全走通道
    huiyifyj
        29
    huiyifyj  
       2018-06-06 11:07:32 +08:00 via Android
    chaofei
        30
    chaofei  
       2018-06-06 11:09:26 +08:00
    chaofei
        31
    chaofei  
       2018-06-06 11:10:09 +08:00
    @chaofei 手抖,忘了说谢谢,谢谢
    metrue
        32
    metrue  
       2018-06-06 11:30:13 +08:00
    @marenight 这是你的作品,好玩。
    adrianzhang
        33
    adrianzhang  
    OP
       2018-06-06 11:34:50 +08:00
    @cye3s 准确地说,权威 DNS 在哪里就找到哪里。如果国外网站把权威 DNS 放到了国内,则不需要走通道。当权威 DNS 在国外而不想走通道,那就需要 NAME LIST。但这种需求很强烈吗?能说说你的运用场景吗?
    azh7138m
        34
    azh7138m  
       2018-06-06 12:13:49 +08:00 via Android
    其实 edns 也不是不能用,也是无脑配置不要 list
    zhjits
        35
    zhjits  
       2018-06-06 12:19:09 +08:00
    不考虑一下 DNS over HTTPS 么
    https://dns-over-https.com/
    artandlol
        36
    artandlol  
       2018-06-06 12:22:36 +08:00 via iPhone
    adrianzhang
        37
    adrianzhang  
    OP
       2018-06-06 12:34:53 +08:00
    @zhjits
    @artandlol
    各种 crypt 和 https,存在的问题就是一点:怎么才能让有 CDN 的网站把距离你最近的节点 IP 给你?
    presoul
        38
    presoul  
       2018-06-06 12:44:22 +08:00 via Android
    个人感觉 dnscrpt 比较简单好用
    如果是移动宽带+cloudflare
    体验很棒
    yaoguaishou
        39
    yaoguaishou  
       2018-06-06 15:10:49 +08:00
    mrzx
        40
    mrzx  
       2018-06-06 15:19:04 +08:00
    echopan
        41
    echopan  
       2018-06-06 15:33:33 +08:00
    jinhan13789991
        42
    jinhan13789991  
       2018-06-06 15:43:34 +08:00
    chinaDns 了解一下,配合 Docker 启动 ,爽歪歪
    artandlol
        43
    artandlol  
       2018-06-06 16:00:25 +08:00 via iPhone
    @adrianzhang 看来你是没有使用过
    adrianzhang
        44
    adrianzhang  
    OP
       2018-06-06 16:44:54 +08:00
    @yaoguaishou
    @mrzx
    @echopan
    请看本文附言
    adrianzhang
        45
    adrianzhang  
    OP
       2018-06-06 16:49:34 +08:00
    @artandlol 看来你有经验,那请解释 dnscrypt-proxy 在解析拥有国内外地址的网站时候,怎么给你最近的地址?
    rio
        46
    rio  
       2018-06-06 16:49:52 +08:00
    直接用 unbound 不就好了,为啥还需要 bind?
    adrianzhang
        47
    adrianzhang  
    OP
       2018-06-06 17:01:20 +08:00   ❤️ 1
    @rio 一堆人就你回复的这个还靠谱,确实是只用 unbound 就可以的。只不过用它充当 reverse+cache,配置文件跟我 po 出来的有不同。起初用 bind,是因为实现 reverse 非常简单,但是 cache ttl 又是个麻烦,所以增加了一个 unbound。
    rio
        48
    rio  
       2018-06-06 17:23:06 +08:00
    @adrianzhang 感谢!其实 unbound 直接可以 recursive + cache + ttl 调整,没必要再套 bind。可以考虑精简改进下 :)
    rio
        49
    rio  
       2018-06-06 17:25:58 +08:00
    @adrianzhang 另外我看你的 unbound 配置好多参数都是默认配置,没必要再写,新手看起来可能会比较晕😄 之前做了期节目专门聊 DNS,有兴趣的朋友可以听听 https://kernelpanic.fm/51
    adrianzhang
        50
    adrianzhang  
    OP
       2018-06-06 17:29:29 +08:00
    @rio 是的,要精简个只用 unbound 的。正在听你的节目…… 看节目下的链接,研究还是比较深入的。
    rio
        51
    rio  
       2018-06-06 17:48:02 +08:00
    @adrianzhang 嗯,不过自己搭 recursive 的话,首次解析的延迟比较头大。另外禁用 TCP/TLS 后隐私也是个问题😂
    adrianzhang
        52
    adrianzhang  
    OP
       2018-06-06 18:01:36 +08:00
    @rio 延迟是个问题,所以增加 cache TTL 时间用来尽量减少首次解析的频率。TCP/TLS 并没有禁用,只是不强制使用 TCP 向 ROOT DNS 发起查询。如果强制 TCP,ROOT/TLD DNS 是没有响应的。
    mrzx
        53
    mrzx  
       2018-06-06 18:04:31 +08:00
    不知道我的理解对不对?

    首先 13 个 root dns 在国外,最终所有正确的解析信息国外的才更为准确吧。而国内的涉及 DNS 污染等各种问题。
    而采用 UDP 53 更容易遭到劫持。

    所以,采用自建 DNS 服务器的方式,让这台自建的 DNS 服务器通过 TCP 53 协议(或者直接加密)跟国外无污染的服务器进行查询,再把正确的结果发聩回来。至少可以解决劫持的问题。

    但这里面又存在一个问题,就是丧失了 CDN 的特性,所以楼主采取的方式就是有效了避免了这点?
    adrianzhang
        54
    adrianzhang  
    OP
       2018-06-06 18:43:17 +08:00
    @mrzx

    基本上是这个思路。

    问题主要发生在向各个域的权威 DNS 查询这一步,得到的主机 IP 地址是否准确。[ 实际上,真实的响应并没有变化,只不过路上有错误的响应进行了抢答,由于解析原理是接受第一个返回的响应( UDP,无验证),所以实际上接受了一个错误的响应内容。]

    这种干扰主要针对权威 DNS 设置在国外的网站。那么,对于这种情况,UDP 包走加密通道,就不会有错误的应答进行干扰。

    由于国内的网站,权威 DNS 基本上都在国内,因此对其的查询,是直连的,从 DNS 看来,源 IP 来自你的 ISP,所以权威 DNS 如果有设置针对不同来源响应不同 IP 的话,能够给到准确的 IP,有时候,这些 IP 是第三方 CDN 的。

    已有的一些方法,向权威 DNS 查询的时候,源 IP 都已经不是本来的(例如各种公共 DNS 作为源向权威 DNS 查询,再例如用 name list 区分一部分域通过 TCP,用另外的主机发起 UDP 查询)。这类方法,对于 CDN 并不能很好适配。

    这样说不知是否解释得有条理一些。若还有疑问可以进一步讨论。
    mrzx
        55
    mrzx  
       2018-06-07 10:03:53 +08:00
    @adrianzhang 我主要是怕劫持。

    并且 8.8.8.8 之类的不光是应用层的劫持了。在国内 8.8.8.8 是直接被丢路由黑洞或者错误引导假 DNS 收集服务器上。从 IP 层就开始劫持了。

    至于 CDN 加速之类的,当时太麻烦,没搞,谢谢楼主提供这种思路。
    zhjits
        56
    zhjits  
       2018-06-07 11:55:51 +08:00
    @adrianzhang 让 CDN 支持 EDNS0 Client Subnet 就好了
    adrianzhang
        57
    adrianzhang  
    OP
       2018-06-07 11:59:16 +08:00
    @zhjits 这事谁干? CDN 厂商?各个网站?还是用户自己? 如果不是所有网站都这样做的话,单凭用户自己可以做到么?
    zhjits
        58
    zhjits  
       2018-06-08 14:14:11 +08:00
    @adrianzhang 当然让 CDN 和 DNS 权威服务器做啊
    adrianzhang
        59
    adrianzhang  
    OP
       2018-06-08 17:34:02 +08:00
    @zhjits 所以这个不由用户自己控制啊,需要等所有相关服务商都实施了才行。在没有得到这些服务之前,用本文方法不好么?
    Kobayashi
        60
    Kobayashi  
       2018-06-15 00:07:49 +08:00
    楼主说的就是自建 Recursive DNS,自己作为向权威 DNS 的请求方,以获得最优解析。不过分流实现有点问题:1 )并不是完全不需要列表,还是要依靠 China IP List ; 2 )权威服务器的位置和要访问网站的位置没有绝对的联系,使用境内还是境外权威 DNS 解析自己的网站完全由站长决定。

    依靠权威 DNS 位置分流解析境内和境外解析不靠谱。相比来说,都是使用 China IP List/CHNRoute,ChinaDNS、Overture、Pcap_DNSProxy 这种依据解析后判断 IP 位置分流的方案更准确。

    @rio 嗯,是配置繁琐了,单独 Unbound 就可以实现递归 DNS,没必要再祭出 Bind 这种重型武器。1 ) Unbound 配置注释掉所有 forward-zone,不转发的结果就是最后向权威 DNS 发起递归查询。2 ) root-hints 没必要写,13 台根服务器信息已经在 Unbound 内置了,再说根服务器信息也不会频繁变化,一般随 Unbound 更新就好了。
    rio
        61
    rio  
       2018-06-15 02:36:20 +08:00
    @Kobayashi 不同的方案各有优缺点。ChinaDNS 分流基于一个核心假设,就是被污染域名都解析到非 China IP。这个假设在目前是成立的,但似乎并没有什么客观原因认为它一定成立。
    adrianzhang
        62
    adrianzhang  
    OP
       2018-06-15 09:06:40 +08:00
    @Kobayashi
    对于分流实现的两个问题:
    1 )列表是需要的,但如主贴所述,不需要人工参与编辑。
    2 )你说的正确

    相比其他方案,准确性确实略差(举例来说:本站有时候解析到国外,淘宝等解析到国内,一些国外 CDN 是解析到国外,国内 CDN 解析到国内),准确性完全依赖目标站点的权威 DNS 设置。好处是如 @rio 所述,不再需要根据各种情况变化不停变化升级了,一次设定好就完全自动化了。

    Unbound 的设定,你的方式也可以的。对于企业内网所用的 unbound,则采用定期自动更新 ROOT DNS 文件方式更稳妥。
    Kobayashi
        63
    Kobayashi  
       2018-06-15 11:03:49 +08:00 via Android
    @rio 嗯,不管是 GFW 之前的污染方式——随机指向无效 IP,还是现在的随机指向不对应 IP,被污染域名解析都有可能给出境内 IP 地址。所以在根据 IP 分流,大多方案搭配 GFW List,让已统计的被污染地址直接走境外无污染 DNS 解析,以作为弥补。目前这种思路的方案包括但不限于 Dnsmasq+ChinaDNS,Unbound+ChinaDNS,Overture(配有 GFW list 黑名单)。

    又仔细考虑了一遍楼主的方法,在权威 DNS 服务器位置和网站服务器位置没有绝对关系之上,针对域名是否被污染、网站位置是在境内还是在境外、负责解析的权威 DNS 在境内还是境外,组合出 8 种情况分析:1 )被污染域名由境内权威 DNS 解析情况下,此方案无法获取正确结果,解决方法 GFW List,通过代理由境外发起解析请求; 2 )境外网站由境外权威 DNS 负责解析时,此方案存在无法获取其国内 CDN 可能。后面这个问题,我考虑了半天并没有想到一个恰到好处的解决方法:常见中国域名白名单列表的话,好像都是针对国内网站,在这里可能不适用; EDNS-Client-Subnet 可能算是一个解决办法,要权威服务器支持,也不算完美。
    adrianzhang
        64
    adrianzhang  
    OP
       2018-06-15 11:41:30 +08:00
    @Kobayashi

    国内权威 DNS 解析不存在污染情况,如果需要屏蔽直接就被停止服务了。(参考 cloudxns 被勒令停止未备案域名解析案例)自动
    境外权威 DNS 解析有可能无法获得国内 CDN 地址( baidu.com,taobao.com 等可以获得),这个确实是本方案解决不了的问题。前面也有评论指出这一点,我回复是询问这种场景是什么,能想到的一个例子是苹果的 app store 下载。对于这类情况,附加步骤方法是将相关 CDN 的权威 DNS 服务器地址列入 china 段的 ipset 内(隐含因素是这类 CDN 能够在境内服务,说明它的业务合法),可以由脚本实现自动化,解析出来 ns 地址,加入 set 即可。难点是如何自动处理 ns ip 的变化。
    asd2003asd
        65
    asd2003asd  
       2018-07-12 15:49:57 +08:00 via iPhone
    @bao3 有树莓派 3 能用的 chinadns docker 镜像吗?
    pretendtobegod
        66
    pretendtobegod  
       2018-08-15 19:26:34 +08:00
    可以在 lxc 中跑 unbound, 这样不用再加一台机器.
    adrianzhang
        67
    adrianzhang  
    OP
       2018-08-27 12:50:42 +08:00 via iPhone
    @pretendtobegod 也可以
    shudongin
        68
    shudongin  
       2021-05-09 07:48:13 +08:00 via iPhone
    试了一下,速度过于感人,还是 list 来得快。
    shudongin
        69
    shudongin  
       2021-05-09 17:33:06 +08:00
    效果还可以的,需要一个高速科学线路。
    adrianzhang
        70
    adrianzhang  
    OP
       2021-05-10 07:09:06 +08:00
    @shudongin 是的线路是必须的。另外关于速度,首次访问的网站肯定慢,但是因为有 dnsmasq 做 cache,所以可以定义缓存时间,7 天或一个月什么的,自己用的话,常用的网站打开都很快,本质上就是 dnsmasq 将查询结果都做了个活动的 list 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1467 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 17:23 · PVG 01:23 · LAX 10:23 · JFK 13:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.