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


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


这样的话,
edns subnet 能正常工作么?
手机能拿到移动 4G 网络优化过的结果吗?
tux
2017-01-17 17:24:14 +08:00
请求结果只跟你指定的-e 相关 ,应该能正常工作
EricInBj
2017-01-17 17:28:10 +08:00
-e 参数就是向上游 DNS 查询时带的 +client 参数?
这个能用查询的源 IP 做参数吗?
不过前面要是档个 dnsmasq 可能会有问题,不知道 dnsmasq 支持不支持向上游传递+client
lbp0200
2017-01-17 17:37:53 +08:00
@redsonic 我也正在撸,看来不用了

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

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

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

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

© 2021 V2EX