V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
leavic
V2EX  ›  分享创造

轮子: Async DNS Over Https

  •  
  •   leavic · 2017-04-27 14:58:40 +08:00 · 879 次点击
    这是一个创建于 2771 天前的主题,其中的信息可能已经有所发展或是发生改变。

    基本上,这是一个极其类似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

    第 1 条附言  ·  2017-05-03 09:17:55 +08:00
    已经增加了 socks 代理支持,增加了缓存机制。
    第 2 条附言  ·  2017-05-03 14:07:37 +08:00
    TCP 和 UDP 查询现在都支持了
    11 条回复    2017-05-03 14:07:05 +08:00
    KCheshireCat
        1
    KCheshireCat  
       2017-04-27 16:27:03 +08:00 via iPhone
    造轮子辛苦,除去自己学习,这些特性 dingo 这个项目都有了。
    然后走梯子的域名查询默认是由服务端直接查询 8.8.8.8 的,对于小飞机是这样的。
    再然后,如果是家用,异步 io 是不是真的有用,我保留意见,我的一个轮子 dnspod-httpdns-proxy 就是简单的阻塞式,效率也没太差。
    leavic
        2
    leavic  
    OP
       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
        3
    maojy1989  
       2017-04-28 09:40:58 +08:00
    感谢楼主的贡献,我一直想找一个类似 PRCDNS 但支持 UDP 的软件,终于找到了,看了下 README 里面写的,楼主只考虑了把这个部署在路由器上,所以没有添加 Socks 支持,我想建议楼主加上这个功能不知道可不可以,有时候需要无污染的 DNS 也不一定是要配合梯子用,有的运营商对国内的域名也存在 DNS 劫持,我可能需要带着笔记本去不同的地方用不同的网络,但是不可能走哪都带着路由器,所以如果要把这个软件装在电脑上,添加 Socks 支持肯定会更加方便使用的
    leavic
        4
    leavic  
    OP
       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
        5
    leavic  
    OP
       2017-04-28 10:55:46 +08:00   ❤️ 1
    @maojy1989 好像有个 aiosocks 可以搞定 socks 代理的问题,我这两天应该会加进去。
    leavic
        6
    leavic  
    OP
       2017-04-28 16:48:46 +08:00
    @maojy1989 改是改完了,github 可见,不过调用的 aiosocks 有个 bug,从 pypi 安装的 aiosocks 是没法直接用的,我还不知道该怎么在 setup.py 中打包 git requirement。

    如果 aiosocks 作者处理 issue 的动作快的话,我倒是可以等他更新完 pypi 我再更新,否则还得考虑怎么解决打包问题。
    maojy1989
        7
    maojy1989  
       2017-04-28 17:25:46 +08:00
    @leavic #6 试了一下,可以用了,不过不知道为什么有时候会连接 dns.google.com 失败,第一次查询还很慢,查询时间在 300ms - 3000+ms 中间,配合 dnsmasq 的缓存问题应该不大
    leavic
        8
    leavic  
    OP
       2017-04-28 17:55:53 +08:00 via iPhone
    @maojy1989 网速问题真心无解,我都 500ms+
    maojy1989
        9
    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
        10
    leavic  
    OP
       2017-05-03 13:42:15 +08:00
    @maojy1989 擦,我写缓存的时候忘了做记录类型匹配了,等下就改。
    leavic
        11
    leavic  
    OP
       2017-05-03 14:07:05 +08:00
    已经修复了,你可以 pip 更新试一下,0.0.9 版本。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1063 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:35 · PVG 05:35 · LAX 13:35 · JFK 16:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.