再次体会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 ...
随机推荐
- RMAN DUPLICATE DATABASE with SET NEWNAME failed: RMAN-05501 RMAN-05517 (Doc ID 387093.1)
RMAN DUPLICATE DATABASE with SET NEWNAME failed: RMAN-05501 RMAN-05517 (Doc ID 387093.1) APPLIES TO: ...
- 记录Ubuntu下使用docker使用
关键词:docker.Dockerfile等等. 这里主要记录Ubuntu下docker使用细节. 首先是如何安装,然后如何创建docker镜像.搭建docker服务器.运行使用docker. 1. ...
- php+laravel依赖注入浅析
laravel容器包含控制反转和依赖注入,使用起来就是,先把对象bind好,需要时可以直接使用make来取就好. 通常我们的调用如下. $config = $container->make('c ...
- 【STM32H7教程】第31章 STM32H7的USART应用之RS485
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第31章 STM32H7的USART应用之RS48 ...
- linux 主机通过虚拟机(win10)上网
公司内网必须安装安全软件(exe)才可以上网,但是我的系统是deepin,用deepin-wine无法安软该exe,于是用vmware安装了win10虚拟机,通过虚拟机上网 先简单介绍下vmware以 ...
- IT兄弟连 HTML5教程 HTML5和JavaScript的关系
JavaScript可是实现HTML5重要语言.长久以来,JavaScript一直都是在HTML中实现动态效果的不二之选,而JavaScript在一些程序员眼里都是编程语言中的二等公民.早先,它经常是 ...
- IT兄弟连 Java语法教程 数组 什么是数组
数组是编程语言中最常见的一种数据结构,可用于存储多个数据,每个数组元素存放一个数据,通常可通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值.Java语言的数组则具有其特有的特征, ...
- [03-2]VS2017 创建 ASP.NET Core Web 程序
VS2017 创建 ASP.NET Core Web 程序 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开始学 ...
- Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之八 || API项目整体搭建 6.3 异步泛型仓储+依赖注入初探
本文梯子 本文3.0版本文章 回顾 1.Sqlsugar 的使用 2.修改数据连接字符串 今天要完成的浅紫色部分 一.设计仓储基类接口——IBaseRepository.cs 二.将其他的仓储接口,继 ...
- Web前端基础(3):HTML(三)
1. body中的相关标签 1.1 表格标签:table.tr.td HTML表格由<table>标签以及一个或多个<tr>.<th>或<td>标签组成 ...