碰一个问题,linux机器可以ping通IP,但是ping域名直接报错【ping: unknown host baidu.com】
问题现象: ping 域名时不能解析域名,ping IP可以,初步看机器网络是正常的
root@BJ-CentOS7~# ping baidu.comping: unknown host baidu.comroot@BJ-CentOS7~# ping -c 2 8.8.8.8PING 8.8.8.8(8.8.8.8)56(84) bytes of data.64 bytes from8.8.8.8: icmp_seq=1 ttl=251 time=96.6 ms64 bytes from8.8.8.8: icmp_seq=2 ttl=251 time=100 ms---8.8.8.8 ping statistics ---2 packets transmitted,2 received,0% packet loss, time 1001msrtt min/avg/max/mdev =96.635/98.431/100.227/1.796 ms
问题分析: 从问题现象看,这里我们怀疑是不是 DNS 配置有问题呢?于是测试发现nslookup可以正常解析域名,DNS配置是没错的
root@BJ-CentOS7~# nslookup baidu.comServer:183.60.83.19Address:183.60.83.19#53Non-authoritative answer:Name: baidu.comAddress:123.125.115.110Name: baidu.comAddress:220.181.57.216root@BJ-CentOS7~# grep nameserver /etc/resolv.confnameserver 183.60.83.19nameserver 183.60.82.98
这里从网上了解到,原来 ping 程序解析域名依赖于C库中的函数 gethostbyname() 和 gethostbyaddr(),而这里对应的配置文件 /etc/nsswitch.conf 中的hosts 配置项: files 表示使用 /etc/hosts 和 /etc/network 配置文件 dns 表示使用 /etc/resolv.conf 文件中的 DNS解析地址 nis 表示查询NIS系统的配置信息
root@BJ-CentOS7~# grep hosts /etc/nsswitch.conf#hosts: db files nisplus nis dnshosts: filesroot@BJ-CentOS7~# cat /etc/hosts127.0.0.1 localhost localhost.localdomain VM_1_10_centosroot@BJ-CentOS7~# ping -c 2 localhostPING localhost (127.0.0.1)56(84) bytes of data.64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.023 ms64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.035 ms--- localhost ping statistics ---2 packets transmitted,2 received,0% packet loss, time 999msrtt min/avg/max/mdev =0.023/0.029/0.035/0.006 ms
验证发现果然写在 hosts 文件中的地址可以正常被 ping 程序解析,问题基本清楚,nslookup 是直接使用 /etc/resolv.conf 中的 DNS 服务器解析域名,而 ping 程序在没有在 /etc/nsswitch.conf 中的 hosts: dns 选项,所以无法解析 /etc/hosts 文件中不存在的解析记录
解决方案: 在 /etc/nsswitch.conf 文件的 hosts 配置项中添加 dns 选项,则可以使用 /etc/resolv.conf 中的 DNS 服务器解析域名,再次测试,可以正常解析域名了
root@BJ-CentOS7~# grep hosts /etc/nsswitch.conf#hosts: db files nisplus nis dnshosts: files dnsroot@BJ-CentOS7~# ping -c 2 baidu.comPING baidu.com (220.181.57.216)56(84) bytes of data.64 bytes from220.181.57.216: icmp_seq=1 ttl=250 time=9.05 ms64 bytes from220.181.57.216: icmp_seq=2 ttl=250 time=9.06 ms--- baidu.com ping statistics ---2 packets transmitted,2 received,0% packet loss, time 1001msrtt min/avg/max/mdev =9.051/9.057/9.063/0.006 ms