DNS OVER HTTPS,完美 DNS 方案

2017-01-17 15:04:44 +08:00
 tux
完美 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 且无污染,是一毛一样的
21904 次点击
所在节点    DNS
29 条回复
lbp0200
2017-01-17 17:38:48 +08:00
@EricInBj 不能,还是用楼主发的吧
tux
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
2017-01-17 17:48:44 +08:00
@glasslion 解决了,上面不是有 2 个示例,试试就知道了 dig 几下
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
2017-01-18 09:31:19 +08:00
@lenovo 你要解析 dns.google.com 的 ip
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
2017-01-19 00:50:08 +08:00
就像 7 楼所说, EDNS 跟 DNSSEC 一样,需要根,权威 NS ,递归这些同时都支持才有用,然而还没普及到完全可用的程度。
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
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 上编译出来运行正常

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/335164

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX