对那些整天喊着“玩大的,玩狠的”口号的人来说,我下面要说的这点事儿,根本就不算事儿。所以,如果你正好喜欢喊口号,就不要往下看了,因为我要讲述的,你可能不感兴趣,也可能看不懂。

今天,是我加入I公司3个多月以来最有成就感的一天,因为打赢了一个硬仗。1个多月以前,我所在的项目小组给我分配了一个bug,  该bug可简单描述为:两张Intel 82599的万兆网卡,通过光纤背靠背连接后,彼此ping不通。从接受任务到今天,一共持续了33天,其间多次被各种杂事儿各种突发任务所打断,但总的投入时间累计起来也至少有8个工作日。直到今天,我才真正定位了这个bug的root cause(I公司称之为“根因” Orz),真是“山重水复疑无路,蓦然回首,那人却在灯火阑珊处”。 既然玩不了大的,也玩不了狠的,咱就玩点实在的吧。

1. 问题概述

应用结点Ann和存储结点Ben上各有一张Intel 82599万兆网卡(ixgbe), 网卡与网卡之间使用光纤背靠背连接。在Ann和Ben上都给网卡的Interface配置上IPv4地址,彼此无法ping通。

[Ann: Application Node]
eth1 90:e2:ba:85:fc:b8 192.168.53.100/24
eth2 90:e2:ba:85:fc:b9 192.168.54.100/24 [Ben: Storage Node]
eth1 90:e2:ba:a9:58:f0 192.168.53.110/24
eth2 90:e2:ba:a9:58:f1 192.168.54.110/24

注意: 存储结点Ben上神马工具都没有,没有vim, 没有wireshark, 没有tcpdump, 总之,你需要的一切工具都没有。但是,应用结点Ann上什么工具都可以有,只要需要,都可以自由地安装。

2. 定位过程

  • 在应用结点Ann上ping -I 192.168.53.100 192.168.53.110; 然后在Ann上使用tcpdump抓包,用wireshark查看,发现arp请求包从Ann发出,但未收到arp响应包; (令人痛苦的是,存储结点Ben上没有tcpdump,只能从应用结点Ann上单方面抓包)
  • 在Ann和Ben上手工配置arp记录,再ping, 可以相互ping通,说明网卡,光模块和光纤都没有问题,排除硬件故障;
  • 03 检查Ann和Ben上的万兆网卡驱动(ixgbe.ko), 发现Ann上的网卡驱动版本比较低,于是升级Ann的操作系统,与Ben保持一致,再ping, 还是ping不通;
  • 检查Ann和Ben上有没有SELinux设置,Ben没有,Ann有;于是关闭Ann上的SELinux设置,再ping, 还是ping不通;
  • 检查Ann和Ben上有没有防火墙firewalld, Ben没有,Ann有;于是关闭Ann上的firewall设置并重启,再ping, 还是ping不通;
  • 06 检查Ann和Ben上有没有iptables服务,Ben没有,Ann也没有;
  • 在Ann上安装dropwatch, 启动一个ping -I 192.168.53.100 192.168.53.110; 然后启动dropwatch, 发现有丢包,而且是与arp错误密切相关,但是丢包原因不清楚;
  • 坐下来研读ARP协议(RFC826) (耗时1个周末);
  • 使用arping从Ben上向Ann发出arping, 成功;再使用arping从Ann上向Ben发出arping, 失败;好了,于是可以90%确定为是存储结点Ben的问题;
  • 在存储结点Ben上查看arptables服务,发现正在运行,再使用arptables -L查看规则,发现了4条DROP的规则,与Ben上的82599网卡对应的网络接口正好对应,于是99%确定为存储结点Ben的问题;
  • 在存储结点Ben上搜索源代码,找到root cause,原来是存储软件在启动的时候,发现82599网卡对应的网络接口(eth1, eth2)并没有配置IPv4地址,于是设置ARP规则将eth1, eth2的inbound和outbound的ARP包都通通drop掉,因此,从应用结点Ann上发出arp请求广播包,没有收到arp响应包就很好理解了 -- Ann发出去的arp请求包之所以石沉大海,是因为被Ben设置的ARP规则给drop掉了。

