今天一位同学给我打电话,说是重启了客户机房里的一台服务器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的威力!的更多相关文章

  1. Wireshark数据抓包教程之安装Wireshark

    Wireshark数据抓包教程之安装Wireshark 安装Wireshark 通过上一节的学习可以根据自己的操作系统来下载安装Wireshark了.本书中已开发版1.99.7(中文版)为主,下面介绍 ...

  2. 如何启动mininet实例上的wireshark图形界面

    启动wireshark 要启动mininet实例上的wireshark的图形界面,其实关键点只有两个: 保证宿主机上安装了X11 使用ssh -Y mininet@192.168.56.102 登录进 ...

  3. wireshark抓取OpenFlow数据包

    在写SDN控制器应用或者改写控制器源码的时候,经常需要抓包,验证网络功能,以及流表的执行结果等等,wireshark是个很好的抓包分析包的网络工具,下面简介如何用wireshark软件抓取OpenFl ...

  4. GNS3与抓包工具Wireshark的关联

    转至:https://blog.51cto.com/xpleaf/1615145 (一)前言 本博文分享GNS3与Wireshark关联的方法. 显然现在网络上已经有类似的文章分享,而本博文旨在提供更 ...

  5. Haskell高阶函数

    Haskell functions can take functions as parameters and return functions as return values. A function ...

  6. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  7. 软件工程(FZU2015)助教总结

    本次构建之法-SE助教工作,和福州大学张老师协作,福大学生基本发挥出了一定水平,在此做个小结. 教师 张老师本身的SE教学经验足够丰富,对教学工作中的教师.助教.学生的角色定位清晰,整体节奏和安排合理 ...

  8. oracle笔记

    一.sql*plus常用命令 (1)connect 用法:conn 用户名/密码@网络服务名[as sysdba/sysoper] 当特权用户连接时,必须带上as sysdba或是as sysoper ...

  9. Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

随机推荐

  1. Linux系统学习 六、网络基础—Linux的IP地址的配置

    1.ifconfig命令临时配置IP地址 2.setup工具永久配置IP地址 3.修改网络配置文件 4.图形界面配置IP地址 ifconfig命令临时配置IP地址 主要的作用是查看网络信息,也可以临时 ...

  2. s3c2440裸机-时钟编程(一、2440时钟体系介绍)

    1.总线框架 下图是2440的总线框架,其中有AHB(Advanced High performance Bus)高速总线,APB(Advanced Peripheral Bus)外围总线. 不同总线 ...

  3. MATLAB实例:将批量的图片保存为.mat文件

    MATLAB实例:将批量的图片保存为.mat文件 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.彩色图片 图片数据:horse.rar 1. MA ...

  4. AcWing 13. 找出数组中重复的数字

    习题地址 https://www.acwing.com/solution/acwing/content/2919/. 题目描述给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 ...

  5. LG3825/BZOJ4945/LOJ2305 「NOI2017」游戏 dfs+2-SAT

    问题描述 LG3825 BZOJ4945 LOJ2305 题解 发现对于每个地图,如果没有\(A,B,C\)地图不可以使用\(a,b,c\),就是一个\(\mathrm{3-SAT}\)问题. 有了这 ...

  6. Go module的两个代理源和设置方法

    Go module的两个代理源 阿里云 https://mirrors.aliyun.com/goproxy/ 使用帮助 1.使用go1.11以上版本并开启go module机制 2.导出GOPROX ...

  7. 请不要嘲笑你身边那些投了P2P的朋友

    在这方面我是非常谨慎的,但依然逃脱不了翻车的命运 这段时间曾经无数大V强烈推荐的懒投资出现大面积逾期,又把这个行业推上了风口浪尖,这里讲一讲我的故事 对于大多数人的理财投资可能是从2013年余额宝的推 ...

  8. OpenvSwitch系列之五 网桥特性功能配置

    Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl命令使用 Open vSwit ...

  9. iOS: 本地通知的前后变化(iOS10)

    一.介绍  通知和推送是应用程序中很重要的组成部分.本地通知可以为应用程序注册一些定时任务,例如闹钟.定时提醒等.远程推送则更强大,提供了一种通过服务端主动推送消息到客户端的方式,服务端可以更加灵活地 ...

  10. C#读取匿名对象的属性值的方法总结

    目录 1.通过反射的方式获取属性值 2.新建个扩展方法,将object转成对应的匿名对象 通过new出匿名对象,可以直接调用该匿名对象的属性名,获取属性值. var objUser = new {Na ...