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

DNS OVER HTTPS,完美 DNS 方案

  •  1
     
  •   tux · 2017-01-17 15:04:44 +08:00 · 21897 次点击
    这是一个创建于 2869 天前的主题,其中的信息可能已经有所发展或是发生改变。
    完美 DNS 要实现 2 点,
    1.无污染
    2.CDN 正常

    实现方式是通过 DNS OVER HTTPS
    https://dns.google.com/

    参考
    https://medium.com/@rampage_router/%E5%9F%BA%E4%BA%8E-google-%E7%9A%84-dns-over-https-%E5%8A%A0%E5%AF%86%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90%E6%9C%8D%E5%8A%A1%E5%99%A8-3e20c7b9f5f6#.ep9552795

    开源项目 https://github.com/aarond10/https_dns_proxy
    特色功能:
    自从 Google 发布 DNS-Over-HTTPS 服务以来,其实有很多基于此服务写的程序,但是目前看起来这个项目实现的比较好:
    C++ 实现,执行文件很小 (❤0kiB ,静态编译的版本约为 900k),比大多数用 Go 写的小得多
    基于 Curl HTTP/2 API , 解析延迟极小
    单线程无阻塞式查询,适用于嵌入式系统如路由器等
    最好作为 DNSMASQ 这样带缓存的 DNS 服务器上游.
    由于 Google 这个服务支持 EDNS SUBNET 的查询,所以理论上通过这个服务器查询的结果不会有 CDN 的问题

    重点来了,以上都是转载,下面是小伙伴帮编译的运行在 ubuntu server 上的程序,运行前要装几个
    apt-get install libev4
    apt-get install libcurl3
    apt-get install libc-ares-dev
    下载 https://1drv.ms/u/s!Ak7H5gfecOPChFhstdNKTraNWwxZ
    这个略修改了一下,通过
    ./https_dns_proxy_e_clientip -a 服务器 IP -p 5321 运行后 默认使用用户 IP 为 EDNS SUBNET 所以没有污染,CDN 也正常
    可以用如下命令尝试,只支持 UDP,不要通过代理使用 dig 命令
    dig www.youtube.com @198.71.92.134 -p 5321
    dig qzone.qq.com @198.71.92.134 -p 5321
    上面 IP 用的 VPS 过几天就到期了,目前只支持 UDP
    小伙伴们始终没有搞定这货怎么运行在路由器上,尤其是基于 openwrt 的 7620 的路由上,静态编译后的运行没有返回结果,或者内存不断升高,不知道有高人帮编译一个静态版

    搞了这么麻烦到底优势在哪呢? 除了无污染和 CDN 正常之外,这货运行在路由上,通过-e 参数指定本地公网 IP 之后,不管通过什么通道向 https://dns.google.com 发起请求,返回结果都是只跟-e 参数相关
    假如在天朝内通过这种方式开一个-p 53 端口的 DNS,再通过任意科学方式转发请求到 https://dns.google.com,那不管从哪发起请求,返回的 DNS 结果都是无污染和 CDN 正常的,就跟直接请求 8.8.8.8 且无污染,是一毛一样的
    29 条回复    2017-06-06 04:01:58 +08:00
    lbp0200
        1
    lbp0200  
       2017-01-17 15:28:15 +08:00
    好支威希
    lbp0200
        2
    lbp0200  
       2017-01-17 15:31:03 +08:00
    慢慢研究
    lbp0200
        3
    lbp0200  
       2017-01-17 15:31:48 +08:00
    I maintain a package in the OpenWRT packages repository as well. You can install as follows:

    root@OpenWrt:~# opkg update
    root@OpenWrt:~# opkg install https_dns_proxy
    root@OpenWrt:~# /etc/init.d/https_dns_proxy enable
    root@OpenWrt:~# /etc/init.d/https_dns_proxy start

    ——————————————————————————————
    这不就是路由器版本吗?
    yuchenr
        4
    yuchenr  
       2017-01-17 16:02:17 +08:00
    google dns 怎么处理国内的解析的?
    我在 dns.google.com 加了 edns 信息,测试了不少地区的 ip 解析之后的 CDN 都正常
    tux
        5
    tux  
    OP
       2017-01-17 16:04:41 +08:00 via Android
    @lbp0200 不好用, padavan,pandorabox 固件上用不了
    lbp0200
        6
    lbp0200  
       2017-01-17 16:19:57 +08:00
    @tux https://github.com/wrouesnel/dns-over-https-proxy
    把这个改改,应该就可以
    lhbc
        7
    lhbc  
       2017-01-17 16:24:41 +08:00
    然而大多数权威 DNS 不支持 EDNS SUBNET
    tux
        8
    tux  
    OP
       2017-01-17 16:27:21 +08:00
    @lhbc google 支持就行了呗,少量需要指定特定 DNS SERVER 的完全可以在 DNSMASQL 配置里设置一行
    在用 dns over https 前提下,就不用维护黑 /白 域名名单那种长表了
    goodbest
        9
    goodbest  
       2017-01-17 16:39:36 +08:00
    @tux 我是不是可以这样理解:
    当我-e 一个联通 ip 时, dns 返回结果是联通优化的。而当我-e 一个电信 ip 时, dns 返回结果是电信优化的?
    lhbc
        10
    lhbc  
       2017-01-17 16:40:25 +08:00
    @tux 权威不支持,递归 DNS 支持是没用的
    lhbc
        11
    lhbc  
       2017-01-17 16:41:43 +08:00
    @goodbest 简单来讲,递归的时候,会带上客户端的 IP ,权威 DNS 支持的话,会根据客户端 IP 返回结果,而不是根据递归 DNS 的 IP 返回结果。
    riaqn
        12
    riaqn  
       2017-01-17 16:44:41 +08:00
    @lhbc 说的没错.
    之前有人做过测试, 我记得国内的大多数 CDN 的 DNS 都不支持 client-edns-subnet.
    tux
        13
    tux  
    OP
       2017-01-17 16:45:45 +08:00
    @goodbest
    @lhbc 不太了解具体 DNS 原理,不过通过-e 指定一个 IP,确实能达到效果
    glasslion
        14
    glasslion  
       2017-01-17 16:50:04 +08:00
    标题党, 根本就没解决 cdn 的问题(即楼上提到的 edns subnet)
    wwqgtxx
        15
    wwqgtxx  
       2017-01-17 16:53:34 +08:00   ❤️ 1
    貌似楼主提到的在 openwrt 上的问题作者自己也提出来了
    https://github.com/aarond10/https_dns_proxy/issues/9
    redsonic
        16
    redsonic  
       2017-01-17 17:12:58 +08:00   ❤️ 1
    LZ 应该早点发,之前在 github 里没有搜到 所以最近一只在撸一个类似的。现在我想哭
    EricInBj
        17
    EricInBj  
       2017-01-17 17:22:02 +08:00
    我现在架了个 dnsmasq 同时对内网和外网提供服务,上游用运营商给的,内网客户端用着没问题。
    但外部(主要是手机,移动 4G )就不灵了,连打开个微信公众号页面都困难
    这种情况,楼主的这个解决方案能解决吗?


    移动 4G->dnsmasq->https_dns_proxy->opendns|114|1248


    这样的话,
    edns subnet 能正常工作么?
    手机能拿到移动 4G 网络优化过的结果吗?
    tux
        18
    tux  
    OP
       2017-01-17 17:24:14 +08:00 via Android
    请求结果只跟你指定的-e 相关 ,应该能正常工作
    EricInBj
        19
    EricInBj  
       2017-01-17 17:28:10 +08:00
    -e 参数就是向上游 DNS 查询时带的 +client 参数?
    这个能用查询的源 IP 做参数吗?
    不过前面要是档个 dnsmasq 可能会有问题,不知道 dnsmasq 支持不支持向上游传递+client
    lbp0200
        20
    lbp0200  
       2017-01-17 17:37:53 +08:00
    @redsonic 我也正在撸,看来不用了
    lbp0200
        21
    lbp0200  
       2017-01-17 17:38:48 +08:00
    @EricInBj 不能,还是用楼主发的吧
    tux
        22
    tux  
    OP
       2017-01-17 17:41:06 +08:00
    @EricInBj 帖子里提供了小伙伴编译的在 ubuntu 上能运行的一个版本就支持查询源的 IP 当默认的-e 参数
    比如你 VPS 的 IP 是 1.2.3.4 你 本地路由 IP 是 4.5.6.7 在 VPS 架设好,通过路由直接查询就可以了-e 就是 4.5.6.7
    tux
        23
    tux  
    OP
       2017-01-17 17:48:44 +08:00
    @glasslion 解决了,上面不是有 2 个示例,试试就知道了 dig 几下
    lenovo
        24
    lenovo  
       2017-01-17 20:47:07 +08:00
    golang 版本的: https://github.com/wrouesnel/dns-over-https-proxy
    dns.google.com ip 都被封了啊,我 hosts 换其他 gws 也不能用。你们使用正常?
    yuchenr
        25
    yuchenr  
       2017-01-18 09:31:19 +08:00
    @lenovo 你要解析 dns.google.com 的 ip
    lenovo
        26
    lenovo  
       2017-01-18 11:26:36 +08:00
    r#25 @yuchenr
    Microsoft Windows [版本 10.0.14393]
    (c) 2016 Microsoft Corporation 。保留所有权利。

    C:\Windows\system32>dig dns.google.com

    ; <<>> DiG 9.11.0-P2 <<>> dns.google.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18542
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ; COOKIE: 1861482de281d6143fa3dd13587edfe052b275e2eb8749f5 (good)
    ;; QUESTION SECTION:
    ;dns.google.com. IN A

    ;; ANSWER SECTION:
    dns.google.com. 1800 IN A 172.217.24.14

    ;; Query time: 409 msec
    ;; SERVER: 127.0.0.1#53(127.0.0.1)
    ;; WHEN: Wed Jan 18 11:24:16 ?D1ú±ê×?ê±?? 2017
    ;; MSG SIZE rcvd: 87


    C:\Windows\system32>psping 172.217.24.14:443

    PsPing v2.10 - PsPing - ping, latency, bandwidth measurement utility
    Copyright (C) 2012-2016 Mark Russinovich
    Sysinternals - www.sysinternals.com

    TCP connect to 172.217.24.14:443:
    5 iterations (warmup 1) ping test:
    Connecting to 172.217.24.14:443 (warmup): from 0.0.0.0:51542:
    由于超时时间已过,该操作返回。
    Connecting to 172.217.24.14:443: from 0.0.0.0:51552:
    由于超时时间已过,该操作返回。
    Connecting to 172.217.24.14:443: from 0.0.0.0:51560:
    由于超时时间已过,该操作返回。
    Connecting to 172.217.24.14:443: from 0.0.0.0:51564:
    由于超时时间已过,该操作返回。
    Connecting to 172.217.24.14:443: from 0.0.0.0:51571:
    由于超时时间已过,该操作返回。

    TCP connect statistics for 172.217.24.14:443:
    Sent = 4, Received = 0, Lost = 4 (100% loss),
    Minimum = 0.00ms, Maximum = 0.00ms, Average = 0.00ms

    C:\Windows\system32>
    a86913179
        27
    a86913179  
       2017-01-19 00:50:08 +08:00
    就像 7 楼所说, EDNS 跟 DNSSEC 一样,需要根,权威 NS ,递归这些同时都支持才有用,然而还没普及到完全可用的程度。
    DaCong
        28
    DaCong  
       2017-01-31 16:01:23 +08:00
    -b dns_servers Comma separated IPv4 address of DNS servers
    to resolve dns.google.com. (8.8.8.8,8.8.4.4)
    -t proxy_server Optional HTTP proxy. e.g. socks5://127.0.0.1:1080
    (Initial DNS resolution can't be done over this.)
    问一下楼主,这两个选项怎么用?
    cjjdaq
        29
    cjjdaq  
       2017-06-06 04:01:58 +08:00
    root@LEDE-X64:~# /usr/bin/https_dns_proxy -p 5053 -v -v -v
    [I] 1496692158.327939 main.c:135 Built Jun 6 2017 03:19:59.
    [I] 1496692158.327961 main.c:136 System c-ares: 1.12.0
    [I] 1496692158.327987 main.c:137 System libcurl: libcurl/7.54.0 mbedTLS/2.4.2
    [I] 1496692158.328140 dns_server.c:39 Listening on 127.0.0.1:5053
    [D] 1496692158.570174 main.c:120 Received new IP '216.58.200.46'
    [D] 1496692182.874309 main.c:92 Received request for 'www.youtube.com' id: 6478, type 1, flags 0120
    [D] 1496692182.874370 https_client.c:57 Requesting HTTP/1.1: 0

    [D] 1496692184.876145 https_client.c:96 CURLINFO_EFFECTIVE_URL: https://dns.google.com/resolve?name=www.youtube.com&type=1
    [D] 1496692184.876171 https_client.c:108 CURLINFO_RESPONSE_CODE: 0
    [D] 1496692184.876180 https_client.c:137 CURLINFO_HTTP_VERSION: 0
    [D] 1496692184.876187 https_client.c:144 CURLINFO_PROTOCOL: 0
    [D] 1496692184.876195 https_client.c:165 Times: 0.000041, 0.000000, 0.000000, 0.000000, 0.000000, 2.001638
    [D] 1496692184.876215 main.c:57 buflen 0

    [D] 1496692187.879817 main.c:92 Received request for 'www.youtube.com' id: 6478, type 1, flags 0120
    [D] 1496692187.879864 https_client.c:57 Requesting HTTP/1.1: 0

    [D] 1496692189.880417 https_client.c:96 CURLINFO_EFFECTIVE_URL: https://dns.google.com/resolve?name=www.youtube.com&type=1
    [D] 1496692189.880444 https_client.c:108 CURLINFO_RESPONSE_CODE: 0
    [D] 1496692189.880453 https_client.c:137 CURLINFO_HTTP_VERSION: 0
    [D] 1496692189.880460 https_client.c:144 CURLINFO_PROTOCOL: 0
    [D] 1496692189.880467 https_client.c:165 Times: 0.000043, 0.000000, 0.000000, 0.000000, 0.000000, 2.000432
    [D] 1496692189.880488 main.c:57 buflen 0


    curl 不到内容何解,老半天才弄上 lede 去运行,结果。。。在 debian 上编译出来运行正常
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3012 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:54 · PVG 22:54 · LAX 06:54 · JFK 09:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.