DNS OVER HTTPS,完美 DNS 方案 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tux
V2EX    DNS

DNS OVER HTTPS,完美 DNS 方案

  •  1
     
  •   tux 2017-01-17 15:04:44 +08:00 22292 次点击
    这是一个创建于 3201 天前的主题,其中的信息可能已经有所发展或是发生改变。
    完美 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     Solana     3869 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 05:29 PVG 13:29 LAX 22:29 JFK 01:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86