Ping 是否使用过 DNS 缓存

Vir*_*ren -1 domain-name-system linux ping

我有几个问题。

首先,今天早上我正在ping对抗google.com它,它返回了一个地址216.58.220.14

现在奇怪的是,在第一次 ping 之后的任何时候,所有尝试 ping 的结果都是相同的地址,即216.58.220.14 (我期待不同的地址至少有一段时间考虑到谷歌会对它们进行负载平衡)

因此,我问坐在我旁边(通过同一网络)的朋友(我的同事)ping google.com ,正如我所期望的那样,它返回了不同的地址。

问题 1: Ping 是否使用机器 DNS 缓存。

问题 2: 如何显示 Linux(Ubuntu) 的 DNS 缓存条目。

Ove*_*ind 5

  1. 不,它没有,但总的来说这取决于决心。当您发出命令时,DNS 条目将解析为 IP 地址(是的,这取决于缓存),然后 ping 命令协议 (ICMP) 使用 IP 地址,而不是名称。这意味着如果在您连续 ping 目标时发生 DNS 更改,结果将不会受到该更改的影响。缓存在这里也不相关。

  2. Ubuntu 默认不缓存 DNS。不过,NSCD 守护进程是处理程序。


Dia*_*ond 5

在 nsswitch.conf 中定义了系统将使用哪个数据库来解析现代 Linux 系统中的主机名。https://www.oreilly.com/openbook/linag2/book/ch06.html

解析器库

术语解析器不是指特殊应用程序,而是指解析器库。这是可以在标准 C 库中找到的函数集合。中心例程是 gethostbyname(2) 和 gethostbyaddr(2),它们查找与主机名关联的所有 IP 地址,反之亦然。它们可以配置为简单地在主机中查找信息、查询多个 DNS 名称服务器或使用网络信息服务 (NIS) 的主机数据库。

解析器函数在调用时读取配置文件。从这些配置文件中,它们确定要查询的数据库、查询顺序以及与您如何配置环境相关的其他详细信息。较旧的 Linux 标准库 libc 使用 /etc/host.conf 作为其主配置文件,但 GNU 标准库的第 2 版 glibc 使用 /etc/nsswitch.conf。

假设/etc/hosts文件中没有 google.com 的条目,每次运行 ping 命令时,它都会联系 dns 服务器以解析主机名。所以这完全取决于 dns 服务器如何返回查询。我在这里使用运行 Ubuntu 14.04 的测试 VM 进行了测试,并使用了 google dns 服务器(8.8.8.8),这里是 ping 命令和相应的 tcpdump 捕获的结果:

首先ping和对应的tcpdump:

root@testvm:/home/testuser# ping google.com
PING google.com (80.149.20.99) 56(84) bytes of data.
64 bytes from 80.149.20.99: icmp_seq=1 ttl=59 time=19.0 ms
64 bytes from 80.149.20.99: icmp_seq=2 ttl=59 time=18.7 ms
64 bytes from 80.149.20.99: icmp_seq=3 ttl=59 time=20.4 ms
64 bytes from 80.149.20.99: icmp_seq=4 ttl=59 time=18.7 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 18.733/19.261/20.467/0.715 ms
Run Code Online (Sandbox Code Playgroud)
11:23:10.439152 IP 10.11.1.33.45008 > google-public-dns-a.google.com.domain: 48602+ A? google.com. (28)
11:23:10.482544 IP google-public-dns-a.google.com.domain > 10.11.1.33.45008: 48602 16/0/0 A 80.149.20.99, A 80.149.20.88, A 80.149.20.108, A 80.149.20.93, A 80.149.20.104, A 80.149.20.94, A 80.149.20.114, A 80.149.20.103, A 80.149.20.98, A 80.149.20.89, A 80.149.20.113, A 80.149.20.119, A 80.149.20.109, A 80.149.20.118, A 80.149.20.123, A 80.149.20.84 (284)
11:23:10.483370 IP 10.11.1.33 > 80.149.20.99: ICMP echo request, id 2397, seq 1, length 64
11:23:10.502433 IP 80.149.20.99 > 10.11.1.33: ICMP echo reply, id 2397, seq 1, length 64
Run Code Online (Sandbox Code Playgroud)

第二个 ping 和相应的 tcpdump:

root@testvm:/home/testuser# ping google.com
PING google.com (80.149.20.98) 56(84) bytes of data.
64 bytes from 80.149.20.98: icmp_seq=1 ttl=59 time=18.1 ms
64 bytes from 80.149.20.98: icmp_seq=2 ttl=59 time=18.4 ms
^C
--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 18.173/18.326/18.480/0.204 ms
Run Code Online (Sandbox Code Playgroud)
11:25:34.118450 IP 10.11.1.33.51623 > google-public-dns-a.google.com.domain: 60862+ A? google.com. (28)
11:25:34.146881 IP google-public-dns-a.google.com.domain > 10.11.1.33.51623: 60862 16/0/0 A 80.149.20.98, A 80.149.20.84, A 80.149.20.89, A 80.149.20.118, A 80.149.20.109, A 80.149.20.114, A 80.149.20.103, A 80.149.20.113, A 80.149.20.93, A 80.149.20.119, A 80.149.20.104, A 80.149.20.108, A 80.149.20.123, A 80.149.20.88, A 80.149.20.99, A 80.149.20.94 (284)
11:25:34.147512 IP 10.11.1.33 > 80.149.20.98: ICMP echo request, id 2408, seq 1, length 64
11:25:34.165675 IP 80.149.20.98 > 10.11.1.33: ICMP echo reply, id 2408, seq 1, length 64
Run Code Online (Sandbox Code Playgroud)

这里有趣的点是:

  • 每次运行命令时,ping 都会向配置的 dns 服务器(因为 /etc/hosts 文件中没有此主机的条目)进行 dns 查询(A 记录)。
  • google dns 服务器以不同的顺序返回多个 ip。
  • ping 实用程序使用从 dns 服务器返回的第一个 ip 地址并向其发送回显请求。

因此,ping 进程本身没有缓存,这完全取决于 dns 服务器的回复方式。可能是被查询的 dns 服务器正在返回缓存值或相同的结果,然后 ping 也将使用相同的 ip。

另一个重要因素是(如上所述)/etc/nsswitch.conf文件,它告诉解析器要查找的数据库以及查找顺序。下面是测试vm的相关内容:

hosts:          files dns
Run Code Online (Sandbox Code Playgroud)

以上告诉系统首先使用该文件/etc/hosts,如果在那里找不到,则使用 DNS 服务器进行主机名解析。在这种情况下,/etc/hosts 文件中的条目将优先于 dns 记录。更多关于这个主题的信息: 名称服务和解析器配置

Windows 环境的另一个有趣阅读:使用 PING 与 NSLOOKUP 进行名称解析过程的困境