wireshark抓包介绍
有99%的网络故障都是可以通过通用故障排除流程来解决的。 只有当常规手段无法查明网络故障时才抓包进行分析。 抓包分析也不是万能的,无法看出网络拓扑是怎样的,路由是怎样走的,哪根网线断了。
单机单点:
只抓本机网络数据包
单机多点:
必须有一台可管理交换机,在交换机上配置端口镜像功能,将其他端口上的流量都复制到抓包主机所连端口,这样就能在一台主机上抓去其他主机甚至全部网络流量的网络数据包
双机并行:
是在特定网络设备,比如防火墙的前 后端 各部署一个抓包主机同时抓包,然后进行比对分析,看数据包在经过特定的网络设备时,是否存在异常
wireshark常见列
Time
Time(时间)列:从第2个数据包开始,都是相对于第1个数据包的时间 时间是可以切换成绝对时间的,但建议用默认设置。
回包
这两个箭头,表示一个发包,一个回包。
数据报对应网络模型
wireshark基本操作
打开软件 选择网卡 即开始抓包,
结束抓包
再次开始抓包
wireshark常用过滤命令
https://cloud.tencent.com/developer/article/1618433 一般比较常用的就几个:
# 过滤指定ip地址 ip.addr==xxx.xxx.xxx.xxx # 过滤指定tcp端口 tcp.port=xxx # 过滤指定udp端口 udp.port==xxx 复制代码
我一般会先用具体协议过滤个大概,比如tcp、udp、ssh、ftp、icmp、ssl、http、smtp等
一、过滤协议
tcp udp arp icmp http smtp ftp dns ssl ssh
二、过滤IP ip.src eq ${IP} or ip.dst eq ${IP} # 或 ip.addr eq IP 复制代码
eq也可以用==代替 "不等于"怎么表达?测试!=不行,得用not xxyy,例如not tcp.port 3389 && not ip.addr10.135.71.54 && not tcp.port 80(tcp端口不等于3389且tcp端口不等于22且地址不等于10.135.71.54) 再比如 !ssl 或者 not ssl !(arp.src192.168.1.1) and !(arp.dst.proto_ipv4 192.168.1.243)
三、过滤端口 # 过滤tcp端口==443 tcp.port eq 443 # 过滤tcp目标端口==80 或 tcp源端口==80 tcp.dstport == 80 or tcp.srcport == 80 # 过滤udp端口==53 udp.port eq 53 复制代码
四、过滤方向
关键字 解释 src 源 dst 目的地 src and dst 源 and 目的地 src or dst 源 or 目的地 srcport 源端口 dstport 目的地端口 srcport and dstport 源端口 and 目的地端口 srcport or dstport 源端口 or 目的地端口
五、过滤http
①过滤http模式 # 过滤请求方法为HEAD的数据包 http.request.method == "HEAD" # 过滤请求方法为GET的数据包 http.request.method == "GET" # 过滤请求方法为POST的数据包 http.request.method == "POST" 复制代码
②模糊匹配字符串
http字符串过滤,这个字符串可以在Server部分,在URI部分,在域名部分等等
# 找到所有请求的路径 uri包含 xxx 的 HTTP 请求 http.request.uri contains "xxx" # 过滤包含 error 的 HTTP 请求或响应数据包 http contains "xxx" 复制代码
六、tcp stream过滤 tcp.stream eq $streamindex 复制代码
七、过滤rst
可以用这个条件找异常
# 找到所有被主机拒绝的连接请求 rst: tcp.flags.reset == 1 and tcp.ack == 0 复制代码
例如
# 找到符合ip地址条件的,所有被主机拒绝的连接请求 ip.addr==10.1.2.35 && ip.addr==115.159.131.24 && tcp.flags.reset == 1 复制代码
# 捕获多播地址和广播地址 # 捕获MAC地址最低位为1的数据包 ## 在以太网协议中,MAC地址的最低位为1时,表示该地址为多播地址或广播地址。 eth[0] & 1 复制代码
常用示例:
个人实际应用中遇到的一些分析场景。
分析DSCP值
在Wireshark中,您可以使用以下过滤器来筛选包含特定DSCP值的数据包:
其中xx是您要筛选的DSCP值。
# 显示tcp数据包,并且其IP包头的dscp值不为0 !(ip.dsfield.dscp == 0) && tcp 复制代码