努力, 努力, 再努力
全部博文(220)
分类: 系统运维
2016-11-23 10:45:18
1. 发现应用系统apache-tomcat 不能对外发送邮件,catalina.out 总是有异常:
SendFailedException: Send failure, Unknown SMTP host: mail.xxxx.com
2. dig mail.xxxx.com 失败,发现/etc/resolv.conf 内容为空,将该文件内容补全, 添加nameserver, dig mail.xxx.com , nslookup mail.xxx.com 正常.
但ping 或telnet ww.baidu.com 80提示“名称和服务未知”
3. 故障分析: dig , nslookup命令正常返回域名的IP, 说明该主机与dns之间的通信是正常的。
但问题是ping , telnet 域名, 这些命令却不能正常解析域名
说明ping, telnet这些命令对域名解析的过程与dig , nslookup是不一样的。
1. 在另一台CentOS6.5 ping 就是正常的
2. strace命令可以观察linux下一个命令的详细执行过程,包括打开哪些文件,有哪些系统调用,一目了然
通过命令strace ping –c 1 分别在故障机与正常机分别执行,对比发现两台主机都去读/var/run/nscd/socket文件,不同的是,正常机找不到这个文件,故障可以找到这个文件。
百度nscd, 原来这是一个linux下的缓存服务,可以缓存passwd, group, hosts.
3. 至此,猜测可能是由于linux 本地dns缓存导致的故障.
4. 清除dns缓存: nscd -i hosts, ping, telnet 域名正常
另一种方法:/etc/init.d/nscd restart 也应该可以,未验证
1. 当发现/etc/resolv.conf 内容为空时,再查该文件的修改时间为零晨3: 32,因此怀疑系统可能是遇到入侵。
查看当前进程,未发现可疑的进程。
2. 最近几天启动的进程,查了下相关文件,文件大小与其他centOS6.5上的大小到一致。没有可疑进程,文件又没有被修改过,入侵的可能性不大。
3. 发现故障主机里有一个/sbin/dhclient -1 –q –lf 启动时间为3:32, 正好在故障时间段内,因此怀疑可能是dhclient 启动引起/etc/resolv.conf为空
4. 但/var/log/message里有dhcp 客户端信息,只有获取IP,没有获取dns信息
dhclient[17060]: DHCPDISCOVER on usb0 to 255.255.255.255 port 67 interval 9
dhclient[17060]: DHCPOFFER from 169.254.95.118
dhclient[17060]: DHCPREQUEST on usb0 to 255.255.255.255 port 67 (xid=0x5a2083cd)
dhclient[17060]: DHCPACK from 169.254.95.118 (xid=0x5a2083cd)
dhclient[17060]: bound to 169.254.95.120 -- renewal in 277 seconds
dhclient[17097]: DHCPREQUEST on usb0 to 169.254.95.118 port 67 (xid=0x5a2083cd)
dhclient[17097]: DHCPACK from 169.254.95.118 (xid=0x5a2083cd)
dhclient[17097]: bound to 169.254.95.120 -- renewal in 243 seconds.
5. 是否是/sbin/dhclient引发的故障,还不能完全确定。
五. 相关知识:
1. ps -eo comm,lstart 可以查看进程何时启动的
2. strace ping –c 1 可以跟踪一个命令的执行过程
3. 查看dhclient 执行后获得哪些信息:
方法1 ifconfig eth1 #
方法2,显示更详细 cat /var/lib/dhclient/dhclient.leases
4. nscd会缓存三种服务passwd group hosts
所以它会记录三个库,分别对应源/etc/passwd, /etc/hosts 和 /etc/resolv.conf每个库保存两份缓存,一份是找到记录的,一份是没有找到记录的。每一种缓存都保存有生存时间(TTL)。其作用就是在本当中增加cache ,加快如DNS的解析等的速度
参考链接:
5. linux下清除dns缓存的命令:
nscd -i hosts
/etc/init.d/nscd restart