译者:宋安迪
我经常使用虚拟机集群(第 1 条、第 2 条、第 3 条、第 4 条、第 5 条、第 6 条),因此我最终花了很多时间试图掌握 DNS 查询的工作原理。 当我遇到问题时,我只是使用“解决方案”,而不理解为什么它们有时有效,有时无效。
最终我厌倦了它,并决定立即找出所有问题的原因。 我在网上没有找到完整的指南,我问了一些同事,他们也不知道为什么(也许问题太具体了)。
在这种情况下,我开始自己写这样的手册。
事实证明,“Linux 执行 DNS 查询”这句话背后有相当多的工作。
“有多难?”
本系列文章尝试分析Linux主机上的程序获取IP地址(对应域名)的过程以及该过程中涉及到的组件。 在不了解这些块如何协同工作的情况下,调试与 .
这也是一个有价值的例证,说明了原本简单的事情如何随着时间的推移而变得相当复杂。 在弄清楚 DNS 查询如何工作的过程中,我了解了许多不同的技术及其演变。
我什至编写了一些自动化脚本,允许我在虚拟机中进行实验。 欢迎广大读者踊跃投稿或指正。
请注意,本系列的主题不是“DNS 是如何工作的”,而是与查询 Linux 主机配置的真实 DNS 服务器相关的内容(这里假设查询的是 DNS 服务器,但后面你会看到,有时这个不需要)。 以及如何确定使用哪个查询结果,或者如何使用其他方式来确定IP地址。
1)实际上不存在名为“DNS Query”的系统调用
事情不是这样的
首先要了解的是,在 Linux 上进行 DNS 查找的方法并不单一。 没有任何核心系统调用具有如此显式的接口。
然而,许多程序都使用标准 C 库函数调用; 但并非所有程序或应用程序都使用它!
让我们看一下两个简单的标准程序:ping 和host:
root@:~# ping -c1 bbc.co.uk | head -1 PING bbc.co.uk (151.101.192.81) 56(84) 字节数据。
root@:~# 主机 bbc.co.uk | head -1 bbc.co.uk 有 151.101.192.81
对于同一个域名,两个程序获取的IP地址是相同的; 所以他们用同样的方法得到结果,对吗?
但事实上并非如此。
以下文件给出了与我的主机上的 ping 相对应的 DNS 相关系统调用:
root@:~# -e trace=open -f ping -c1 open("/etc/ld.so.cache", |) = 3 open("/lib/-linux-gnu/.so.2", | ) = 3 打开("/lib/-linux-gnu/libc.so.6", |) = 3 打开("/etc/.conf", |) = 4 打开("/etc/.conf", | ) = 4 打开("/etc/.conf", |) = 4 打开("/etc/ld.so.cache", |) = 4 打开("/lib/-linux-gnu/.so.2" , |) = 4 打开("/etc/host.conf", |) = 4 打开("/etc/hosts", |) = 4 打开("/etc/ld.so.cache", |) = 4打开(“/lib/-linux-gnu/.so.2”,|)= 4 打开(“/lib/-linux-gnu/.so.2”,|)= 4 PING(216.58.204.46)56( 84) 字节数据。 open("/etc/hosts", |) = 4 64 字节 (216.58.204.46): =1 ttl=63 time=13.0 ms [...]
下面是host对应的系统调用:
$ -e trace=open -f host [...] [pid 9869] open("/usr/share//en_US.UTF-8//.cat", ) = -1 (没有这样的文件或 ) [pid 9869] open("/usr/share//en/.cat", ) = -1 (没有这样的文件或 ) [pid 9869] open("/usr/share//en//.cat", ) = - 1 (没有这样的文件或) [pid 9869] open("/usr/lib/ssl/f", ) = 6 [pid 9869] open("/usr/lib/-linux-gnu/-1.0.0// .so", |) = 6[pid 9869] open("/etc/.conf", ) = 6 有 216.58.204.46 [...]
可以看到ping打开了.conf文件,但是host没有; 但这两个程序都打开了 /etc/.conf 文件。
下面我们依次看一下两个扩展名为.conf的文件。
2)与/etc/.conf
我们已经确认应用程序可以决定使用哪个 DNS 服务器。 很多应用(比如ping)都是参考配置文件/etc/.conf(具体实现根据1)来完成选择。
例如,不仅适用于 DNS 查询,还适用于密码和用户信息查询。
最初是操作系统的一部分,允许应用程序查询所需的文件或服务,而无需对其进行硬编码,而是在其他不需要应用程序开发人员管理的集中式配置文件中找到它们。
下面是我的.conf:
: 组: : : 文件主机: 文件dns : 文件: db 文件: db 文件: db 文件rpc: db 文件: nis
我们需要关注的是主线。 我们知道 ping 使用 .conf 文件,因此让我们修改此文件(hosts 行)以查看它如何影响 ping。
修改.conf,只保留hosts行中的文件
如果修改 .conf,请仅保留文件的主机行:
主机:文件
此时ping无法获取对应的IP地址:
$ ping -c1 ping:主机
但解析不受影响:
$ ping -c1 PING (127.0.0.1) 56(84) 字节数据。 来自 (127.0.0.1) 的 64 个字节:=1 ttl=64 时间=0.039 ms
此外,主机命令正常返回:
$ 主机有 216.58.206.110
毕竟,正如我们之前看到的,host 不受 .conf 的影响。
修改.conf,hosts行只保留dns
如果修改 .conf,请将主机行更改为仅 dns:
主机:DNS
此时,解析恢复正常:
$ ping -c1 PING (216.58.198.174) 56(84) 字节数据。 来自 (216.58.198.174) 的 64 个字节:=1 ttl=63 时间=8.01 ms
但无法解析:
$ ping -c1 ping:主机
下图展示了默认hosts行对应的查询逻辑:
我的主机:配置是.conf中给出的默认值
3)/etc/.conf
我们已经知道 host 和 ping 都使用 /etc/.conf 文件。
以下是我的主机的/etc/.conf文件的内容:
# glibc (3) by (8) 的 .conf(5) 文件 # 不要手动编辑此文件 -- 您的版本将是 10.0.2.3
现在先忽略前两行,稍后我们会回到这部分(它们很重要,但你也需要一些知识)。
其中一行指定用于查询的 DNS 服务器。
如果你注释掉这一行:
#10.0.2.3
再次运行:
$ ping -c1 ping:主机
解析失败,因为没有可用的名称服务器 2。
该文件中还提供其他选项。 例如,您可以将以下行添加到 .conf 文件中:
com
然后执行ping(不要写.com)
$ ping PING (216.58.204.14) 56(84) 字节数据。
该程序将自动为您尝试 .com 域。
第 1 部分总结
第一部分到此结束,在下一部分中,我们将了解如何创建和更新 .conf 文件。
以下是第一部分所涵盖内容的摘要:
如果您曾经认为 DNS 查询很复杂,请关注本系列。
ping 实现的多样性是惊人的。 我不想在这里讨论太多细节。 ↩还有一点需要注意:如果未指定,主机将尝试 127.0.0.1:53。 ↩
通过:
作者: 译者: 校对者:wxy
本文由 LCTT 原创编译,Linux China 自豪推出
扫一扫在手机端查看
-
Tags : dns host linux dns配置
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。