再次体会wireshark的威力!
今天一位同学给我打电话,说是重启了客户机房里的一台服务器A,重启之后此台服务器不能与B服务器通信了,要命的是A台服务器上有关键数据需要与B服务器进行通信交互。客户大发雷霆,同学的老板也发火一再催促要尽快完工此次项目把钱收回来,做为项目经理的同学陷入到了严重的焦虑当中,一方面因为耽误了客户的业务感到愧疚,更一方面害怕公司的名誉受损,影响接下来的合作。这位同学已经一天一夜没有休息了,他们公司的工程师也来了两位依然没有查到原因,无奈下向我求助,我能体会到这位同学进退两难的境地,透过电话能感受到他低落的情绪,不亲身经历的人永远无法体会这种感觉。我决定试一试帮他解决。
问题听起来并不复杂,就是A服务器因重启之后无法连接WEB服务器了,于是我收集了A服务器的网络信息,如下:
[root@A~]# ifconfig | egrep "HWaddr|inet addr"
eth0 Link encap:Ethernet HWaddr 00:0C:29:EC:9C:70
inet addr:192.168.80.124 Bcast:192.168.80.255 Mask:255.255.255.0
eth1 Link encap:Ethernet HWaddr 00:0C:29:EC:9C:84
inet addr:192.168.90.31 Bcast:192.168.90.255 Mask:255.255.255.0
eth2 Link encap:Ethernet HWaddr 00:0C:29:EC:9C:7A
inet addr:192.168.100.31 Bcast:192.168.100.255 Mask:255.255.255.0
inet addr:127.0.0.1 Mask:255.0.0.0
[root@A ~]# route | grep default
default 192.168.80.254 0.0.0.0 UG 0 0 0 eth0
而B服务器只有一个IP地址,没有网关,地址如下:
[root@B~]# ifconfig | grep "inet addr"
inet addr:192.168.10.9 Bcast:192.168.10.255 Mask:255.255.255.0
在这个环境当中,A服务器的三个网卡都与B服务器的网卡不在同一个网段,正常情况下,如果A想与B进行通信必须先将数据包交付给网关(192.168.80.254)进行转发,于是我在A服务器ping了一下网关,发现A服务器与网关是可以通的,但无法与B通信,请求一直是超时,难道是网关没有把包给转发出去?或者是ICMP-request包到达了B服务器之后被iptables的INPUT链给DROP掉了,亦或者是ICMP-replay包到达了B服务器之后被iptables的OUTPUT链给DROP掉了?造成这个现象的原因有好多,我又不在现场,能排查的地方实在有限,我感觉自己已经走进了死胡同,难道这次帮忙要以失败告终?我不甘心。
在屏幕前面发呆了一会儿,我拿出A4纸,把造成这个现象所有的、我能想到的原因全部列了出来,列出来之后我发现我所列出的原因都是集中在数据包离开A服务器之后所经过的节点设备和B服务器上,却没有列出A服务器本身的原因,这时大脑当中忽然莫名奇妙的“蹦”出来一句话与这事不相干的话:“行有不得,反求诸已”,我好像抓住了什么!我有种强烈的预感,问题就是出在这里,A服务器与网关的通信已经能确认没问题,但是A服务器与B服务器通信的数据包真的从A服务器正常发出去了吗?这个我不确定,怎样才能验证一下呢?真是一波三折,正当发愁时,看到任务栏上的wireshark软件,对呀!通过wireshark可以确认A服务器与B服务器通信情况,赶紧试一下。
于是我在A服务器ping B服务器时,在A服务器的三个网卡都抓了包,结果发现eth0网卡竟然一个ICMP包都没有发,这不应该,A服务器与B服务器通信时,要通过eth0网卡才能将数据包交给网关,因为A的eth0与网关是处在同一个子网,但是现在却一个包都没有。我又打开在eth1网卡上抓的包,结果惊讶的发现竟然有查找B服务器的ARP广播包!!!如下所示:
这说明什么问题呢?这说明A上存在一个符合192.168.10.9的路由表项,使得A通过eth1直接与B通信,而没有匹配到默认路由。我赶紧一条条的仔细检查路由表,果然发现有这么一条!如下所示:
[root@A ~]# route -n | egrep "Dest|192.168.10.0"
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
因为192.168.10.9默认也属于192.168.10.9/24表项,所以默认就会走这条路由,而不同子网所配置的VLAN也不同,所以这些ARP请求包根本无法到达B服务器,PING包就更不用说了,我让同学将这条路由删除之后A服务器就与B服务器恢复通信了,同学和我都如释重负,高兴的不得了,同学说是回来一定要请我吃饭,我当然欣然答应了。我得到了同学的感谢,还得到了自己的认可,心中充满了欢喜,真的像是打赢了一场硬仗,但我知道,我得到的远不止这些……
同学知道了原因之后,确定这次事故错不在他,便理直气壮的质问客户:为什么A服务器重启之后多了这条莫名其妙的路由呢?根据客户回忆,他们以前的确配置过该条路由,后来删除了,这个删除仅是删除内存里面的路由条目,而配置文件的路由条目依然存在,这次重启服务器,恰好给了服务器重读配置文件的机会,所以这条路由又出来了。
我们从这个案例当中可以学到什么呢?最直接的启示就是拿上简历,投奔甲方去,这样就在搞砸系统的时候,理直气壮要求乙方解决了。假如你依然还想继续当己方的话,那么就必须要好好学习wireshark了,因为wireshark实乃网络工程师居家必备的“甩锅利器”。再有经验的工程师也有犯迷糊的时候,而whireshar从来不会,它随时随地都能告诉你真相,不偏不倚。
再次体会wireshark的威力!的更多相关文章
- Wireshark数据抓包教程之安装Wireshark
Wireshark数据抓包教程之安装Wireshark 安装Wireshark 通过上一节的学习可以根据自己的操作系统来下载安装Wireshark了.本书中已开发版1.99.7(中文版)为主,下面介绍 ...
- 如何启动mininet实例上的wireshark图形界面
启动wireshark 要启动mininet实例上的wireshark的图形界面,其实关键点只有两个: 保证宿主机上安装了X11 使用ssh -Y mininet@192.168.56.102 登录进 ...
- wireshark抓取OpenFlow数据包
在写SDN控制器应用或者改写控制器源码的时候,经常需要抓包,验证网络功能,以及流表的执行结果等等,wireshark是个很好的抓包分析包的网络工具,下面简介如何用wireshark软件抓取OpenFl ...
- GNS3与抓包工具Wireshark的关联
转至:https://blog.51cto.com/xpleaf/1615145 (一)前言 本博文分享GNS3与Wireshark关联的方法. 显然现在网络上已经有类似的文章分享,而本博文旨在提供更 ...
- Haskell高阶函数
Haskell functions can take functions as parameters and return functions as return values. A function ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 软件工程(FZU2015)助教总结
本次构建之法-SE助教工作,和福州大学张老师协作,福大学生基本发挥出了一定水平,在此做个小结. 教师 张老师本身的SE教学经验足够丰富,对教学工作中的教师.助教.学生的角色定位清晰,整体节奏和安排合理 ...
- oracle笔记
一.sql*plus常用命令 (1)connect 用法:conn 用户名/密码@网络服务名[as sysdba/sysoper] 当特权用户连接时,必须带上as sysdba或是as sysoper ...
- Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
随机推荐
- ORM优化查询、choices参数
目录 ORM查询优化 only与defer select_related和prefetch_related MTV与MVC模型 choices参数 ORM查询优化 only与defer res = m ...
- Django—版本和环境的搭建
1.安装 virtualenv virtualenvwrapper [root@localhost ~]# pip install virtualenv virtualenvwrapper 2.查找 ...
- [PHP] stream_set_blocking非阻塞模式影响fgets fread函数
当设置socket为非阻塞时,fread或者fgets函数会立即返回结果,而不需要等待有输入,测试过程可以使用vscode的debug模式来进行当不设置这一项时,如果客户端没有输入会一直阻塞在这里等待 ...
- postman---postman常用的快捷键
作为一名IT程序猿,不懂一些工具的快捷方式,应该会被鄙视的吧.收集了一些Postman的快捷方式,大家一起动手操作~ 简单操作 操作 mac系统 windows系统 打开新标签 ⌘T Ctrl + T ...
- idea代码模板配置
1. 在settings中配置 配置快捷键和模板内容 输入syso然后按enter键就会自动生成代码
- 005 C/C++ 数据类型_void
1.void的字面意思是'无类型'.void * 是无类型指针,void * 可以指向任何类型的数据. 2.数据类型的分装: int InitHardEnv(void ** handle); 典型的内 ...
- 使用java代码操作Redis
1导入pom.xml依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis ...
- win7 Adobe flash player 无法在线更新
1.win7 Adobe flash player 无法在线更新,提示应用程序初始化错误 解决方法: 1.https://www.flash.cn/看一下支持的版本,网上找对应版本离线包下载安装即可 ...
- 重装windows后如何恢复mysql服务
如果重装系统后之前的mysql还在的话,可又直接恢复,不需要安装: 注意my.ini文件的位置,应该与bin目录同级: 进入cmd,然后进入你的mysql的bin目录,输入命令:mysqld inst ...
- oracle查询字段重复数据
select in_ordr_no,count(*) from t_pay_jnl group by in_ordr_no having count(*) > 按照字段in_ordr_no查询重 ...