作为一种测试我对DNS内容的一些想法的方法,我编写了一个非常简单的服务器,基本上通过基本上响应键值对来模拟类似DNS的行为。
我可以轻松地在C中为这个服务器编写一个客户端,它可能会将主机名作为参数并打印出一个IP(或类似的东西)
我真正的问题是在Linux场景中,哪一段代码最终负责查找。该程序如何运作?使用自定义“玩具”客户端(当然是在虚拟机中)覆盖此程序是否微不足道?
当然,这完全是理论上的,我没有计划在虚拟机之外使用它,更重要的是,我不想实现默认的DNS协议(所以只需将DNS服务器设置设置为localhost或127.0.0.1不会对我有用)
关于我想实现的行为类型的一些示例代码(psuedo)
int main(int argc, char** argv){
if(strcmp(argv[0], "localhost") == 0){
printf("127.0.0.1");
}
return 0;
}
答案 0 :(得分:2)
负责执行名称查找的东西不是程序本身,它是一个库:名称服务开关,它是libc的一个组件。
名称服务开关支持可插拔后端模块,因此如果您不想使用DNS,则可以编写自己的名称服务开关(NSS)后端。在Linux和glibc下,NSS后端模块的名称类似于/lib/nss_<name>.so.2
。您可以通过编辑/etc/nsswitch.conf
将NSS配置为告诉它要使用的后端。通常,两个后端用于主机:files
(在/etc/hosts
中查找名称)和dns
(在DNS中查找名称)。
关于如何在glibc's manual中编写NSS模块,有一些非常稀少的文档,但可能找到更好的教程。