<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Snooda]]></title> 
<link>http://www.snooda.com/index</link> 
<description><![CDATA[Snooda's Blog]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Snooda]]></copyright>
<item>
<link>http://www.snooda.com/read/342</link>
<title><![CDATA[dns缓存nscd原理及相关知识]]></title> 
<author>snooda &lt;admin@snooda.com&gt;</author>
<category><![CDATA[网络]]></category>
<pubDate>Sun, 12 Jun 2016 07:05:00 +0000</pubDate> 
<guid>http://www.snooda.com/read/342</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;由于sshd是支持包转发的。所以最近配置了一些规则，将指定uid的包转发到指定目标。通过统计包数量，发现tcp的数据是正常的，但dns请求包不生效，还是走原路径。tcpdump抓包发现确实是发到系统配置的resolver那里去了。看了眼sshd的代码，是使用了libc里面的res_query方法来做域名解析的。像gethostbyaddr也是使用的这个方法。考虑到可能是这里发生的问题，于是用strace抓包看了一眼。发现该方法是先去连接/var/run/nscd/socket。如果成功，则发送域名解析请求，然后由nscd服务进行dns解析。所以按uid来抓包会失效。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;nscd是一个缓存服务。会缓存passwd、hosts、resolv三类信息。和dnsmasq类似。先试图停掉nscd服务再进行尝试，果然进程在试图连接/var/run/nscd/socket失败后，转为连接resolv.conf里指定的server，可以成功被iptables转发。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;定位了具体问题原因后，开始寻找更多解决方案。停掉nscd固然最简单，但会导致整个系统都失去dns缓存，对性能还是有一定影响的。于是寻找优化一些的方案。思路是对于指定进程绕过nscd机制。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;研究了一下。发现nscd为了避免自己的请求发送给自己导致死循环，调用了一个__nss_disable_nscd方法。调用该方法后即可关闭nscd机制。于是改动了一下sshd源码，重新编译了一个。再次重试。果然ok了。<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>Tags - <a href="http://www.snooda.com/tags/nscd/" rel="tag">nscd</a> , <a href="http://www.snooda.com/tags/dns/" rel="tag">dns</a>
]]>
</description>
</item><item>
<link>http://www.snooda.com/read/342#blogcomment187</link>
<title><![CDATA[[评论] dns缓存nscd原理及相关知识]]></title> 
<author>dean &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Wed, 20 Jan 2021 11:04:45 +0000</pubDate> 
<guid>http://www.snooda.com/read/342#blogcomment187</guid> 
<description>
<![CDATA[ 
	博主，请问个问题，您是在__attribute__((constructor))那个函数前调用的__nss_disable_nscd
]]>
</description>
</item>
</channel>
</rss>