【问题标题】:In Linux, what program is responsible for DNS lookups?在 Linux 中,哪个程序负责 DNS 查找?
【发布时间】:2026-01-31 00:10:01
【问题描述】:

为了测试我对 DNS 的一些想法,我编写了一个非常简单的服务器,它基本上通过响应键值对来模拟类似 DNS 的行为。

我可以很容易地用 C 语言编写一个客户端到这个服务器,它可能会接受一个主机名作为参数并打印出一个 IP(或类似的东西)

我真正的问题是在 linux 场景中,哪段代码最终负责查找。这个程序是如何运作的?用自定义的“玩具”客户端(当然是在虚拟机中)覆盖这个程序会很简单吗?

当然,这都是理论上的,我没有计划在虚拟机之外使用它,而且我不想实现默认的 DNS 协议(所以只需将 DNS 服务器设置设置为 localhost 或127.0.0.1 对我没用)

一些关于我想要实现的行为的示例代码(伪)

int main(int argc, char** argv){
    if(strcmp(argv[0], "localhost") == 0){
           printf("127.0.0.1");
    }
    return 0;
}

【问题讨论】:

  • 请确保我理解 - 您想重写操作系统的 DNS 客户端,以便它使用您自己的协议和服务器解析名称?
  • 是的。我的意思是,它不应该是,好吧.. 无论如何都很聪明,但我希望能够在网络浏览器中输入 fake.name 并让它在没有主机文件或任何东西的情况下解析
  • resolver(3),它使用/etc/resolv.conf
  • 谢谢,我会调查的:)
  • 您可以安装一个实际的 DNS 进程并将其编辑为您想要的任何内容。

标签: networking dns protocols


【解决方案1】:

负责执行名称查找的不是程序本身,而是一个库:名称服务开关,它是 libc 的一个组件。

名称服务切换支持可插拔的后端模块,因此如果您不想使用 DNS,可以编写自己的名称服务切换 (NSS) 后端。在 Linux 和 glibc 下,NSS 后端模块的名称类似于 /lib/nss_<name>.so.2。您可以通过编辑/etc/nsswitch.conf 来配置 NSS 以告诉它您要使用什么后端。通常有两个后端用于主机:files(在 /etc/hosts 中查找名称)和 dns(在 DNS 中查找名称)。

glibc's manual 中关于如何编写 NSS 模块的文档非常少,但可能会找到更好的教程。

【讨论】:

  • 谢谢!像魅力一样工作!