解决DNS问题
1. 概述
就像华尔街的诺亚或宾夕法尼亚大道的艾尔莎一样,机器也拥有网络的名称和地址。这些地址始终是数字的,人类难以破译。这为 DNS 映射的概念铺平了道路。
本教程将阐述 DNS 查找、配置和优先级。
现在让我们深入了解它的本质。
2. DNS 查询
DNS 代表域名系统,它是互联网地址的电话目录。顾名思义,类似于电话号码映射,DNS 服务器将名称映射到 IP 地址。DNS 进程帮助机器将用户友好的主机名 (www.blogdemo.com ) 转换为计算机友好的 IP 地址 (104.26.12.74)。
我们可以使用ping命令验证上述解释:
server# ping -c 1 www.blogdemo.com
PING www.blogdemo.com (104.26.12.74) 56(84) bytes of data.
64 bytes from 104.26.12.74 (104.26.12.74): icmp_seq=1 ttl=58 time=47.3 ms
--- www.blogdemo.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 47.318/47.318/47.318/0.000 ms
通常,当我们键入 www.blogdemo.com 时,计算机会将其转换为有效的 IP 地址以进行进一步通信,并与本地计算机中配置的公共或私有 DNS 服务器进行通信。
在我们的例子中,为了演示,我们将配置 Google 公共 DNS 服务器,即 8.8.8.8 (dns.google.domain)。现在让我们使用tcpdump 命令进行字节级分析:
server# sudo tcpdump -i enp0s8
listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
19:26:43.509890 IP REMOTE-SERVER.57760
> dns.google.domain: 63513+ [1au] A? www.blogdemo.com. (45)
19:26:43.511320 IP REMOTE-SERVER.47910
> dns.google.domain: 13515+ [1au] PTR? 8.8.8.8.in-addr.arpa. (49)
19:26:43.511368 IP REMOTE-SERVER.57760
> dns.google.domain: 33324+ [1au] AAAA? www.blogdemo.com. (45)
19:26:43.525408 IP dns.google.domain
> REMOTE-SERVER.47910: 13515 1/0/1 PTR dns.google. (73)
19:26:43.555246 IP dns.google.domain
> REMOTE-SERVER.57760: 63513 3/0/1 A 104.26.13.74, A 172.67.72.45, A 104.26.12.74 (93)
19:26:43.559284 IP dns.google.domain
> REMOTE-SERVER.57760: 33324 3/0/1 AAAA 2606:4700:20::ac43:482d, AAAA 2606:4700:20::681a:c4a, AAAA 2606:4700:20::681a:d4a (129)
19:26:43.560398 IP REMOTE-SERVER
> 104.26.13.74: ICMP echo request, id 1910, seq 1, length 64
19:26:43.594618 IP 104.26.13.74
> REMOTE-SERVER: ICMP echo reply, id 1910, seq 1, length 64
首先,系统通过默认端口 53 与配置的 DNS 服务器对话,以获取 A 和 AAAA 记录。这些是返回与www.blogdemo.com 映射的IPv4 和 IPv6 地址的地址映射记录**。
在双栈配置的情况下,由于性能更好,IPv6 接口优于 IPv4。
在我们的插图中,第一行和第三行是对 A 和 AAAA 记录的 DNS 请求,而第五行和第六行是带有 IPV4 和 IPv6 地址的 DNS 主机响应。在这里,PTR 记录是反向解析,其中 IP 地址解析为域名。
最后,系统向 DNS 解析的 IP 地址发起 ICMP 回显请求,并从远程机器获取后续响应,如最后两行所示。
此外,我们还可以使用dig命令获取 IPv4/IPv6 映射记录。如上一节所述,记录提供 IPv4 地址,而 AAAA 记录解析为 IPv6 地址。+short选项有助于仅显示详细挖掘输出的答案部分:
server# dig A +short www.blogdemo.com
104.26.13.74
...
server# dig AAAA +short www.blogdemo.com
2606:4700:20::681a:c4a
...
另一方面,host命令还提供域到 IP 地址的映射信息:
server# host www.blogdemo.com
www.blogdemo.com has address 104.26.12.74
...
www.blogdemo.com has IPv6 address 2606:4700:20::681a:d4a
...
3. DNS配置
通常,DNS 服务器信息在 Linux 系统的*/etc/resolv.conf*中定义。它包含使用 nameserver 标记的 DNS 服务器 IP 地址,我们可以在每个新行上拥有多个 DNS 服务器。
文件中名称服务器的顺序定义了优先级。IPv4 和 IPv6 名称服务器的语法相同:
server# grep "nameserver" /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
或者,我们在 Linux 系统中也有*/etc/hosts文件,这些文件将主机名映射到系统内本地的 IP 地址。事不宜迟,让我们看一下/etc/hosts*文件:
server# more /etc/hosts
127.0.0.1 localhost
127.0.1.1 REMOTE-SERVER
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
...
现在让我们添加一行将 www.blogdemo.com 映射到环回 IP 地址,我们将看看 ping 响应会发生什么:
server# grep "blogdemo" /etc/hosts
192.168.56.103 www.blogdemo.com
server# ping -c 1 www.blogdemo.com
PING www.blogdemo.com (192.168.56.103) 56(84) bytes of data.
64 bytes from www.blogdemo.com (192.168.56.103): icmp_seq=1 ttl=64 time=0.163 ms
--- www.blogdemo.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.163/0.163/0.163/0.000 ms
有趣的是,ping 命令解析为环回而不是实际的公共 IP 地址。这一切都归结为引用解析器的系统优先级。*与/etc/resolv.conf文件相比,/etc/hosts*文件的执行优先级更高。**
我们可以在*/etc/nsswitch.conf*下定义和查看这些,如下所示:
server# cat /etc/nsswitch.conf | grep "hosts"
hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname