Wireshark

9 10月

一. 简介

Wireshark是基于winpack的可视化界面工具,适合网络工程师或运维使用,对非网络工程师或非运维的同学来说(例如前端)绝大多数的功能都是用不到的,不如Charles简洁。

与Charles的区别:Charles专注于应用层(http),而Wireshark可以捕获自底向上的物理层 → 数据链路层 → 网络层 → 传输层 → 应用层的所有数据。所以纯功能上看,和从数据的丰富维度上看,Charles只是Wireshark的子集。

二. 开始抓包

Capture -> Options 里面分三部分:输入,输出,选项

2.1 输入

主要用于选定哪个流量口,并设置流量过滤条件

上图输入面板中的过滤器是【捕获过滤器】,顾名思义,可以写表达式来捕获想要的流量。

使用过滤是非常重要的, 初学者使用wireshark时,将会得到大量的冗余信息,在几千甚至几万条记录中,以至于很难找到自己需要的部分。搞得晕头转向。可以用捕获过滤器过滤掉大量冗余报文。

  • 表达式由若干限定词组成:
    • Type:流量类型,包括 host,port,portrange,net(设定子网)。不指定的话默认值为 host。
      • 例如:【host www.baidu.com】表示只捕获出主机名是百度的流量
      • 例如:【net 192.168.0.0 mask 255.255.255.0】表示捕获相应 IP 和 子网掩码的流量
    • Dir:流量方向,包括 src,dst,不指定就捕获所有方向的流量。例如:【dst port 80】表示只捕获目标端口为 80 的流量
    • Proto:流量协议,包括 ether,fddi,ip,arp,rarp,decnet,lat,sca,moprc,mopdl,tcp,udp,不指定就捕获所有协议的流量。例如:【udp】表示只捕获 udp 协议的流量
    • 其他:gateway 指定网关 IP,broadcast 广播报文,multicast 多播报文,less / greater 小于/大于
  • 表达式间可以用运算符链接:
    • 与:&&and
    • 或:||or
    • 非:!not

更多例子

2.2 输出

主要用于将抓包数据保存到本地。

2.3 选项

一些吓唬人用的高阶选项

三. 显示面板

3.1 工具栏

3.2 显示过滤器

使用过滤是非常重要的, 初学者使用wireshark时,将会得到大量的冗余信息,在几千甚至几万条记录中,以至于很难找到自己需要的部分。搞得晕头转向。可以用显示过滤器过滤掉大量冗余报文。

属性名:可以在【菜单 View -> Internals -> Supported Protocols】支持的协议名中查到

操作符:

英语 符号 示例
eq == ip.src == 172.0.0.1
ne != ip.src != 172.0.0.1
gt > frame.len > 10
lt < frame.len < 128
ge >= frame.len >= 0x100
le <= frame.len <= 0x20
contains sip.To.contains “a1762”
match ~ 正则:host matches “baidu\.(com|net)”
bitwise_and & 位操作:tcp.flags & 0x02
and && 与:ip.src == 10.0.0.5 && tcp.flags.fin
or ||
xor ^^ 异或
not !
[n-m] 切片:n起始偏移量,mz终止偏移量
例:eth.src[1-2] == 00:83
[n:m] 切片:n起始偏移量,m长度
例:eth.src[0:3] == 00:00:83
[n:] 等价于[n:end],表示从n起始偏移量到字段结尾
例:eth.src[4:] == 20:20
[:m] 等价于 [0:m],表示从0开始切m长度
例:eth.src[:3] 等价于 eth.src[0:3]
[n] 等价于 [n:1],表示取从n起始偏移量的一个字节
例:eth.src[2] == 83
[,] 用逗号分隔时,允许以上切片同时存在
例:eth.src[0:3,1-2,:4,4:,2] == 00:00:83:00:83:00:00:83:00:20:20:83
in 集合:tcp.port in {443 4430…4434} 等价于 tcp.port == 443 || (tcp.port >= 4430 && tcp.port <= 4434)

如果觉得自己写起来太麻烦,可以用可视化的表达式界面:

常用过滤:

http.host contains xxx.com   // 显示某域名的报文

http.request.uri == "/online/setpoint"  // 显示请求url中包含某字符串的报文

http.request.method == "POST"   // 只显示POST请求的报文

http.content_type == "text/html"  // 显示某类型的报文

http.response.code == 302  // 显示status code为302的报文

http.response == 1         // 显示所有相应包

http.cookie contains guid	 // 显示cookie里有guid的报文

ip.src == 192.168.1.102 or ip.dst == 192.168.1.102   // 源地址为192.168.1.102,或目标地址为192.168.1.102的报文

tcp.port ==80      // 端口为80的报文

tcp.srcport == 80  // 源端口为80的

更多过滤项设置,可以百度,例如:官方手册CaptureFilters

3.3 报文面板入

No:编号前可能会有标记符号,参照这里

Time:时间默认是相对时间,即从启动抓包开始的时间。如果要看绝对时间可以在【菜单 View -> Time Display Format】改。

如果不想从启动抓包开始计时,而是要从某个报文开始计时,例如从访问站点的第一次握手请求开始计时,可以面板上选中报文,右键选中【Set/Unset Time Reference】,这样就会从该条报文开始计时,后面的报文时间会全部调整。

Protocol:报文的协议,因为默认是按时间排序看着不方便,可以右键报文【Follow】追踪TCP,UDP,SSL,HTTP流

3.4 包详情面板

单条报文的详情:

Frame:物理层的数据帧概况

Ethernet II:数据链路层以太网帧头部信息

Internet Protocol Version 4:网络层IPv4数据

Transmission Control Protocol:传输层的数据,此处是TCP

Hypertext Transfer Protocol:应用层的信息,此处是HTTP

例如:IP报文

例如:TCP报文

四. 案例

4.1 Tcp 3次握手:

例如访问:http://xxx.com/xxx/

过滤出http请求,右键 Follow -> TCP Stream

TCP三次握手建立连接:syn -> syn,ack -> ack

五. 抓取移动端包

需要在在操作系统上打开 wifi 热点,移动端(通常是手机)连接wifi 热点,Wireshark抓包时选择 wifi 热点对应的接口设备抓包即可。参照这里

六. 更多功能

wireshark无所不能,但这些功能日常工作中不常被使用,知道一下即可。

6.1 统计工具

协议占比:【Statistics -> Protocol Hierarchy】统计通信流量中不同协议占用的百分比

IO图表:【Statistics -> IO Graph】对网络流量进行图形化展示,了解网络的峰值和波动情况。可自定义过滤条件,勾选后即可实时显示。

各种协议统计

常用的【Statistics -> HTTP -> Requests】统计:看主机请求访问Web站点的分布情况,以及所访问的Web站点的具体资源。

发表评论

电子邮件地址不会被公开。 必填项已用*标注