轮子: Async DNS Over Https

2017-04-27 14:58:40 +08:00
 leavic

基本上,这是一个极其类似PRCDNS的东西,为什么要重复造轮子,README 里面都有写,简单来讲就几条:

  1. 这个是基于 UDP 查询的,dnsmasq 可以直接用。
  2. 这个解决了 dns over https 的鸡生蛋和蛋生鸡的问题,参考我上一个主题/t/357479
  3. PRCDNS 只解析 A 记录,这个无法接受。
  4. 对翻墙的域名,不应该用国内 IP 作为 edns client ip 的参数去请求,否则解析的结果不利于翻墙速度。

PS:因为是 UDP 的,所以这玩意只适合部署在本地供自己使用,如果要公网部署,PRCDNS 这样走 TCP 的才稍微安全一点。

地址:Github PyPI

799 次点击
所在节点    分享创造
11 条回复
KCheshireCat
2017-04-27 16:27:03 +08:00
造轮子辛苦,除去自己学习,这些特性 dingo 这个项目都有了。
然后走梯子的域名查询默认是由服务端直接查询 8.8.8.8 的,对于小飞机是这样的。
再然后,如果是家用,异步 io 是不是真的有用,我保留意见,我的一个轮子 dnspod-httpdns-proxy 就是简单的阻塞式,效率也没太差。
leavic
2017-04-27 16:58:53 +08:00
@KCheshireCat

最近看了 Fluent Python,里面提到的 concurent 并发库的时候提到,其实 standard library 中的 io 阻塞函数都是会自动释放 GIL 的,所以并发的方式在 IO 上一点都不会影响性能,只是线程多了一点而已,asyncio 在 io 速度上并无优势。

到 GoogleDNS 的 TCP 查询还是比较慢的,我这里基本都在 500ms 以上,如果多一点查询,这个阻塞恐怕就有点不能接受了,dnspod 有网络速度上的优势,小量的查询确实不需要太担心阻塞的问题。

不过,cache 比啥都更提高效率。
maojy1989
2017-04-28 09:40:58 +08:00
感谢楼主的贡献,我一直想找一个类似 PRCDNS 但支持 UDP 的软件,终于找到了,看了下 README 里面写的,楼主只考虑了把这个部署在路由器上,所以没有添加 Socks 支持,我想建议楼主加上这个功能不知道可不可以,有时候需要无污染的 DNS 也不一定是要配合梯子用,有的运营商对国内的域名也存在 DNS 劫持,我可能需要带着笔记本去不同的地方用不同的网络,但是不可能走哪都带着路由器,所以如果要把这个软件装在电脑上,添加 Socks 支持肯定会更加方便使用的
leavic
2017-04-28 10:53:32 +08:00
@maojy1989
这东西不可能脱离梯子直接工作的,因为国内网络根本无法直接访问 dns.google.com,而如果你机器上有 shadowsocks 之类的代理,抗 DNS 污染似乎根本不需要自己来做。

aiohttp 好像只支持 http 代理,这种代理好像都死得差不多了吧,真要用的话,把 49 行改一下自己添加一个 proxy 参数就行了:

async with session.get(url, headers=self.headers) as resp:

async with session.get(url, headers=self.headers,proxy=YOUR_HTTP_PROXY) as resp:

这个支持很鸡肋,但改动很小,我会做进去,但你自己改代码来得更快。
leavic
2017-04-28 10:55:46 +08:00
@maojy1989 好像有个 aiosocks 可以搞定 socks 代理的问题,我这两天应该会加进去。
leavic
2017-04-28 16:48:46 +08:00
@maojy1989 改是改完了,github 可见,不过调用的 aiosocks 有个 bug,从 pypi 安装的 aiosocks 是没法直接用的,我还不知道该怎么在 setup.py 中打包 git requirement。

如果 aiosocks 作者处理 issue 的动作快的话,我倒是可以等他更新完 pypi 我再更新,否则还得考虑怎么解决打包问题。
maojy1989
2017-04-28 17:25:46 +08:00
@leavic #6 试了一下,可以用了,不过不知道为什么有时候会连接 dns.google.com 失败,第一次查询还很慢,查询时间在 300ms - 3000+ms 中间,配合 dnsmasq 的缓存问题应该不大
leavic
2017-04-28 17:55:53 +08:00
@maojy1989 网速问题真心无解,我都 500ms+
maojy1989
2017-05-03 13:37:25 +08:00
遇到一个很严重的 bug,比如我用 dig @127.0.0.1 -p 5454 qq.com mx 查询邮件记录,能够得出正确结果,当我再用 dig @127.0.0.1 -p 5454 qq.com 查询 A 记录的时候直接返回了 qq.com mx 的缓存结果,这两个查询顺序反过来也是,只要有一条查询结果,后面不管怎么查,返回的都是第一次查询的,不管类型是不是一样的
leavic
2017-05-03 13:42:15 +08:00
@maojy1989 擦,我写缓存的时候忘了做记录类型匹配了,等下就改。
leavic
2017-05-03 14:07:05 +08:00
已经修复了,你可以 pip 更新试一下,0.0.9 版本。

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

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

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

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

© 2021 V2EX