首页 > 为啥Yosemite下我ping的地址和nslookup出来的地址不一样

为啥Yosemite下我ping的地址和nslookup出来的地址不一样

国内的dns地址会被污染,这大家都知道,但我已经用了黑科技在局域网内代理了一个纯净的dns服务器,用nslookup命令来看工作良好

$ nslookup twitter.com
Server:     10.0.10.201
Address:    10.0.10.201#53

Non-authoritative answer:
Name:   twitter.com
Address: 199.59.149.230
Name:   twitter.com
Address: 199.59.150.7
Name:   twitter.com
Address: 199.59.148.10
Name:   twitter.com
Address: 199.59.148.82

但是用ping命令发现却到了一个污染地址

$ ping twitter.com
PING twitter.com (37.61.54.158): 56 data bytes
Request timeout for icmp_seq 0

我用的是内网的dns,要污染也不会这么强吧!而且在我的hosts文件里也没有配置任何相关的域名


ping是用来测试主机是否可达的工具,并不适合测试DNS是否正常
ping的默认行为是调用系统API(大多数应用程序也是如此)进行查询,期间会涉及到

nslookup就简单多了,直接调用命令内置的dns客户端


好吧,我知道答案了,顺便给问题加了个标签 yosemite ,大家也可以猜到这又是苹果干的好事了。我没有在问题中声明使用的系统非常不好

在新版的yosemite里,加入了一个discoveryd的进程来做网络发现,而且它也会缓存所有的dns查询记录,也就是所有与主机名相关的查询工作都会经过这样一个进程

所以你的域名查询实际上是经过了缓存,但这个缓存有个特点

  1. pingdig等直接获取域名结果的命令会被缓存
  2. nslookup这类显式地从dns服务器获取结果的命令不会被缓存

而且我们可以用dig命令的查询时间来判断是否被缓存了,如果被缓存了,那么它的耗时肯定是0ms,比如下面的结果

$ dig twitter.com

; <<>> DiG 9.8.3-P1 <<>> twitter.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19734
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;twitter.com.           IN  A

;; ANSWER SECTION:
twitter.com.        28  IN  A   199.59.149.198
twitter.com.        28  IN  A   199.59.149.230
twitter.com.        28  IN  A   199.59.150.7
twitter.com.        28  IN  A   199.59.150.39

;; Query time: 0 msec
;; SERVER: 10.0.10.201#53(10.0.10.201)
;; WHEN: Thu Nov 27 15:00:05 2014
;; MSG SIZE  rcvd: 93

什么时候缓存会自动清除

  1. 根据资料上的记录,当你的dns服务器地址变更的时候,这些缓存会自动清除。比如你重新设置这里
  2. 当时间超过了域名的ttl限制后,这个域名就会被设置为过期

为什么题主的缓存没有更新

因为我使用了局域网的一台服务器来代理其它的dns,为了解决污染,我把它代理的源地址从114.114.114.114切换到了8.8.8.8。但mac上的dns地址却没变过,都是这台代理服务器的地址,所以discoveryd不会清除缓存

强制清除所有的dns缓存

yosemite下,你可以输入

sudo discoveryutil mdnsflushcache;sudo discoveryutil udnsflushcaches

我也不懂,来贴下我的输出,等大婶解答。

$ nslookup twitter.com
Server:     127.0.0.1
Address:    127.0.0.1#53

Non-authoritative answer:
Name:   twitter.com
Address: 37.61.54.158

$ dig twitter.com

; <<>> DiG 9.9.2-P2 <<>> twitter.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12838
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;twitter.com.           IN  A

;; ANSWER SECTION:
twitter.com.        15476   IN  A   37.61.54.158

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Nov 27 14:29:39 2014
;; MSG SIZE  rcvd: 56

$ host twitter.com
twitter.com has address 37.61.54.158
twitter.com mail is handled by 20 alt1.aspmx.l.google.com.
twitter.com mail is handled by 30 ASPMX2.GOOGLEMAIL.com.
twitter.com mail is handled by 30 ASPMX3.GOOGLEMAIL.com.
twitter.com mail is handled by 20 alt2.aspmx.l.google.com.
twitter.com mail is handled by 10 aspmx.l.google.com.
【热门文章】
【热门文章】