Welcome to Snooda's Blog

dns缓存nscd原理及相关知识

[| 不指定 2016/06/12 15:05]
    由于sshd是支持包转发的。所以最近配置了一些规则,将指定uid的包转发到指定目标。通过统计包数量,发现tcp的数据是正常的,但dns请求包不生效,还是走原路径。tcpdump抓包发现确实是发到系统配置的resolver那里去了。看了眼sshd的代码,是使用了libc里面的res_query方法来做域名解析的。像gethostbyaddr也是使用的这个方法。考虑到可能是这里发生的问题,于是用strace抓包看了一眼。发现该方法是先去连接/var/run/nscd/socket。如果成功,则发送域名解析请求,然后由nscd服务进行dns解析。所以按uid来抓包会失效。

    nscd是一个缓存服务。会缓存passwd、hosts、resolv三类信息。和dnsmasq类似。先试图停掉nscd服务再进行尝试,果然进程在试图连接/var/run/nscd/socket失败后,转为连接resolv.conf里指定的server,可以成功被iptables转发。


    定位了具体问题原因后,开始寻找更多解决方案。停掉nscd固然最简单,但会导致整个系统都失去dns缓存,对性能还是有一定影响的。于是寻找优化一些的方案。思路是对于指定进程绕过nscd机制。


    研究了一下。发现nscd为了避免自己的请求发送给自己导致死循环,调用了一个__nss_disable_nscd方法。调用该方法后即可关闭nscd机制。于是改动了一下sshd源码,重新编译了一个。再次重试。果然ok了。












Tags: ,
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]