如何用C/C++构建一个简单的自定义DNS服务器

10

我需要在C/C++中构建一个定制的简单非权威缓存DNS服务器。有什么指导?链接?示例?


你为什么需要构建自己的DNS服务器? - Hank Gay
10
因为我需要一个具有一些非标准功能的DNS服务器。 - Anton Kopylov
我强烈建议您寻找替代解决方案,但如果这是您必须采取的方式…… djbdns是公共领域,因此您可以随意修改它。 - Hank Gay
如果您能够,请提供有关此“非标准功能”的更多信息。这里有几个DNS专家... - Alnitak
请查看此答案 - Jason
6个回答

16

16

"简单"的缓存DNS服务器并不存在,尤其是当你需要良好的安全性时。最近的DNS攻击表明,递归DNS服务器中的缓存功能特别容易受到攻击。

重新评估是否实际需要本地缓存。如果不需要,则最好修改现有的DNS代理代码(例如 'dnsmasq')。

如果你确实想要自己开发,可以使用诸如ldns等优秀的库来提供对底层DNS数据包的访问。

我自己正在使用ldnslibevent结合使用,实现了我在早期问题中提到的模糊测试DNS服务器。


3

3
如果你真的需要这么做(这是一项巨大的工作,请参考Alnitak的回答),建议从一个现有的好程序开始(不要选择像djbdns这样长时间未维护的单人实验项目),并进行修改。 Unbound 可能是一个合理的选择。(代码库比BIND更小。)

1
读者注意:如果没有评论解释,记得忽略踩票。 - bortzmeyer
1
djb的软件因为他普遍认为自己的方式比标准更好而经常被认为与标准行为相反,而且他也因为否认代码中存在严重的远程特权提升漏洞而闻名。加上djbdns完全未维护的长时间期间,我认为这些因素使得bortzmeyer称其为“一个长时间未维护的单人实验”,并且不鼓励在非业余爱好者环境中部署它是完全公平的。 - R.. GitHub STOP HELPING ICE

2

我会对此保持谨慎。djb的软件许可非常受限制,一定要确保它符合你的预期用途。 - SingleNegationElimination
2
djbdns现在已经是公共领域,但我仍然不会使用它... - Alnitak

1

状态机是服务器代码中非常小的一部分... - bortzmeyer
对于像 DNS 服务器这样由非常严格的规范定义的东西来说,它是一个重要的(甚至可以说是最重要的)部分。 - Hank Gay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接