Ping 是否使用過 DNS 記憶體
我有幾個問題。
首先,今天早上我遇到了它,它給我返回了一個地址
ping
216.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 的名稱解析過程的困境