我有几个问题。
首先,今天早上我在跑步ping
时google.com
,它返回了一个地址216.58.220.14。
现在奇怪的是,在第一次 ping 之后,所有 ping 尝试都会导致相同的地址,即216.58.220.14 (考虑到谷歌会对它们进行负载平衡,我至少在某些时候期望不同的地址)
因此,我请坐在我旁边的朋友(我的同事)(在同一个网络上),正如ping google.com
我所料,它返回了不同的地址。
问题 1:Ping 是否使用机器 DNS 缓存。
问题2: 如何显示Linux(Ubuntu)的DNS缓存条目。
答案1
在现代 Linux 系统中,系统将使用哪个数据库来解析主机名在 nsswitch.conf 中定义。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。
假设文件中没有 google.com 的条目/etc/hosts
,每次运行 ping 命令时,它都会联系 dns 服务器来解析主机名。因此,这完全取决于 dns 服务器如何返回查询。我在这里使用运行 Ubuntu 14.04 的测试虚拟机进行了测试,并使用了 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
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
第二次 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
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
此处有趣的点是:
- 每次运行该命令时,ping 都会对配置的 DNS 服务器进行 DNS 查询(A 记录)(因为 /etc/hosts 文件中没有此主机的条目)。
- google dns 服务器以不同的顺序返回多个 ip。
- ping 实用程序正在使用从 DNS 服务器返回的第一个 IP 地址并向其发送回显请求。
因此,ping 过程本身没有缓存,一切都取决于 DNS 服务器如何响应。查询的 DNS 服务器可能返回缓存值或相同结果,那么 ping 也将使用相同的 IP。
另一个重要因素是(如上所述)文件/etc/nsswitch.conf
,它告诉解析器要查找哪个数据库以及按什么顺序查找。以下是来自测试虚拟机的相关内容:
hosts: files dns
上述代码告诉系统/etc/hosts
首先使用该文件,如果找不到该文件,则使用 DNS 服务器进行主机名解析。在这种情况下,/etc/hosts 文件中的条目将优先于 DNS 记录。有关此主题的更多信息,请参见此处:
名称服务和解析器配置
另一篇关于Windows环境的有趣读物:使用 PING 与 NSLOOKUP 进行名称解析的困境
答案2
不,它不会,但总体而言,这取决于解析。当您发出命令时,DNS条目将解析为IP地址(是的,这依赖于缓存),然后ping命令协议(ICMP)将使用IP地址而不是名称。这意味着,如果在您连续ping目标时发生DNS更改,则结果不会受到该更改的影响。缓存在这里也不相关。
Ubuntu 默认不缓存 DNS。不过 NSCD 守护进程是处理程序。