说明:

  • 其实离root cause很近了,但是当时不知道使用arping进行错误定位, 所以与成功擦肩而过;
  • 02 排除了可能存在的硬件故障问题,为完全转向查找软件问题给出了理论依据;
  • 03-06 其实是病急乱投医,属于神农尝百草的做法,对最后成功定位帮助不大;
  • 07 将注意力重新吸引到定位可能存在的ARP问题,本质上是回归到, 功不可没;
  • 所谓“磨刀不误砍柴工”,让我坚定了在时候所做的猜测,一定是ARP问题。相对于实践,理论基础更重要;
  • “差异化”是找出问题所在的关键,100次没有差异的ping操作抵不过1次有差异的arping操作, 成功就在眼前;
  • 10 进一步求证,找出ARP包被DROP的证据,到达成功的彼岸只有一步之遥,但很多时候,这一步很难跨越;
  • 没有代码证据,所有的猜测只是猜测而已,“Read The F*cking Source Code”才是王道。

3. 总结陈词

对于枯燥乏味的bugfix来说,最艰难的部分就是错误定位。那些只会搞硬件不会搞软件擅长于喊口号拉标语的人,永远也无法体会其中的艰辛和快乐。这就好比踢足球,进球是最让人振奋的事情,但在进球之前,大多是冗长艰难的奔跑和拼抢。成功定位上面所述问题的root cause,对我来说意义重大(满满的成就感),因为完全是从零开始摸索,在黑暗中前行,没有任何既有的经验可用。这需要坚韧不拔,需要百折不挠,非智力因素才是到达成功彼岸的关键。 当然,能找到最后的root cause, 也离不开同事和朋友的帮助与点化,在此对Zrf, Lmx, Yyg三位老师和Wjq兄弟表示由衷的感谢!

后记: 找到bug的root cause后,最后的解决方案异常简单,一行代码都没有改,因为不用做任何修改。原因是通过GUI管理界面,给存储结点Ben上的82599网卡的网络接口配置上IPv4地址后,存储软件系统会自动修改arptables里的ARP规则,而且修改后的ARP规则正是我们所期望的。那么问题就来了,当初这个bug是怎么报出来滴?遗憾的是,bug filer并没有把具体的重现步骤记录在案,那就没有办法回溯了。因此,对测试工程师来说,不懂具体的技术不要紧,但是把发现bug的具体步骤记录清楚无疑是最重要的基本功。于此同时,对开发工程师来说,拿到一个bug,搞清楚bug的重现步骤则是最关键的,不然很可能是在浪费时间做艰难的长途跋涉。这也给我的职业生涯上了很重要的一课,发人深省,值得好好反思和引以为鉴。

