家里的 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