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

写了个简陋的 DNS 缓存器

  •  
  •   haddy · 2019-01-02 19:26:22 +08:00 · 1527 次点击
    这是一个创建于 1957 天前的主题,其中的信息可能已经有所发展或是发生改变。
    家里的 DNS 解析有时候出问题,让我很纳闷,于是我就写了这个小程序。

    作为一名编程小白,我没有想到写一个本地用的 DNS 缓存原来这么简单,包括查文档等等时间,前后只用了 5 天。
    感谢 Python 社区和创造各种第三方库(特别是 Requests, BitString, PonyORM )的作者,感谢 IETF,感谢互联网。

    那么我介绍一下这个小程序一些特点。

    1. 完全无视了 TTL,转而使用了定时更新的方法。如果一个缓存中的记录被缓存后,在后两个周期没有被使用,就会被删除。同时缓存在硬盘上,重启后也会保存。无视 TTL 会带来一定的安全风险,请留意。

    2. 只支持 A 记录。也就是不支持 IPv6 环境。如果日常用到了需要 SRV 记录的程序,那么可能会产生问题。

    3. 不支持读取包含超过两个问题的 DNS 请求。不支持读取压缩过的请求。写的时候发现日常用的程序基本上只会在一个请求中发一个问题,于是就没有写,部分是因为没有需求、没有测试用例,部分是因为写起来太麻烦。

    4. 从远端服务器获取记录时,使用的是 DNS over HTTPS。

    5. 依赖 Requests, BitString, PonyORM。

    6. 在 Linux 上的 Python 3.6.7 环境中测试通过。

    7. LGPLv3 授权。

    写代码时没有考虑很多。没有单独的配置文件。还有很多复制粘贴。
    对于喜欢更为成熟的方案的人,可以考虑 pdnsd。
    尽管如此,分享给大家,希望能够对有些人有帮助。

    代码地址:
    https://pastebin.com/0Nh0gKAp
    第 1 条附言  ·  2019-01-05 12:23:12 +08:00
    更新一下:
    1. 修正了如果更新缓存的预定时间没有启动程序,后续启动时会出错的错误
    2. 补充了注释、修正了感谢部分的文本

    https://pastebin.com/52J9DMrf
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3149 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:55 · PVG 21:55 · LAX 06:55 · JFK 09:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.