Linux DNS 查询剖析 Linux 中国

“Linux 执行一次 DNS 查询”这句话的背后有相当多的工作。

-- Dmatech

致谢

编译自 |

https://zwischenzugs.com/2018/06/08/anatomy-of-a-linux-dns-lookup-part-i/

作者 | Dmatech

译者 | Andy Song (pinewall) 共计翻译:31篇 贡献时间:149 天

我经常与虚拟机集群打交道(文1

[1]

、文2

[2]

、文3

[3]

、文4

[4]

、文5

[5]

、文6

[6]

),因此最终花费了大量时间试图掌握DNS 查询

[7]

的工作原理。遇到问题时,我只是不求甚解的使用 StackOverflow 上的“解决方案”,而不知道它们为什么有时工作,有时不工作。

最终我对此感到了厌倦,决定一并找出所有问题的原因。我没有在网上找到完整的指南,我问过一些同事,他们不知所以然(或许是问题太具体了)。

既然如此,我开始自己写这样的手册。

结果发现,“Linux 执行一次 DNS 查询”这句话的背后有相当多的工作。

“究竟有多难呢?”

本系列文章试图将 Linux 主机上程序获取(域名对应的) IP 地址的过程及期间涉及的组件进行分块剖析。如果不理解这些块的协同工作方式,调试解决 、和 等相关的问题会让人感到眼花缭乱。

同时这也是一份有价值的说明,指出原本很简单的东西是如何随着时间的推移变得相当复杂。在弄清楚 DNS 查询的原理的过程中,我了解了大量不同的技术及其发展历程。

我甚至编写了一些自动化脚本

[8]

,可以让我在虚拟机中进行实验。欢迎读者参与贡献或勘误。

请注意,本系列主题并不是“DNS 工作原理”,而是与查询 Linux 主机配置的真实 DNS 服务器(这里假设查询了一台 DNS 服务器,但后面你会看到有时并不需要)相关的内容,以及如何确定使用哪个查询结果,或者如何使用其它方式确定 IP 地址。

1) 其实并没有名为“DNS 查询”的系统调用

工作方式并非如此

首先要了解的一点是,Linux 上并没有一个单独的方法可以完成 DNS 查询工作;没有一个有这样的明确接口的核心系统调用system call。

不过,有一个标准 C 库函数调用

[9]

,不少程序使用了该调用;但不是所有程序或应用都使用该调用!

让我们看一下两个简单的标准程序: 和 :

对于同一个域名,两个程序得到的 IP 地址是相同的;那么它们是使用同样的方法得到结果的吧?

事实并非如此。

下面文件给出了我主机上 对应的 DNS 相关的系统调用:

下面是 对应的系统调用:

可以看出 打开了 文件,但 没有;但两个程序都打开了 文件。

下面我们依次查看这两个 扩展名的文件。

2) NSSwitch 与

我们已经确认应用可以自主决定选用哪个 DNS 服务器。很多应用(例如 )通过配置文件 (根据具体实现1)参考 NSSwitch 完成选择。

NSSwitch 不仅用于 DNS 查询,例如,还用于密码与用户信息查询。

NSSwitch 最初是 Solaris OS 的一部分,可以让应用无需硬编码查询所需的文件或服务,而是在其它集中式的、无需应用开发人员管理的配置文件中找到。

下面是我的 :

我们需要关注的是 行。我们知道 用到 文件,那么我们修改这个文件(的 行),看看能够如何影响 。

修改 , 行仅保留

如果你修改 ,将 行仅保留 :

此时, 无法获取 google.com 对应的 IP 地址:

但 的解析不受影响:

此外, 命令正常返回:

毕竟如我们之前看到的那样, 不受 影响。

修改 , 行仅保留

如果你修改 ,将 行仅保留 :

此时,google.com 的解析恢复正常:

但 无法解析:

下图给出默认 NSSwitch 中 行对应的查询逻辑:

我的 配置是 给出的默认值

3)

我们已经知道 和 都使用 文件。

下面给出我主机的 文件内容:

先忽略前两行,后面我们会回过头来看这部分(它们很重要,但你还需要一些知识储备)。

其中 行指定了查询用到的 DNS 服务器。

如果将该行注释掉:

再次运行:

解析失败了,这是因为没有可用的名字服务器2。

该文件中还可以使用其它选项。例如,你可以在 文件中增加如下行:

然后执行 (不写 )

程序会自动为你尝试 域。

第一部分总结

第一部分到此结束,下一部分我们会了解 文件是如何创建和更新的。

下面总结第一部分涵盖的内容:

◈ 操作系统中并不存在“DNS 查询”这个系统调用

◈ 不同程序可能采用不同的策略获取名字对应的 IP 地址

◈ 例如, 使用 ,后者进而使用(或可以使用) 、 以及主机名得到解析结果

◈ 用于决定:

◈ 查询什么地址(LCTT 译注:这里可能指 带来的影响)

◈ 使用什么 DNS 服务器执行查询

如果你曾认为 DNS 查询很复杂,请跟随这个系列学习吧。

1.实现的变种之多令人惊叹。我不希望在这里讨论过多。↩

2.另一个需要注意的地方:在没有指定 nameserver 的情况下会尝试 127.0.0.1:53。↩

via:https://zwischenzugs.com/2018/06/08/anatomy-of-a-linux-dns-lookup-part-i/

作者:dmatech

[11]

译者:pinewall校对:wxy

本文由LCTT原创编译,Linux中国荣誉推出

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180823B0AO4Y00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励