Linux DNS查找的解剖

2021-06-05 02:56:06

由于我与集群虚拟机工作了很多,我最终花了很多时间试图弄清楚DNS查找如何工作。我从Stackoverflow应用了“修复”问题,而无需了解他们为什么工作(或不起作用)一段时间。

最终我已经厌倦了这一点,决定弄清楚它是如何一起挂起的。我找不到在线的任何地方找到完整的指南,并与同事交谈,他们不知道任何(或真的细节会发生什么)

事实证明,短语'Linux是否有DNS查找'......

这些帖子旨在分解程序如何决定它在Linux主机上获取IP地址以及可以参与的组件。不了解这些作品如何合适,调试和修复(例如)DNSMASQ,VAGRANT LANDRUSH或RESCVCONF可以完全令人困惑。

它也是一种有价值的例证,如何随着时间的推移如此简单地变得如此复杂。到目前为止,我迄今为止,我看过十几个不同的技术和他们的考古学。

我甚至写了一些自动化代码,以允许我在VM中进行实验。欢迎贡献/修正。

请注意,这不是“DNS工作原理”的帖子。这是关于呼叫到Linux主机上配置的实际DNS服务器的所有内容(假设它甚至调用DNS服务器 - 就像你看到的那样,它不需要),以及如何找到哪一个去哪一个或者它如何获得其他一些方式。

掌握的第一件事是没有单一的方法可以在Linux上完成DNS查找。它不是一个有干净界面的核心系统调用。

但是,有一个标准的c库调用称之为许多程序使用:getaddrinfo。但并非所有应用程序都使用这个!

他们都得到了相同的结果,所以他们必须做同样的事情,对吧?

以下是ping在与DNS相关的主机上查看的文件:

root @ linuxdns1:〜#strace -e trace = open -f ping -c1 google.com打开(" /etc/ld.so.cache",o_rdonly | o_cloexec)= 3打开(" /llib/x86_64-linux-gnu/libcap.so.2",o_rdonly | o_cloexec)= 3打开(" /lib/x86_64-linux-gnu/libc.so.6",o_rdonly | o_cloexec)= 3打开(" /etc/resolv.conf",o_rdonly | o_cloexec)= 4打开(" /etc/resolv.conf",o_rdonly | o_cloexec)= 4打开( " /etc/nsswitch.conf",o_rdonly | o_cloexec)= 4打开(" /etc/ld.so.cache",o_rdonly | o_cloexec)= 4打开(" /lib/x86_64-linux-gnu/libnss_files.so.2",o_rdonly | o_cloexec)= 4打开(" /etc/host.conf",o_rdonly | o_cloexec)= 4打开(&# 34; / etc / hosts",o_rdonly | o_cloexec)= 4打开(" /etc/ld.so.cache",o_rdonly | o_cloexec)= 4打开(" / lib / x86_64 -linux-gnu / libnsss_dns.so.2",o_rdonly | o_cloexec)= 4打开(" /lib/x86_64-linux-gnu/libresolv.so.2",o_rdonly | o_cloexec)= 4 ping google.com(216.58.204.46)56(84)个字节的数据。打开(" / etc / hosts",o_rdonly | o_cloexec)= 4 64字节从lhr25s12-in-f14.1e100.net(216.58.204.46):ICMP_SEQ = 1 TTL = 63次= 13.0 ms [。 ..]

$ strace -e trace = open -f host google.com [pid 9869]打开(" /usr/share/locale/en_us.utf-8/lc_messages/libdst.cat" ;, o_rdonly)= -1 enoent(没有这样的文件或目录)[pid 9869]打开(" /usr/share/locale/en/libdst.cat",o_rdonly)= -1 Enoent(没有这样的文件或目录)[PID 9869]打开(" / susr/share/locale/en/lc_messages/libdst.cat& n34;,o_rdonly)= -1 enoent(没有这样的文件或目录)[PID 9869]打开(& #34; /usr/lib/sl/openssl.cnf",o_rdonly)= 6 [PID 9869]打开(" /usr/lib/x86_64-linux-gnu/openssl-1.0.0/2nuins/ libgost.so",o_rdonly | o_cloexec)= 6 [pid 9869]打开(" /etc/resolv.conf",o_rdonly)= 6 google.com有地址216.58.204.46 [...]

您可以看到,虽然我的ping看起来nsswitch.conf,但主机没有。他们都看看/etc/resolv.conf。

我们已经建立了应用程序可以在他们决定哪个DNS服务器转到时更喜欢它们。上面的许多应用程序(如ping)可以通过其配置文件/etc/nsswitch.conf来引用(根据实现(*))到NSSwitch。

(*)Ping实现的令人惊讶的变化程度。这是一个我不想迷失的兔子洞。

NSSwitch不仅仅是为了DNS查找。它也用于密码和用户查找信息(例如)。

NSSwitch最初是作为Solaris操作系统的一部分创建的,以允许应用程序不必留给他们查看这些东西的内容或服务,但延迟到他们不必担心的其他可配置的集中式位置。

passwd:compat组:compat shadow:compat gshadow:文件主机:文件dns myhostname网络:文件协议:db文件服务:db文件ethers:db文件rpc:db文件netgroup:nis

“寄宿的行是我们对我们感兴趣的那个。我们已经表明,Ping关心nsswitch.conf所以让我们摆弄它,看看我们如何用ping弄乱。

$ ping -c1 localhost ping localhost(127.0.0.1)56(84)数据的字节。来自localhost的64个字节(127.0.0.1):ICMP_SEQ = 1 TTL = 64次= 0.039毫秒

$ ping -c1 google.com ping google.com(216.58.198.174)56(84)字节的数据。 来自LHR25S10-in-f174.1e100.NET(216.58.198.174)的64个字节(216.58.198.174):ICMP_SEQ = 1 TTL = 63次= 8.01毫秒 以下是默认WRT主机查找的NSSwitch正在发生的图: 我们现在看到了主机和ping都查看此/etc/resolv.conf文件。 #动态resolv.conf(5)文件用于resolvconf(8)生成的glibc resolver(3)的文件,不要手动编辑此文件 - 您的更改将被覆盖名称服务器10.0.2.3 忽略前两条线 - 我们会回到那些(它们很重要,但你还没准备好羊毛球)。 *另一个兔子洞:主机似乎返回到127.0.0.1:53如果没有指定的名称程序。 此文件也取其他选项。 例如,如果将此行添加到“roscv.conf文件”中:

这是第一部分的结束。下一部分将首先查看如何创建和更新resolv.conf。 不同的程序以不同的方式弄清出地址的IP,例如,ping使用nsswitch,这反过来使用(或可以使用)/ etc / hosts,/etc/resolv.conf和它自己的主机名来获得结果 如果你喜欢这一点,请考虑购买我是一杯咖啡,鼓励我做更多。