某次业务割接过程中,发现云主机内网出现部分能ping通,部分ping不通现场,特别像网络虚拟化里的分区或隔离,且某台主机出现ping 网关和127.0.0.1回显unknown host的情况,但可正常ping localhost,其他都不能ping,但该主机并未禁ping,且telnet同网段新地址的端口,通信正常,证明网络通信应该正常。具体请看下文。
1、查看是否禁ping
cat /proc/sys/net/ipv4/icmp_echo_ignore_all //1为禁ping
2、ping 本地地址测试:
ping gw //不通,网关有问题,ip地址冲突或mac地址冲突
ping 127.0.0.1 //显示unknown host,可能是网卡驱动工作不正常,即tcp/ip协议问题,或防火墙问题
3、查看network服务,虽然服务正常,但有报错:网络不可达的问题
报错:
SIOCADDRT: Network is unreachable
RTNETLINK answers: File exists
上述错误一般是默认网关问题,导致不可达。ping一下网关,但是ping的通不代表一定能做路由的下一跳。
4、查看网卡信息:
lspci|grep -i eth
//确认网卡是否连接好
mii-tool eh0 //正常会显示link ok
//查看网卡工作mos
ethtool eth0
5、配置临时ip地址
ifconfig eth0 172.16.18.2 netmask 255.255.255.0
#对于网卡子接口,可执行如下
ifconfig eth0:1 172.16.18.2 netmask 255.255.255.0
6、重启网卡后一直显示多个网关地址,包括手动配置静态网卡,后几个排查发下/etc/sysconfig/static-routes,里写了之前旧的网关地址,即该配置文件的优先级高于静态网卡配置,修改后重启network服务后,网关地址正常。
dhclient //自动获取ip
netstat –r
route -n
netstat –i
ip -s link
7、后经测试云主机内网ping还是不通,检查安全组,增加icmp准入规则后正常。
8、关于涉及ping回显unknown host那台云主机,还发现执行yum报错:
/usr/lib64/python2.7/site-packages/rpm/_rpm.so: undefined symbol: rpmpkgVerifySigs
参考:附1、附2处理,本次案例中尚未对此进行验证,验证过的同学请留言,反馈相关效果。
9、查看ARP缓存
cat /proc/sys/net/ipv4/neigh/eth0/base_reachable_time
arp -a
ip neigh show
arp –s 192.168.57.5 00:00:23:0A:44:32 //静态绑定mac地址
arping -I eht0 ip -c arp包请求发送测试数
tcpdump -n not port ssh and not port 4838 and not port 80 and not port 6667
traceroute -np 53 8.8.8.8
strace -e trace=network ping -c 1 localhost
10、进过多方尝试还是未找到ping 127.0.0.1回显unknown host的故障,多半不是网卡问题,因arping正常,个跟换网卡后未有明显效果,重启lo网卡未果,本地静态解析未发现异常;是系统错误配置或内核参数误修改,库损坏导致此问题。
11、后经同事验证,发行这种除了locahost,其他ping都回显unknown host的现象,重新安装ping后得到恢复。执行:
yum install -y iputils
12、我们可以通过修改nsswitch配置文件,确认本地文件是否可正常解析。
事实上,当使用ping命令处理一个域名的时候,是使用gethostbyname()函数返回对应的主机信息 (参加源代码); 而host和nslookup则是直接使用/etc/resolv.conf中的DNS服务器。因此,需要查看/etc/nsswitch.conf中的hosts:数据库是否打开了dns选项。
对于DNS来说,dns在nsswitch上完成解析时,还需要调用两个函数库文件,分别是libnsswitchdns和libnsswitchfile文件。这样才DNS才可以发挥作用,那么DNS是如何将一个主机域名解析成一个ip的呢?这就需要DNS的数据库文件了,这个数据库文件里面的就包含了域名和ip的映射关系,DNS在解析时,会出查找这个文件中该域名所对应的ip,然后再将ip返回给客户端,这样就完成解析了。
vi /etc/nsswitch.conf //
hosts: files dns //其中对应DNS解析器的数据库名字是hosts:。它的主要选项有:(1) dns表示使用DNS解析地址 (2) files表示使用/etc/hosts和/etc/network配置文件 (3) nis或nisplus。调试可删掉files看下
注:hosts dns #只使用/etc/resolv.conf查询,不使用/etc/hosts;hosts files #只使用/etc/hosts查询
我们遇到域名解析问题,尤其从linux7过来的人,第一映像会怀疑DNS服务(named(bind&bind-util))异常导致的解析问题,或期配置文件问题。但DNS只是一种用于域名解析的服务进程;该服务是基于某个平台上来实现的,这个平台就是nsswitch。
nsswitch全称为: network service switch(NSS:网络服务转换开关),它是一个通用框架,是各种类型库交互的公共实现,它被 GNU C库 和其他应用程序使用,以确定要从哪些来源、按什么顺序获取指定类别信息的解析服务。NSS的配置文件为:/etc/nsswitch.conf;该文件是纯 ASCII 文本文件,列由空格或制表符分隔。第一列指定数据库名称。其余列描述了要查询的源的顺序以及可以通过查找结果执行的一组有限的操作。类似如下:
passwd: compat
group: compat
shadow: compat
hosts: files mdns4_minimal [NOTFOUND=return] dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
/etc/nsswitch.conf它规定了通过哪些途径、按照什么顺序以及查找哪些特定类型的信息,还可以指定系统在某个方法生效或者失效时将采取什么动作。例如: 用户名到ID,或者ID到用户名,再或者IP到域名的查找方式。nsswitch加载了各类别的api接口,并以模块方式装载进nsswitch中,当程序发起nsswitch的api调用时,nswitch会自动完成到各类别中查找内容。需要注意的是nsswitch只提供平台,并不负责实际上的名称解析。nsswitch.conf 的每一行都规定了以什么方式进行搜索。
某些发行版里,没有启用nscd服务(Name Service Cache Daemon),这时nsswitch可以控制dns(/etc/resolv.conf)和files(/etc/hosts)的解析顺序,顺序靠前的优先,一般配置顺序是:hosts: files dns。但是当开启nscd服务之后,不论nsswitch怎么配置,都是nscd缓存优先。nscd缓存的数据库文件位置:/var/db/nscd/hosts。NSS支持的服务规范取决于共享库的存在,因此是可扩展的。名为 /lib/libnss_SERVICE.so.X 的库将提供命名的 SERVICE,名为 SERVICE 的服务由位于 /lib 中的名为 libnss_SERVICE.so.X 的共享对象库实现。注意:nsswitch通常是为本机上的各种应用程序在名称解析时,完成各种解析库的对应的,nsswitch库需要跟各种对象接口解析交互,所以nsswitch对各种对应接口都有一个与之交互的实现方案。库位置:/usr/lib64/libnss和/lib64/libnss,其中libnss表框架,libnss_files-表驱动;
也可以把NSS看做Linux里的一个工具,它为通用配置数据库和名称解析机制提供了各种来源。这些源文件包括本地操作系统文件(例如/etc/passwd、/etc/group和/etc/hosts)、域名系统(DNS)、网络信息服务(NIS)和LDAP
1)NSS工作原理及名称解析流程
工作原理:
实现将主机名转换成IP地址的这种解析机制,主要依赖两个关键库文件,分别为Libness_files(.so),Libnss_dns(.so),这两个都是库文件,库是需要被调用的,即如上图所示,调用的库对象就是上图中平台下的对应的店铺,而它们彼此之间建立关联关系就是通过nsswitch这个框架,而nsswitch对我们而言的展现形式就是库文件组织文件(/etc/nsswitch.conf)。/etc/nsswitch.conf 由 glibc 包提供,glibc 是 GNU 发布的 libc 库,即 C 运行库。 glibc 是 linux 系统中最底层的 api,几乎其它任何运行库都会依赖于 glibc。
基本流程:
应用程序 --> nsswitch(配置文件,查询顺序) --> 对应库文件 --> 解析库 --> 完成解析
解析流程:
当需要提供nsswitch.conf文件所描述的信息的时候,系统将检查含有适当info字段的配置行
它按照从左向右的顺序开始执行配置行中指定的方法,在默认情况下,如果找到期望的信息,系统将停止搜索
如果没有指定action,那么当某个方法未能返回结果时,系统就会尝试下一个动作。
2)配置文件说明
配置文件格式:
databases: method[[action]] [method[[action]]…]
下面的列表描述了nsswitch.conf文件控制搜索的大多数信息(Info项)的类型。按照从左到右的搜索顺序,如果第一个没有找到,会自动到第二个method查询;
下面列出了nsswich.conf文件控制搜索信息类型的方法,对于每一种信息类型,都可以指定下面的一种或多种方法:
NSS 中可用数据库如下:
aliases 邮件别名, sendmail(8) 使用该文件.
ethers 以太网号.
group 用户组, getgrent(3) 函数使用该文件.
hosts 主机名和主机号, gethostbyname(3) 以及类似的函数使用了该文件.
netgroup 网络内主机及其用户的列表,访问规则使用该文件.
network 网络名及网络号, getnetent(3) 函数使用该文件.
passwd 用户口令, getpwent(3) 函数使用该文件.
protocols 网络协议, getprotoent(3) 函数使用该文件.
publickey NIS + 及 NFS 所使用的 secure_rpc 的公开密匙.
rpc远程过程调用名及调用号,getrpcbyname(3) 及类似函数使用该文件.
services 网络服务, getservent(3) 函数使用该文件.
\
shadow shadow 用户口令, getspnam(3) 函数使用该文件.
3)解析文件查找命令:getent
作用:手动查找对应的解析文件位置,即从nisswitch库中查找记录
语法:getent DATABASE [key]
getent passwd root
getent services ssh
4)解析优先级
/etc/hosts》/etc/sysconfig/network-scripts/ifcfg-eth0》/etc/resolv.conf
注:/etc/resolv.conf配置里的search含义
search local.xx local.yy //当nslookup www查询失败时,会继续查询www.local.xx,如果仍然失败,继续查询www.local.yy