Intel万兆网卡背靠背连接ping不通那点事儿的更多相关文章

  1. SecureCRT连接虚拟机失败及虚拟机ping不通外网

    背景: VMware上安装了centos,从学校的网络换到了家里后,用SecureCRT登录时发现 connection closed,然后在虚拟机里发现ping不通外网了,ping虚拟机IP是通的. ...

  2. 虚拟机和主机ping不通,SQL Server无法远程连接的解决方法

    一.虚拟机网络的配置 这里只列一下自己的配置: 1.编辑---虚拟网络编辑器 进行设置 2.设置对应系统 3.还是Ping不通,最后关闭 虚机内的Windows防火墙,可以Ping通,看来Net模式下 ...

  3. 【教程】虚拟机安装CentOS 7 ping不通百度/并且使用Xshell 连接

    最近需要在电脑虚拟机上安装CentOS 7 ,之前对虚拟机并不熟悉,捅咕了两天时间,如果终于安装成功. 之前遇到的坑:安装完CentOS 7 之后一直ping 不通www.baidu.com 网上查询 ...

  4. rhel8/centos8网络网卡设置ping不通,连接不上,各种问题

    [解决问题]: 1-ping不通宿主机 2-ping不通外网 3-ping不通网关 4-网络中心VMnet8 VMnet1 VMnet0 不见了 5-rhel8网络设置全攻略 环境:win10宿主机+ ...

  5. 远程连接阿里云服务器ping不通ip解决方案

    搭建了阿里云服务器,发现本地ping不通,查看半天才发现,原来是在阿里云上的安全组少了些东西.  在出入方向上新建一个安全组,就可以搞定了.

  6. 无法连接linux虚拟机,ping不通

    尝试过多种方式,动态ip静态ip来回改,完了还是不好使,ping不通,请求不到主机. 如果使用桥接模式,当前虚拟机ip设置的和本地ip一样,会导致本地网络断开. 最后的解决方式是在vmware中,点击 ...

  7. cnentos中进行bond网卡配置,一切配置无问题,就是ping不通宿主机

    服务器网口绑定   1. ifcfg-bond0   DEVICE=bond0 ONBOOT=yes IPADDR=192.168.100.64 NETMASK=255.255.255.0   2. ...

  8. 解决内网主机ping不通网关能ping内网

    有一台笔记本电脑可以自动获取IP,可以和内网其他主机互相PING通,就是PING 不通网关,只能上内网,不能上外网,IP换到其他主机上也可以上外网,说明路由器上没什么限制.路由器也查了,电脑也重装了, ...

  9. 开发板ping不通主机和虚拟机的看过来(转载)!

    前几天在做uboot下用tftp下载文件到开发板的实验时,为了能解决开发板ping不通主机和虚拟机的问题,可谓绞尽脑汁,正所谓久病成医,虽然为了这一小问题废了我那么长时间,但我在解决问题的同时也学到了 ...

随机推荐

  1. 咏南中间件+开发框架支持最新的DELPHI 10.2 TOKYO

    咏南中间件+开发框架支持最新的DELPHI 10.2 TOKYO 价格十分优惠.有意者请向本人索取演示程序! 你只需花一套中间件的价格,就可获得:中间件,CS开发框架一套(赠送),BS开发框架一套(赠 ...

  2. Android工具类整合

    Android-JSONUtil工具类 常用的Json工具类,包含Json转换成实体.实体转json字符串.list集合转换成json.数组转换成json public class JSONUtil ...

  3. web项目开发最佳做法

    一个成熟的web项目应该具备以下基础代码或做法 1.前端基础框架: 统一的ajax 通信/表单提交及调用结果弹窗显示 统一的数据验证 统一的数据列表 2.后端基础框架: 统一的异常处理捕获,可针对具体 ...

  4. Android 属性动画实现一个简单的PopupWindow

    1.今天看到一个PopupWindow的效果如图: 2.其实就是属性动画的一个简单实用就ObjectAnimator就可以的,想实现更多,更灵活的可以用ValueAnimator 3.直接上代码: p ...

  5. php 命令行脚本运行php文件简单演示

    众说周知,php在web服务器领域有着很重要的角色,可是它不仅仅在web领域,只是在web领域表现更为优秀! 它基本有三种用途: web服务端脚本的编写 应用程序图形界面(类似windows自带的计算 ...

  6. iOS 优秀开源项目

    1. 界面 iCarousel: 用来做图片旋转显示效果(相册). MZTimerLabel:用来制作一个计时并显示时间的 label. MSDynamicsDrawerViewController, ...

  7. 2018-2019 20165219 网络对抗 Exp5 MSF基础

    实验内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如ms08_067; (1分) 1.2 一个针对浏览器的攻击,如ms ...

  8. Java-File类获取目录下文件名-遍历目录file.listFiles

    package com.hxzy.IOSer;import java.io.*;/*File 类获取功能 * List * ListFile * */public class Demo06 { pub ...

  9. linux 下的 crontab 定时任务工具

    以下内容转自:https://www.cnblogs.com/longjshz/p/5779215.html 在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep c ...

  10. 渗透日常之 花式实战助你理解CSRF

    本文作者:i春秋签约作家——onls辜釉 最近比较忙,很久没发文章了,Onls本就只是一个安全爱好者,工作也不是安全相关.以往的文章也更像是利用简单漏洞的“即兴把玩”,更多的是偏向趣味性,给大家增加点 ...