为啥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
Answers
我也不懂,来贴下我的输出,等大婶解答。
$ 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.
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服务器
好吧,我知道答案了,顺便给问题加了个标签
yosemite
,大家也可以猜到这又是苹果干的好事了。我没有在问题中声明使用的系统非常不好
在新版的
yosemite
里,加入了一个
discoveryd
的进程来做网络发现,而且它也会缓存所有的dns查询记录,也就是所有与主机名相关的查询工作都会经过这样一个进程
所以你的域名查询实际上是经过了缓存,但这个缓存有个特点
-
ping
,dig
等直接获取域名结果的命令会被缓存 -
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
什么时候缓存会自动清除
- 根据资料上的记录,当你的dns服务器地址变更的时候,这些缓存会自动清除。比如你重新设置这里
- 当时间超过了域名的ttl限制后,这个域名就会被设置为过期
为什么题主的缓存没有更新
因为我使用了局域网的一台服务器来代理其它的dns,为了解决污染,我把它代理的源地址从
114.114.114.114
切换到了
8.8.8.8
。但mac上的dns地址却没变过,都是这台代理服务器的地址,所以
discoveryd
不会清除缓存
强制清除所有的dns缓存
在
yosemite
下,你可以输入
sudo discoveryutil mdnsflushcache;sudo discoveryutil udnsflushcaches