抓包工具使用
注:下文就一个普通网工使用wireshark分析网络质量、故障等而言常用的场景说明,协助个人如何判断网络问题。你不需要点开每个数据包查看具体字段,只需要大概看一下判断原因,就个人工作经验总结,可能并不完整,后续慢慢补充。
(一)、软件界面说明调整
1.1 流量获取
流量可以来自你本地自己的网卡,也可以来自网络设备的端口镜像,或者来自其它网络设备保存下来的流量导入分析。
1.2 界面说明
wireshark会根据自身附带的着色规则把常见类型数据包着色成不同的颜色,着色规则也可自行定义规则,但依我个人而言系统自带的着色规则已经满足个人需求,不建议修改,需要注意的是一般越是醒目的颜色就越值得被你关注,可根据下方表格理解大概含义。
序号 | 规则 | 含义 |
---|---|---|
1 | Bad TCP | TCP解析出错,即重传,乱序,丢包,重复响应都在此条规则的范围内。 |
2 | HSRP State Change | 热备份路由协议(Hot Standby Router Protocol),这条规则表示状态非active和standby。 |
3 | Spanning Tree Topology Change | 生成树协议的状态标记为0x80,生成树拓扑发生变化。 |
4 | OSPF State Change | OSPF(Open Shortest Path First,开放式最短路径优先协议)的msg类型不是hello。 |
5 | ICMP errors | ICMP协议错误,协议的type字段值错误。 |
6 | ARP | ARP协议。 |
7 | ICMP | icmp协议。 |
8 | TCP RST | TCP流被RESET(重置)。 |
9 | SCTP ABORT | 串流控制协议的chunk_type为ABORT(6)。 |
10 | TTL low or unexpected | TTL异常。 |
11 | Checksum Errors | 条件中的各类协议的checksum异常,在PC上抓包时网卡的一些设置经常会使Wireshark显示此错误。 |
12 | SMB | Server Message Block类协议。 |
13 | HTTP | HTTP协议,这是很简陋的识别方法。 |
14 | DCERPC | 分散式运算环境/远端过程调用(Distributed Computing Environment / Remote Procedure Calls)协议。 |
15 | Routing | 路由类协议 |
16 | TCP SYN/FIN | TCP连接的起始和关闭。 |
17 | TCP | TCP协议。 |
18 | UDP | UDP协议。 |
19 | Broadcast | 广播数据。 |
20 | System Event | 系统事件。 |
1.3 流量过滤
流量获取之后就是需要从中检索出自己关注的流量包,依我个人工作经验而言,就我们普通网工来说我们网络中一般就关注IP、端口、协议这三个信息,wireshark附带很多其它额外的过滤规则,如http请求方式、请求url等等,这里就IP、端口、协议来总结常用过滤语句.
不带方向过滤
过滤语句 | 作用 |
---|---|
tcp、udp、arp、icmp、http、smtp、ftp、dns、ssl、ssh | 过滤协议。 |
ip.addr eq <IP地址> | 过滤IP地址。 |
tcp.port eq <端口号> | 过滤指定端口。 |
tcp.stream eq |
用于锁定某个TCP会话,过滤出会话的所有流量。 |
ip.addr in | 过滤{}里面的内容,也可以写端口,他们是or 的关系. |
tcp.stream eq
如上图,我这里有个连接重置的数据包,假设我要观察它所在会话从头到尾的所有数据包,我就可以通过索引的数字筛选:
筛选之后可以看到从三次握手开始,一直到了会话断开(连接重置)。
带方向性过滤
过滤语句 | 作用 |
---|---|
tcp.srcport eq <源端口号> | 过滤源端口。 |
tcp.dstport eq <目标端口号> | 过滤目标端口。 |
ip.src eq <源IP> | 过滤源IP。 |
ip.dst eq <目标IP> | 过滤目的IP。 |
ip.src eq <源IP> and tcp.srcport eq <源端口号> and ip.dst eq <目标IP> and ip.dst eq <目标IP> | 组合使用。 |
正常情况下更多时候你是用它来判断两个设备之间通讯是否正常,由于客户端的端口它是随机的,而服务端ip是固定的,所以经常用到的过滤语句百分之八九十也就是:
ip.addr eq <客户端地址> and ip.addr eq <服务端IP> and tcp.port eq <服务端端口>
(二)、异常数据包辨别
2.1 专家信息
过滤出关键流量之后就需要判断是否存在异常数据包,wireshark也携带了一个辅助功能专家信息
,它会帮助你统计出异常数据包的个数,可以有效帮助你评估网络质量,你可以在菜单栏分析(A)-->专家信息
中找到它。它会按照Waring(警告)、Note(注意)、Chat(提示)帮你罗列出数据包,摘要部分可使用翻译工具翻译具体内容。
2.2 丢包乱序
注:以下数据包是平时捕捉到的常见的异常的数据包,你在网络中能捕捉到这类流量并不代表网络中就存在异常,可以关注的是数据包如果出现的次数过多,有可能就证明网络质量(延迟高、速率慢、拥塞等)有问题,下面已经附带了筛选该类流量的过滤语句。而需要着重关注的是最后一个
连接重置
,它虽然不一定百分之百证明网络存在连通性问题,但又概率存在该问题,下文有对应说明。
①、丢包或乱序:
· [TCP Previous segment not captured]:在 TCP 发送端传输过程中,该 Seq 前的报文缺失了。一般在网络拥塞的情况下,造成 TCP 报文乱序、丢包时,会出现该标志。需要注意的是,[TCP Previous segment not captured] 解析文字是 wireshark 添加的标记,并非 TCP 报文内容。
tcp.analysis.lost_segment
· [TCP Out-Of-Order]:(报文乱序)表示在 TCP 流中,数据包到达的顺序与发送的顺序不一致,即TCP发送端传输过程中报文乱序了。具体原因可能包括网络拥塞、路由变化、负载均衡、硬件或软件问题。
tcp.analysis.out_of_order
· [TCP dup ack XXX#X]:(重复确认)表示第几次重新请求某一个包,#前XXX表示第几个包,#后的X表示第几次请求。具体原因可能包括网络拥塞、丢包、乱序。
tcp.analysis.duplicate_ack
②、重传
· [TCP Fast Retransmission]:(快速重传)一般快速重传算法在收到三次冗余的Ack,即三次[TCP dup ack XXX#X]后,发送端进行快速重传。
tcp.analysis.fast_retransmission
· [TCP Retransmission]:(超时重传)如果一个包的丢了,又没有后续包可以在接收方触发[Dup Ack],或者[Dup Ack]也丢失的情况下,TCP会触发超时重传机制。
tcp.analysis.retransmission
③、滑动窗口
· [TCP ZeroWindow]:(零窗口)作为接收方
发出现的标志,表示接收缓冲区已经满了
,假设接收方处理数据的速度跟不上接收数据的速度,缓存就会被占满,从而导致接收窗口为 0,当发送方接收到零窗口通知时,就会停止发送数据。wireshark 会打上[TCP ZeroWindow]标签。
tcp.analysis.zero_window
· [TCP window update]:(更新 TCP 窗口)当接收端接收窗口大小发生变化,可以接收数据了,则有该标志。接收方消耗缓冲数据后,更新TCP窗口,可以看到从win=0逐渐变大,这时wireshark会打上[TCP window update]标签。
tcp.window_update
· [TCP window Full]:(TCP窗口满)作为发送方的标识,当前发送包的大小已经超过了接收端窗口大小,wireshark 会打上此标识,标识不能再发送。
tcp.analysis.window_full
滑动串口概念不再介绍,可以比喻成ETC通道,数据传输可以理解过程可以比喻成假设有需求:需要从某地运送N辆汽车到另一个地方,这些车需要走当地的ETC,ETC一般有多个窗口,这个ETC窗口可以理解成这里的滑动窗口,而汽车的车牌又可以理解成ACK(确认号),当某辆汽车未按照规定抵达终点,它就会要求重新发送该车辆,而当另一端ETC窗口拥堵时它这边也会调整减少这段发车的速度等等,保证车辆有序完整的运输到对端。
④、连接重置
常见RST介绍
RST(Reset)重建连接标识。当RST=1时,表明TCP连接中出现严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接。常见的RST情况包括:
- 端口未打开:服务器程序端口未打开而客户端来连接。这种情况下,去telnet一个未打开的TCP的端口可能会出现这种错误。
- 请求超时:查看2次包的时间间隔,如果时间过长,可能会引发请求超时的判断。
- 服务端关闭的socket:当服务端关闭了一个socket连接时,会发送RST包给客户端。
- 防火墙拒绝请求:防火墙可能会拒绝某些连接请求,导致连接被重置。
- 移动链路问题:在移动网络下,国内是有5分钟后就回收信令的限制。如果心跳>5分钟后服务器再给客户端发消息,就会收到RST。
- 负载等设备问题:负载设备需要维护连接转发策略,长时间无流量,连接也会被清除,而且很多都不告诉两层机器,新的包过来时才通告RST。Apple push服务也有这个问题,而且是不可预期的偶发性连接被RST;RST前第一个消息write是成功的,而第二条写才会告诉你连接被重置。
tcp.flags.reset eq 1
(三)、常见应用分析场景
3.1 连通性分析
往往有可能会存在那种情况,我们网络测试连通性正常(ping得通),但是指定的端口不通或者说telnet端口能通,但是它的业务不能正常访问,此时你就可以在对应设备(服务端、客户端或者你知道中途流量经过的设备)上抓包,抓包过程使用客户端访问业务(保证能获取到异常的流量包),然后导入wireshark做检查,比如下面:
我的服务端(10.1.1.6)并未监听123端口,我通过客户端(10.1.1.1)telnet服务端的端口时由于端口未监听,这里注意上面说到的方向性,客户端尝试了几次服务端均回复RTS
,像这种情况我们就可以定位是服务端端口有异常。
还有一种工作中可能遇到的症状这里无法还原,就是那种中间过了好几个设备,当你telnet测试端口的时候是正常的,但是对应的业务未能正常访问,这里我做个人认为可能原因判断,telnet端口通那说明TCP可以正常握手,但是业务访问异常,可能是途中经过了某个安全设备,它可能带有安全检查的防护功能,TCP连接之后程序交互数据被它认定存在安全隐患,自动帮你阻断了对话,导致你抓取到了RST数据包,要排除该可能就要跳过中间安全设备想办法让客户端和服务端直连,再进行测试。也有可能存在另一种情况,就是两端设备通信时TCP连接之后进入程序交互过程,交互过程中在某个阶段出现了异常,导致协商失败,一端重置了连接,这时候你只需按照先前说的根据数据包判断方向,到底是哪一边重置了连接,和相关人员反馈得清除就可以。
3.2 业务网络结构判断
场景描述:当你清除一个业务系统中服务器或者设备IP,但是你不知道该业务系统运转过程中它使用了哪些端口,以下方法可以帮你有效判断出它通信过程中有哪些端口进行了交互,便于你优化边界安全设备规则或者说定义规则的时候更加细化。该功能使用方法:
第一步还是需要保证你要捕获到流量必须含盖业务系统的流量,你可以还是按照老办法,有可能业务系统中不止一个设备参与保障了业务工作,因此你要挑一处全部流量的必经之路下手,配置镜像至你的电脑上来分析,抓包过程要保证业务正常运转,保证需要交互的流量都被触发。
wireshark分析功能如下:
菜单栏-->统计(S)-->IPv4 Statistics -->Distinations and Ports
,字面意思就是它是用来统计端口分布的。
比如我这里,我的服务器(10.1.1.6)上有ssh、http、https、ftp这几个业务,抓包过程中我在客户端(10.1.1.1)把业务都访问个遍:
然后我我通过工具统计端口分布(需要输入过滤语):
我就精准的得到了服务器上哪些端口提供了服务。
当然我这里举得例子可能比较粗糙,像表达的是当有一个复杂的业务系统,可能有C/S架构和B/S架构都有,系统的设备跨网络进行了传输,而你这时候需要在边界设备上做最小化限制,你就可以使用该功能分析得到业务跨网络进行交互用到了哪些端口。
3.3 C/S架构程序抓包
C/S一般你直接打开使用,但是数据交互的的过程你可能没关注,你不知道那个程序进行了什么连接,你也不知道你上面的数据它发到了什么地方去,但是有可能客户的某个程序可能存在问题,有可能也需要用到网络分析,如下我就电脑上的微信为例举例说明:
① 找到程序在系统中的进程号:
先在任务管理器中查看程序名称
在用tasklist命令查找到进程PID,这里为9640,下面还有还几个是因为你的微信启动了小程序、公众号等其它程序:
② 这样你就找到了网络连接信息,第一列是协议,第二列是本地IP和端口,第三列是连接的服务器地址和端口,第三列是状态,状态为ESTABLISHED表示建立连接,LISTENING则表示监听状态,所以这里就是微信连接的服务器地址:
③ 找到关键信息之后你就可以抓取网卡流量,然后过滤上面的连接信息,这时候你尝试发送微信给别人,没发送一次这里就会多出几个数据包。
数据包标识的PSH意思就是:标识接收方应该尽快将这个报文段交给应用层。接收到PSH = 1的TCP报文段,应尽快的交付接收应用进程,而不再等待整个缓存都填满了后再向上交付。查找其它程序也是案例照搬,该功能可能不仅对分析某个程序的网络有用,也可能对分析不明软件(疑似病毒)等程序网络交互有所帮助,前提是你要能找得着它。
(四)补充
wireshark还附带了许多其它的功能需要探索,掌握它的方方面面实属不易,也不推荐,能够用它来解决日常工作问题才是重要关系。下面仅对我了解到的功能做其它拓展,可作为了解内容。
4.1 流追踪
该功能用于追踪未加密的会话会很管用,比如这里追踪telnet、http和未配置证书和私钥加密的ftp也是同样能直接看到通信过程,捕获敏感信息,这里只是想警戒大家加强安全意识,注意防护该类不安全的传输协议:
4.2 解析IP地理信息
wireshark可以借助Geolite地址库进行IP定位、地图分布可视化,前提是你要先下载Geolite地址库并引用:
在世界地图中呈现:
4.3 网络I/O图表
它可以帮助你观察数据包、TCP错误数据包在不通时间段内的占比关系。