问题征兆:
1. ping google.com 失败
2. ping google 的 IP 地址,正常
3. ping /etc/resolv.conf 里的所有 nameserver,正常
也就是网络是正常的,但是不能解析域名。
在尝试用 wireshark 抓包 (tshark -n -i eth0 port 53),发现 ping google.com 完全没有产生流量。用 strace 运行 ping 之后,发现在读取完 /etc 下的几个配置文件 (/etc/host.conf, /etc/hosts) 后,ping 就直接退出了,没有看到明显的错误信息。
root@jesse-desktop:~# strace ping google.com 2>&1 | grep etc access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/etc/resolv.conf", O_RDONLY) = 4 stat64("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=150, ...}) = 0 open("/etc/resolv.conf", O_RDONLY) = 4 open("/etc/nsswitch.conf", O_RDONLY) = 4 read(4, "# /etc/nsswitch.conf\n#\n# Example"..., 4096) = 491 open("/etc/ld.so.cache", O_RDONLY) = 4 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/etc/host.conf", O_RDONLY) = 4 open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 4
问题原因:
在 /etc/nsswitch.conf 里,我误删了一个东西,导致系统根本不会通过 DNS 来解析域名。
这一行
hosts: files dns
被改成了:
hosts: files
原来 /etc/nsswitch.conf 如此重要...
NAME
nsswitch.conf - System Databases and Name Service Switch configuration file
DESCRIPTION
hosts Host names and numbers, used by gethostbyname(3) and similar functions.