[转载] nslookup 域名结果正确,但是 ping 域名失败
<p>由于最近遇到了 配置了DNS,但是ping不同域名的情况,已经设置过 resolve.conf 以及 network-script/ifcfg-ens160 ,再无法解决,我就用跟本地host 来解决了。</p><p>后面一搜索才知道 原来是 nsswitch 这个配置, 少了一个dns,就本地hosts 和 mydomain 生效了,加一个dns就好了。</p>
<p>还有一些其他的linux 配置坑,见下文 <strong>转载内容:</strong></p>
<p> </p>
<p> </p>
<p> </p>
<blockquote>
<p>最近两周碰到了不同场景下四个DNS问题,所以记录一下</p>
</blockquote>
<p>这几个Case描述如下:</p>
<ol>
<li>一批ECS nslookup 域名结果正确,但是 ping 域名 返回 unknown host</li>
<li>在公司网下,我的windows7笔记本的wifi总是报dns域名异常无法上网(通过IP地址可以上网)</li>
<li>Docker集群中两个容器中 nslookup 同一个域名,返回来的IP不一样</li>
<li>中间件的VipClient服务在centos7上域名解析失败</li>
</ol>
<p>因为这些问题都不一样,但是都跟DNS服务相关所以打算分四篇文章挨个介绍,希望看完后DNS这块的问题应该是基本可以解决了。</p>
<h2>nslookup 域名结果正确,但是 ping 域名 返回 unknown host</h2>
<p>赶紧Google一下: nslookup ok but ping fail, 这个关键词居然Google自动提示了,看来碰到这个问题同学的好多好多</p>
<p>Google到的帖子大概有如下原因:</p>
<ul>
<li>域名最后没有加 . 然后被自动追加了 tbsite.net aliyun.com alidc.net,自然 ping不到了</li>
<li>/etc/resolv.conf 配置的nameserver要保证都是正常服务的</li>
<li>/etc/nsswitch.conf 中的这行:hosts: files dns 配置成了 hosts: files mdns dns,而server不支持mdns</li>
</ul>
<p>检查完我的环境没有上面的情况,比较悲催,居然碰到了一个Google不到的问题</p>
<h3>那就抓包看为什么解析不了</h3>
<blockquote>
<p>DNS协议是典型的UDP应用,一来一回就搞定了查询,效率比TCP三次握手要高多了,DNS Server也支持TCP,不过一般不用TCP</p>
</blockquote>
<pre class="language-none"><code>sudo tcpdump -i eth0 udp and port 53
</code></pre>
<p>抓包发现ping 不通域名的时候都是把域名丢到了 /etc/resolv.conf 中的第二台nameserver,或者根本没有发送 dns查询。</p>
<p>这里要多解释一下我们的环境, /etc/resolv.conf 配置了2台 nameserver,第一台负责解析内部域名,另外一台负责解析其它域名,如果内部域名的解析请求丢到了第二台上自然会解析不到。</p>
<p>所以这个问题的根本原因是挑选的nameserver不对,按照 /etc/resolv.conf 的逻辑都是使用第一个nameserver,失败后才使用第二、第三个备用nameserver。</p>
<p>比较奇怪,出问题的都是新申请到的一批ECS,仔细对比了一下正常的机器,发现有问题的 ECS /etc/resolv.conf 中放了一个词rotate,赶紧查了一下rotate的作用(轮训多个nameserver),然后把rotate去掉果然就好了。</p>
<h3>风波再起</h3>
<p>本来以为问题彻底解决了,结果还是有一台机器ping仍然是unknow host,眼睛都看瞎了没发现啥问题,抓包发现总是把dns请求交给第二个nameserver,或者根本不发送dns请求,这就有意思了,跟我们理解的不太一样。</p>
<p>看着像有cache之类的,于是在正常和不正常的机器上使用 strace ,果然发现了点不一样的东西:</p>
<p><img src="http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/ca466bb6430f1149958ceb41b9ffe591.png" alt="image.png" title="image.png"></p>
<p>ping的过程中访问了 nscd(name service cache daemon) 同时发现 nscd返回值图中红框的 0,跟正常机器比较发现正常机器红框中是 -1,于是检查 /var/run/nscd/ 下面的东西,kill 掉 nscd进程,然后删掉这个文件夹,再ping,一切都正常了。</p>
<p><strong>从strace来看所有的ping都会尝试看看 nscd 是否在运行,在的话找nscd要域名解析结果,如果nscd没有运行,那么再找 /etc/resolv.conf中的nameserver做域名解析</strong></p>
<p>而nslookup和dig这样的命令就不会尝试找nscd,所以没有这个问题。</p>
<h4>connect函数返回值的说明:</h4>
<pre class="language-none"><code>RETURN VALUE
Iftheconnection or binding succeeds, zero is returned.On error, -1 is returned,and errno is set appropriately.
</code></pre>
<p>Windows下客户端是默认有dns cache的,但是Linux Client上默认没有dns cache,DNS Server上是有cache的,所以忽视了这个问题。这个nscd是之前看ping不通,google到这么一个命令,但是应该没有搞明白它的作用,就执行了一个网上的命令,把nscd拉起来,然后ping 因为rotate的问题,还是不通,同时nscd cache了这个不通的结果,导致了新的问题</p>
<h2>原理分析</h2>
<ul>
<li>DNS域名解析的时候先根据 /etc/nsswitch.conf 配置的顺序进行dns解析,一般是这样配置:hosts: files dns 【files代表 /etc/hosts dns 代表 /etc/resolv.conf】</li>
<li>如果本地有DNS Client Cache,先走Cache查询,所以有时候看不到DNS网络包。Linux下nscd可以做这个cache,Windows下有 ipconfig /displaydns ipconfig /flushdns</li>
<li>如果 /etc/resolv.conf 中配置了多个nameserver,默认使用第一个,只有第一个失败【如53端口不响应、查不到域名后再用后面的nameserver顶上】</li>
<li>如果 /etc/resolv.conf 中配置了rotate,那么多个nameserver轮流使用</li>
</ul>
<h2>总结</h2>
<ul>
<li>/etc/resolv.conf rotate的关键作用</li>
<li>nscd对域名解析的cache</li>
<li>nslookup背后执行原理和ping不一样</li>
<li>在没有源代码的情况下strace和抓包能够看到问题的本质</li>
</ul>
<p>下一篇介绍《在公司网下,我的windows7笔记本的wifi总是报dns域名异常无法上网(通过IP地址可以上网)》困扰了我两年,最近换了新笔记本还是有这个问题才痛下决心咬牙解决</p>
<h3>参考资料</h3>
<p>https://superuser.com/questions/495759/why-is-ping-unable-to-resolve-a-name-when-nslookup-works-fine</p>
<p>https://stackoverflow.com/questions/330395/dns-problem-nslookup-works-ping-doesnt</p>
<p>DNS缓存介绍</p>
<p> </p>
<p>阿里云:</p>
<p class="article-title" data-spm-anchor-id="a2c6h.12873639.0.i2.1552dc5fHJERk8">如何让 git clone git@github.com 快到让你流泪</p>
<p class="article-title" data-spm-anchor-id="a2c6h.12873639.0.i2.1552dc5fHJERk8">nslookup 域名结果正确,但是 ping 域名失败</p>
<p class="article-title" data-spm-anchor-id="a2c6h.12873639.0.i2.1552dc5fHJERk8">其实本来是搜索到了 csdn了的,但是 csdn 都是转载,并不清楚原文的, 上面的看起来也是转载的,不过是阿里云社区, 比csdn好一些。</p>
<p class="article-title" data-spm-anchor-id="a2c6h.12873639.0.i2.1552dc5fHJERk8">csdn我一般都是禁止javascript的,倒是比较快,而且 搜索引擎 很容易就搜索到csdn,csdn抄袭转载也多,csdn还那么多广告,真是气人,谁让csdn是老站,权重高呢~。</p>
<p class="article-title" data-spm-anchor-id="a2c6h.12873639.0.i2.1552dc5fHJERk8"> </p>
</div>
<div id="MySignature" role="contentinfo">
<p style="display:none;">转载请注明出处:http://www.cnblogs.com/ayanmw 多谢</p>
<p>
------------------------------------------------------------------------------------------------</p>
<p>一定要专业!本博客定位于 ,C语言,C++语言,Java语言,Android开发和少量的Web开发,之前是做Web开发的,其实就是ASP维护,发现EasyASP这个好框架,对前端后端数据库 都很感觉亲切啊。.
linux,总之后台开发多一点。以后也愿意学习 cocos2d-x 游戏客户端的开发。
</p><br><br>
来源:https://www.cnblogs.com/ayanmw/p/14859204.html
頁:
[1]