一 掺出、問題背景
最近碰到了這么一個非常奇怪的問題:
ping一個域名domain_name的時候提示”ping: unknown host domain_name“臀玄,但是ping域名對應的IP地址 (使用host或nslookup獲取) 卻沒有問題翎迁。
二、相關背景知識
libc && glibc
標準C庫 (the standard C library) 實現(xiàn)了ISO C標準,包含了一套所有C程序都可以使用的函數(shù)纷跛。libc通常被用作the standard C library的簡寫。
libc也被用作一個標準C庫的實現(xiàn)的名字邀杏。在19世紀90年代早期贫奠,Linux內核的開發(fā)者把glibc 1.x獨立了出來 (forked glibc),并把它稱為”Linux libc”望蜡,也簡稱為libc唤崭。Linux libc主要發(fā)布了2, 3, 4, 5四個版本。
1997年脖律,F(xiàn)SF發(fā)布了glibc 2.0谢肾,它對POSIX標準有更好的支持,并且代碼的可移植性更好小泉。因此芦疏,現(xiàn)在所有主要的Linux發(fā)行版都是使用glibc冕杠。
Linux libc的最后的so-name是libc.so.5,因此后來的glibc 2.x使用的so-name是libc.so.6眯分。
網(wǎng)絡信息服務(Network Information Service, NIS)
NIS也曾被稱YP (Yellow Pages)拌汇,它是一個基于RPC (Remote Procedure Call Protocol) 的客戶機/服務器系統(tǒng),允許一個NIS域中的一組機器共享一系列配置文件弊决。
在NIS環(huán)境中噪舀,有主服務器、從服務器和客戶機三種類型的主機飘诗。服務器的作用是充當主機配置信息的中央數(shù)據(jù)庫与倡。主服務器上保存著這些信息的權威副本,而從服務器則是保存這些信息的冗余副本昆稿。
客戶機依賴于服務器向它們提供這些信息纺座。
DNS Resolver
一個域名 (Domain Name) 由一個或多個標簽 (label) 組成,標簽之間用點隔開溉潭。
最右端的標簽代表頂級域 (top-level domain净响,TLD)。DNS (Domain Name System, 域名解析系統(tǒng)) 是互聯(lián)網(wǎng)的一項核心服務喳瓣,它是一個分布式層次化的系統(tǒng)馋贤,能夠將域名和IP地址相互映射。
DNS通過允許一個域名服務器把它的一部分域名解析服務委托給子服務器而實現(xiàn)了一種層次化的域名空間畏陕。
DNS由解析器 (Resolver) 和域名服務器兩部分組成配乓。
DNS系統(tǒng)的客戶端被稱為DNS解析器 (DNS Resolver)。
在Linux系統(tǒng)上惠毁,解析器并不是特指某個應用程序犹芹,而是指解析器庫。這個庫包含了標準C庫中的一系列函數(shù)鞠绰,最主要的兩個函數(shù)是gethostbyname()和gethostbyaddr()腰埂,可以對DNS解析器進行配置,使得它們查找/etc/hosts中的信息蜈膨、查詢DNS服務器或者使用網(wǎng)絡信息服務系統(tǒng)的配置信息盐固。
libc使用/etc/host.conf配置文件,而glibc使用/etc/nsswitch.conf配置文件丈挟。
/etc/host.conf中主要的選項有:
(1) order指定域名解析的查找順序刁卜,其中hosts表示/etc/hosts配置文件;bind表示查詢DNS服務器曙咽;nis表示查詢NIS系統(tǒng)的配置信息蛔趴。
(2) multi [on|off]指定/etc/hosts中的主機是否可以有多個IP地址。
/etc/nsswitch.conf是名字服務開關 (name service switch) 的配置文件例朱,其中對應DNS解析器的數(shù)據(jù)庫名字是hosts:孝情。
它的主要選項有:
(1) dns表示使用DNS解析地址
(2) files表示使用/etc/hosts和/etc/network配置文件
(3) nis或nisplus鱼蝉。
DNS服務器在/etc/resolv.conf中配置。
ping
ping命令用來測試網(wǎng)絡上的一臺主機是否能夠連通箫荡。
ping命令向目標主機發(fā)送ICMP (Internet Control Message Protocol) 回聲請求消息然后等待目標主機的回應魁亦,與此同時計算消息從源主機到目標主機的往返時間 (round-trip time,RTT)。
三羔挡、問題解決
首先洁奈,能夠ping域名對應的IP,顯然不可能是服務器禁止了ping服務 (使用防火墻等)绞灼。host和nslookup能夠返回域名對應的IP地址利术,那么/etc/resolv.conf中的DNS設置也是沒有問題的。
事實上低矮,使用ping命令處理一個域名的時候印叁,是使用gethostbyname()函數(shù)返回對應的主機信息 (參加源代碼); 而host和nslookup則是直接使用/etc/resolv.conf中的DNS服務器。因此军掂,需要查看/etc/nsswitch.conf中的hosts:數(shù)據(jù)庫是否打開了dns選項轮蜕。
vi /etc/nsswitch.conf
hosts: files dns
networks: files
改成:
hosts: files dns wins
networks: files
如果不一樣的話,就在hosts:原來那行后面加個wins 就行了蝗锥。
四跃洛、參考
Linux 能PING IP 但不能PING 主機域名的解決方法
https://www.cnblogs.com/gaoyuechen/p/8378138.html
nslookup-OK-but-ping-fail問題處理
https://plantegg.github.io/2019/01/09/nslookup-OK-but-ping-fail
Linux系統(tǒng)下的/etc/nsswitch.conf文件
https://blog.csdn.net/waqwn/article/details/51687719