Linux

Ping 是否使用過 DNS 記憶體

  • December 28, 2020

我有幾個問題。

首先,今天早上我遇到了它,它給我返回了一個地址ping216.58.220.14 。google.com

現在奇怪的是,在第一次 ping 之後的任何時候都嘗試 ping 導致相同的地址,即216.58.220.14 (考慮到Google會對它們進行負載平衡,我預計至少有一段時間不同的地址)

所以,我問我旁邊的朋友(我的同事)(通過同一個網路)ping google.com ,正如我所期待的,它返回了一個不同的地址。

問題一: Ping 是否使用機器 DNS 記憶體。

問題2: 如何顯示Linux(Ubuntu)的DNS記憶體條目。

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。

假設文件中沒有 google.com 的條目/etc/hosts,則每次執行 ping 命令時,它都會聯繫 dns 伺服器以解析主機名。所以這一切都取決於 dns 伺服器如何返回查詢。我在這裡使用執行 Ubuntu 14.04 並使用 google dns 伺服器(8.8.8.8)的測試 VM 進行了測試,這裡是 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 的名稱解析過程的困境

引用自:https://serverfault.com/questions/758050