为啥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文件里也没有配置任何相关的域名

dns nslookup ping macosx yosemite

bluecpu 10 years, 2 months ago

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


 $ 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.

奥妮克希亚 answered 10 years, 2 months ago

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

  • Windows

    • HOSTS file
    • search NetBIOS name cache
    • query WINS server
    • broadcast NetBIOS Name Query
    • search DNS client resolver cache
    • query DNS server
  • Unix

    • /etc/hosts
    • query NIS service
    • query DNS server

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

  • 先查cache是否命中
  • 若无法命中,则直接查询系统配置的或者命令行指定的dns服务器
工口豆抚子 answered 10 years, 2 months ago

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

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

图片描述

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

  1. ping dig 等直接获取域名结果的命令会被缓存
  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

干果儿Ai队长 answered 10 years, 2 months ago

Your Answer