一 网络环境
1,电力调度系统内有一台电量采集前置机,该前置机操作系统为IBM的AIX,前置机共有5块网卡,已经使用的有四块,名称分别为en1、en2、en3、en4,其IP地址与连接情况如下所示:
网卡名 IP地址 网关 连接说明
En1 198.121.100.103/16 198.122.100.100 连接198.121.0.0/16网段
En2 198.123.100.103/16 198.122.100.100 连接198.123.0.0/16网段
En3 198.120.100.103/16 198.122.100.100 连接198.120.0.0/16网段
En4 198.122.100.103/16 198.122.100.100(防火墙地址) 连接198.122.0.0/16网段和防火墙内部接口
2,防火墙启用了内到外的NAT功能,访问控制策略全部允许。
3,网络连接拓扑图:
二 故障现象
怪异之处:
1,开启一个ping 10.34.216.69的窗口是通的,关掉该窗口后,再开一个ping 10.34.216.69的窗口,此时不通;
2,开启一个ping 10.34.216.69的窗口是通的,再开一个ping 10.34.216.69的窗口,显示不通;
三 分析与测试过程
1, 首先串口登陆防火墙,在防火墙上ping前置机与防火墙直连的地址,一直正常,未出现丢包情况;
++++++++++++++++++++++++++++++++++确认防火墙跟前置机间的物理连接没有问题;
++++++++++++++++++++++++++++++++++
2, 启用防火墙的实时监控功能,发现:当前置机上可以ping通防火墙10.34.216.69地址时,监控列表里可以看见正常的进出数据包,当前置机上无法ping通防火墙10.34.216.69地址时,监控列表里没有任何前置机的进出数据包;
++++++++++++++++++++++++++++++++++
初步断定:前置机在ping不通10.34.216.69地址时,其ping请求包并未发送到防火墙,也就是说此故障现象与防火墙无关,基本上可以定位问题出在前置机本身;
++++++++++++++++++++++++++++++++++
3, 让用户在AIX上使用smit窗口界面查看各个接口IP地址设置情况,显示如网络环境中的描述一样(由于是用户的核心业务系统,加上我对UNIX系统不熟悉,在AIX前置机上的很多操作主要通过用户来完成),未发现明显异常;忽然想起在LINUX/UNIX下,一般都具有tcpdump抓包功能,IBM的AIX也应该具有,那么,我们只要使用tcpdump抓取en4接口的数据包,即可判断ping不通时,数据包有没有从前置机的en4口发出;于是,使用root权限登陆,尝试tcpdump命令,果然可以使用,于是在前置机ping不通10.34.216.69时,使用tcpdump -i en4 host 10.34.216.69 命令抓包,发现前置机ping 10.34.216.69的数据包的确未从en4口发出;
++++++++++++++++++++++++++++++++++
此时,可以确认问题是前置机未发出数据包了;
++++++++++++++++++++++++++++++++++
4, 网口上未抓到数据包,这说明系统在将数据包向网卡转发之前就丢弃了该数据包;一般系统的数据包处理流程如下图所示(各位注意红色筐内的流程):
根据这个处理流程,我们可以发现,系统在向网卡转发数据包之前是需要做路由选择的,那么,是否是由于在做路由选择时出错被系统丢弃了呢?
++++++++++++++++++++++++++++++++++
此时,我们将重点放到前置机的路由上来;
++++++++++++++++++++++++++++++++++
5, 考虑到在图形界面下看到的路由信息是有限的(图形界面下无法看到接口路由、主机路由、直连路由等等),我们在AIX上执行netstat –rn命令(这个命令相当于windows下的route print命令),查看前置机详细的路由表信息,发现:该前置机存在两条缺省路由,一条到防火墙内口地址198.122.120.100,一条到198.122.0.100;
++++++++++++++++++++++++++++++++++
确认前置机路由表异常;
++++++++++++++++++++++++++++++++++
6, 跟用户确认198.122.0.100的路由是否有用,198.122.0.100的地址是什么设备使用的,用户居然不清楚,那么我们先前置机上ping 198.122.0.100,显示不通,tcpdump抓包显示198.122.0.100主机未响应前置机的ARP请求,这说明198.122.0.100这个IP是不存活的;
++++++++++++++++++++++++++++++++++
基本上确认198.122.0.100是一个当前故障网络环境中无效的地址,那么到198.122.0.100的缺省路由也应该是一个无明确作用的路由;
++++++++++++++++++++++++++++++++++
7, 此时,我们可以推测出:当前置机ping不通防火墙外口地址时,其ping包在前置机系统内部的处理过程为:
⑴前置机将10.34.216.69的地址匹配了198.122.0.100的缺省路由;
⑵前置机向198.122.0.100发送ARP请求报文;
⑶由于198.122.0.100不存在,前置机不会收到198.122.0.100的ARP响应包;
⑷多次请求,无响应,超时;
⑸丢弃到10.34.216.69的数据包;
++++++++++++++++++++++++++++++++++
如果推测正确,那么上述现象是否说明,在AIX系统中,当存在两台缺省路由时,AIX系统对数据包路由的选择会在两条缺省路由间轮流?
++++++++++++++++++++++++++++++++++
8, 在前置机上逐步开启多个ping 10.34.216.69的窗口,我们发现:ping通的窗口与ping不通的窗口数量基本上是一致;
++++++++++++++++++++++++++++++++++
这个测试充分证明了第7步提出的假设,确认在AIX系统中,当存在两台缺省路由时,AIX系统对数据包路由的选择会在两条缺省路由间轮流
++++++++++++++++++++++++++++++++++
四 故障解决
找到问题的根源,将前置机中那条指向198.122.0.100的缺省路由删除,测试,一切正常,故障解决。
五 总结
1,在故障解决过程中,好的工具可以大大提高故障解决的效率(这个故障解决中,我们用到了天融信防火墙的实时监控功能、AIX的TCPDUMP抓包功能);
2,熟悉故障环境中的所有设备,可以快速定位故障(该故障解决过程中,由于我对UNIX系统不熟悉,导致查找UNIX命令、验证UNIX处理机制花费的较多的时间);
六 引申技术问题探讨
1,当Windows系统中存在两条缺省路由时,系统对数据包的处理是否是按照次序轮流选择的?
经验证:
⑴windows系统中存在两条缺省路由时,系统默认按照先添加的缺省路由转发数据包;且无论先添加的缺省网关是否正常,系统均不会将从后添加的缺省路由转发数据包;
⑵系统默认情况下,不会在两条缺省路由间负载均衡。
2,如果前置机是windows操作系统,该故障现象是否会发生?
我的理解:不会发生。原因分析如下:
首先,如果问题1中的疑问是否定的,那么WINDOWS系统肯定不会发生这种故障了;
其次,如果问题1的疑问是肯定的,我觉得也不会发生这种故障,原因如下:
⑴任何系统(主机系统、路由、防火墙等)对网络数据包的处理和转发都是需要建立连接表(五元组组成)的,否则是无法区分不同的连接的,对于ICMP协议也是一样的;
⑵在一些UNIX/LINUX实现中就是利用ICMP协议的code+type和id来作为五元组中的端口号来设置连接表项的;
⑶而windowsOS和LinuxOS的ping程序在实现上是有区别的,在windows中,无论开多少的ping进程,其ID是不变的,为0x0300,所以在windows上发起无论多少个ping,在系统的连接表中也是一个连接;在linux中则不同,每一个ping进程用的id是不同,比如在linux起两个ping,那么应该会在系统上记录为两条连接;
⑷系统在两条缺省路由间负载均衡数据流,应该会按照某种算法的,而这种算法的最小处理单元应该就是系统中的每个连接表项; |