mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-25 23:11:02 +08:00
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:
commit
5bb3560daa
@ -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
|
Loading…
Reference in New Issue
Block a user