Merge pull request #9944 from wxy/20180618-Anatomy-of-a-Linux-DNS-Lookup-–-Part-II

PRF&PUB:20180618 Anatomy of a Linux DNS Lookup – Part II
@lujun9972 这个系列的3、4、5原文也有了,请选题出来,:D 
请 @pinewall 有空的话继续翻译此系列——之前两篇翻译的很棒!
另外 @lujun9972 请手工处理一下选题工具对文章标题中的 “-” 的处理,原文可能采用了一个 UTF8的“-”,而不是英文的“-”,此处问题可参照该文章的 CI 检查识别情况。
This commit is contained in:
Xingyu.Wang 2018-08-25 08:28:54 +08:00 committed by GitHub
commit 5bb3560daa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,28 +1,26 @@
Linux DNS 查询剖析 - 第二部分 Linux DNS 查询剖析(第二部分)
============================================================ ==============================================
在 [Linux DNS 查询剖析 - 第一部分][1] 中,我介绍了: 在 [Linux DNS 查询剖析 - 第一部分][1] 中,我介绍了:
* `nsswitch` * `nsswitch`
* `/etc/hosts` * `/etc/hosts`
* `/etc/resolv.conf` * `/etc/resolv.conf`
* `ping` vs `host` 对应的查询方式 * `ping` 与 `host` 查询方式对比
并且发现大多数程序选择要查询的 DNS 服务器时会参考 `/etc/resolv.conf` 配置文件。 并且发现大多数程序选择要查询的 DNS 服务器时会参考 `/etc/resolv.conf` 配置文件。
这种方式在 Linux 上比较普遍 (*)。虽然我使用了特定的发行版 Ubuntu但背后的原理与 Debian 甚至是那些基于 CentOS 的发行版相通的地方;当然,与更低或更高的 Ubuntu 版本相比,差异还是存在的。 这种方式在 Linux 上比较普遍[^1]。虽然我使用了特定的发行版 Ubuntu但背后的原理与 Debian 甚至是那些基于 CentOS 的发行版相通的地方;当然,与更低或更高的 Ubuntu 版本相比,差异还是存在的。
###### (*) 事实上,这是相对于 POSIX 标准的,故不限于 Linux (我从上一篇文章的一条极好的[回复][2]中了解到这一点) [^1]: 事实上,这是相对于 POSIX 标准的,故不限于 Linux (我从上一篇文章的一条极好的[回复][2]中了解到这一点)
也就是说,接下来,你主机上的行为很可能与我描述的不一致。 也就是说,接下来,你主机上的行为很可能与我描述的不一致。
在第二部分中,我将介绍 `resolv.conf` 的更新机制、`systemctl restart networking` 命令的运行机制 ,以及 `dhclient` 是如何参与其中。 在第二部分中,我将介绍 `resolv.conf` 的更新机制、`systemctl restart networking` 命令的运行机制 ,以及 `dhclient` 是如何参与其中。
* * * ### 1) 手动更新 /etc/resolv.conf
# 1) 手动更新 /etc/resolv.conf 我们知道 `/etc/resolv.conf` (有极大的可能性)被用到,故你自然可以通过该文件增加一个 `nameserver`,那么主机也将会(与已有的 `nameserver` 一起)使用新加入的 `nameserver` 吧?
我们知道 `/etc/resolv.conf` (有极大的可能性)被用到,故你自然可以通过该文件增加一个 nameserver那么主机也将会与已有的 nameservers 一起)使用新加入的 nameserver 吧?
你可以尝试如下: 你可以尝试如下:
@ -30,7 +28,7 @@ Linux DNS 查询剖析 - 第二部分
$ echo nameserver 10.10.10.10 >> /etc/resolv.conf $ echo nameserver 10.10.10.10 >> /etc/resolv.conf
``` ```
看上去新的 nameserver 已经加入: 看上去新的 `nameserver` 已经加入:
``` ```
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
@ -51,13 +49,11 @@ nameserver 10.0.2.3
search home search home
``` ```
我们的 `10.10.10.10` nameserver 不见了! 我们的 `10.10.10.10` `nameserver` 不见了!
在上一篇文章中我们忽略了这一点,本文进行补充说明。 在上一篇文章中我们忽略了这一点,本文进行补充说明。
* * * ### 2) resolvconf
# 2) resolvconf
你在 `/etc/resolv.conf` 文件中看到 `generated by resolvconf` 词组了吧?这就是我们的线索。 你在 `/etc/resolv.conf` 文件中看到 `generated by resolvconf` 词组了吧?这就是我们的线索。
@ -72,11 +68,11 @@ search home
``` ```
Add or overwrite the record IFACE.PROG then run the update scripts Add or overwrite the record IFACE.PROG then run the update scripts
if updating is enabled. if updating is enabled.
LCTT 译注:增加或覆盖 IFACE.PROG 记录,如果开启更新选项,则运行更新脚本)
``` ```
故而也许我们可以直接调用该命令增加 namserver (增加或覆盖 IFACE.PROG 记录,如果开启更新选项,则运行更新脚本)
故而也许我们可以直接调用该命令增加 `namserver`
``` ```
echo 'nameserver 10.10.10.10' | /sbin/resolvconf -a enp0s8.inet echo 'nameserver 10.10.10.10' | /sbin/resolvconf -a enp0s8.inet
@ -90,7 +86,7 @@ nameserver 10.0.2.3
nameserver 10.10.10.10 nameserver 10.10.10.10
``` ```
是否已经找到答案,这就是 `/etc/resolv.conf` 更新的逻辑?调用 `resolvconf` 将 nameserver 添加到某个地方的数据库,然后(如果配置了更新,先不管具体什么含义)更新 `resolv.conf` 文件。 是否已经找到答案,这就是 `/etc/resolv.conf` 更新的逻辑?调用 `resolvconf``nameserver` 添加到某个地方的数据库,然后(如果配置了更新,先不管具体什么含义)更新 `resolv.conf` 文件。
并非如此。 并非如此。
@ -103,13 +99,11 @@ nameserver 10.0.2.3
search home search home
``` ```
呃!(网络服务重启后)新增的 nameserver 再次消失了。 呃!(网络服务重启后)新增的 `nameserver` 再次消失了。
可见,`systemctl restart networking` 不仅仅运行了 `resolvconf`,还在其它地方获取 nameserver 信息。具体是哪里呢? 可见,`systemctl restart networking` 不仅仅运行了 `resolvconf`,还在其它地方获取 `nameserver` 信息。具体是哪里呢?
* * * ### 3) ifup/ifdown
# 3) ifup/ifdown
继续深入研究 `systemctl restart networking`,发现它完成了一系列工作: 继续深入研究 `systemctl restart networking`,发现它完成了一系列工作:
@ -133,9 +127,9 @@ ExecStop=/sbin/ifdown -a --read-environment --exclude=lo
/sbin/ifup -a --read-environment /sbin/ifup -a --read-environment
``` ```
第一行使用 `ifdown` 关闭全部的网络接口,但<ruby>本地回环<rt>local, lo</rt></ruby>接口除外。(*) 第一行使用 `ifdown` 关闭全部的网络接口,但<ruby>本地回环<rt>local, lo</rt></ruby>接口除外。[^2]
###### (*) 我不明白为何这没有导致我例子中的 vagrant 会话中断 (有谁明白吗?)。 [^2]: 我不明白为何这没有导致我例子中的 vagrant 会话中断 (有谁明白吗?)。
LCTT 译注:其实这是因为很快就又启动了接口,间隔的时间没有超过 TCP 连接的超时时间,有人在评论中也做了类似回复) LCTT 译注:其实这是因为很快就又启动了接口,间隔的时间没有超过 TCP 连接的超时时间,有人在评论中也做了类似回复)
@ -147,9 +141,7 @@ ExecStop=/sbin/ifdown -a --read-environment --exclude=lo
其中一件工作就是运行了 `dhclient`,但我还不完全确定具体的机理,也许 `udev` 参与其中。 其中一件工作就是运行了 `dhclient`,但我还不完全确定具体的机理,也许 `udev` 参与其中。
* * * ### 4) dhclient
# 4) dhclient
`dhclient` 是一个程序,用于与 DHCP 服务器协商对应网络接口应该使用的 IP 地址的详细信息。同时,它也可以获取可用的 DNS 服务器并将其替换到 `/etc/resolv.conf` 中。 `dhclient` 是一个程序,用于与 DHCP 服务器协商对应网络接口应该使用的 IP 地址的详细信息。同时,它也可以获取可用的 DNS 服务器并将其替换到 `/etc/resolv.conf` 中。
@ -177,7 +169,7 @@ $ cat /etc/resolv.conf | grep nameserver
nameserver 10.0.2.3 nameserver 10.0.2.3
``` ```
可见这就是 nameserver 的来源。 可见这就是 `nameserver` 的来源。
但稍等一下,命令中的 `/run/resolvconf/resolv.conf` 是哪个文件,不应该是 `/etc/resolv.conf` 吗? 但稍等一下,命令中的 `/run/resolvconf/resolv.conf` 是哪个文件,不应该是 `/etc/resolv.conf` 吗?
@ -185,16 +177,14 @@ nameserver 10.0.2.3
在我的虚拟机上,它是一个软链接,指向位于 `/run/resolvconf` 目录下的“真实文件”。这也暗示了我们,该文件是在系统启动时生成的;同时,这也是该文件注释告诉我们不要直接修改该文件的原因。 在我的虚拟机上,它是一个软链接,指向位于 `/run/resolvconf` 目录下的“真实文件”。这也暗示了我们,该文件是在系统启动时生成的;同时,这也是该文件注释告诉我们不要直接修改该文件的原因。
LCTT 译注:在 CentOS 7 中,没有 resolvconf 命令,/etc/resolv.conf 也不是软链接) LCTT 译注:在 CentOS 7 中,没有 `resolvconf` 命令,`/etc/resolv.conf` 也不是软链接)
假如上面命令中 `sed` 命令直接处理 `/etc/resolv.conf` 文件,效果是不同的,会有警告消息告知待操作的文件不能是软链接(`sed -i` 无法很好的处理软链接,它只会创建一个新文件)。 假如上面命令中 `sed` 命令直接处理 `/etc/resolv.conf` 文件,效果是不同的,会有警告消息告知待操作的文件不能是软链接(`sed -i` 无法很好的处理软链接,它只会创建一个新文件)。
译注CentOS 7 测试时,`sed -i` 命令操作软链接并没有警告,但确实创建了新文件取代软链接) LCTT 译注CentOS 7 测试时,`sed -i` 命令操作软链接并没有警告,但确实创建了新文件取代软链接)
如果你继续深入查看配置文件 `/etc/dhcp/dhclient.conf``supersede` 部分,你会发现 `dhclient` 可以覆盖 DHCP 提供的 DNS 服务器。 如果你继续深入查看配置文件 `/etc/dhcp/dhclient.conf``supersede` 部分,你会发现 `dhclient` 可以覆盖 DHCP 提供的 DNS 服务器。
* * *
![linux-dns-2 (2)](https://zwischenzugs.files.wordpress.com/2018/06/linux-dns-2-2.png?w=525) ![linux-dns-2 (2)](https://zwischenzugs.files.wordpress.com/2018/06/linux-dns-2-2.png?w=525)
_大致准确的关系图_ _大致准确的关系图_
@ -224,10 +214,10 @@ via: https://zwischenzugs.com/2018/06/18/anatomy-of-a-linux-dns-lookup-part-ii/
作者:[ZWISCHENZUGS][a] 作者:[ZWISCHENZUGS][a]
译者:[pinewall](https://github.com/pinewall) 译者:[pinewall](https://github.com/pinewall)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://zwischenzugs.com/ [a]:https://zwischenzugs.com/
[1]:https://zwischenzugs.com/2018/06/08/anatomy-of-a-linux-dns-lookup-part-i/ [1]:https://linux.cn/article-9943-1.html
[2]:https://zwischenzugs.com/2018/06/08/anatomy-of-a-linux-dns-lookup-part-i/#comment-2312 [2]:https://zwischenzugs.com/2018/06/08/anatomy-of-a-linux-dns-lookup-part-i/#comment-2312