为啥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文件里也没有配置任何相关的域名
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
好吧,我知道答案了,顺便给问题加了个标签
yosemite
,大家也可以猜到这又是苹果干的好事了。我没有在问题中声明使用的系统非常不好在新版的
yosemite
里,加入了一个discoveryd
的进程来做网络发现,而且它也会缓存所有的dns查询记录,也就是所有与主机名相关的查询工作都会经过这样一个进程所以你的域名查询实际上是经过了缓存,但这个缓存有个特点
ping
,dig
等直接获取域名结果的命令会被缓存nslookup
这类显式地从dns服务器获取结果的命令不会被缓存而且我们可以用
dig
命令的查询时间来判断是否被缓存了,如果被缓存了,那么它的耗时肯定是0ms
,比如下面的结果什么时候缓存会自动清除
为什么题主的缓存没有更新
因为我使用了局域网的一台服务器来代理其它的dns,为了解决污染,我把它代理的源地址从
114.114.114.114
切换到了8.8.8.8
。但mac上的dns地址却没变过,都是这台代理服务器的地址,所以discoveryd
不会清除缓存强制清除所有的dns缓存
在
yosemite
下,你可以输入ping是用来测试主机是否可达的工具,并不适合测试DNS是否正常
ping的默认行为是调用系统API(大多数应用程序也是如此)进行查询,期间会涉及到
而
nslookup
就简单多了,直接调用命令内置的dns客户端
,我也不懂,来贴下我的输出,等大婶解答。