希沃ENOW大前端
公司官网:CVTE(广州视源股份)
团队:CVTE旗下未来教育希沃软件平台中心enow团队
本文作者:
前言
现在有一些的前端项目都会走一层 Node 转发,浏览器只能看到 Web => Node 的请求,当我们需要看 Node => Server 的请求时,或者在一些其它比较复杂的场景下,就可以用到抓包啦。今天就向大家介绍我工作中常用的抓包工具,用于抓取 PC 端,Linux 和 移动端的数据包。
通过阅读本文你可以学习到:
- Wireshark: 一般用于抓取 PC 端上的包,Windows 和 Mac 都可用
- tcpdump: Linux自带命令行工具,主要用于服务端抓包
- whistle: 一个轻量的代理服务器,可用于移动端、PC抓包
Wireshark
Wireshark是世界上最流行的网络分析工具。这个强大的工具可以捕捉网络中的数据,并为用户提供关于网络和上层协议的各种信息。
首先下载安装 Wireshark,Wireshark 会将所有通过网卡的数据包都抓取下来,所以在打开之后就要选取我们即将要抓的数据包所经过的网卡,主要分为两种情况:
- 请求本地 Server,选择 Loopback 环回网卡
- 请求远端 Server,根据接入网络的方式选择 USB 10/100/1000 LAN(网线)或 Wi-Fi
在选择好网卡后,就可以开始抓包啦,看着数据包不断的滚动,你肯定会想,这么多数据包,我怎么才能找到我想要的呢?这个时候就轮到 filter 登场了。
#IP过滤: 过滤目标IP以及源IP
ip.dst == 192.168.0.1 # dst表示请求的目标IP,src表示发出请求的IP
ip.src == 127.0.0.1
#端口过滤:
tcp.port == 80 # 过滤所有80端口
tcp.dstport == 80 # 目标80端口
tcp.srcport == 80 # 源80端口
#请求方式过滤:
http.request.method == "GET"
http.request.method == "POST"
#逻辑运算: and,or,nor
ip.dst == 192.168.0.1 and tcp.port == 80
ip.dst == 192.168.0.1 or http.request.method == "GET"
tcp.dstport < 8080 and tcp.dstport >80 # 目标端口范围在80-8080内
上面就是一些基本的过滤规则,在掌握这些规则的情况下其实 Wireshark 还是没那么好用,难不成我们在抓 xxx.com
的包之前,还要去 ping xxx.com
拿到 IP 之后再干活吗,这样也太麻烦了吧。这个时候就可以祭出终极大杀器 frame contains "xxx.com" 了,可以直接过滤 xxx.com 的所有请求,配合上面的规则便可以快速的找到想要的包了。找到相应的包之后点击右键,选择Follow -> TCP Stream就可以愉快查看包内数据了。
frame contains "baidu.com" and ip.src == "127.0.1"
frame contains "baidu.com" and http.request.method == "POST"
PS: 上述的步骤只能抓到 HTTP 的包,如果需要抓 HTTPS 的包,则需要额外配置证书。
tcpdump
在 Mac 或 Windows 上开发的时候,我们可以借助各种可视化工具进行抓包,但是有时候避免不了需要在服务器上抓包,这个时候使用命令行工具是更优的选择。
tcpdump的用法如:tcpdump [option] [expression]
,option 实在是太多了,这里只列举几个常用的:
- -i: 选择需要抓包的网卡,默认是所有网卡
- -A: 以ASCII码的方式显示每个数据包,可方便的查看数据
- -nn: 不把ip转化成域名,不把协议和端口号转化成名字,速度会快很多
- -w: 将抓到的数据包写入硬盘,之后可用 Wireshark 查看
使用 tcpdump 抓包其实和写 Wireshark 的 filter 有点类似,通过组合各种参数来匹配到我们想要的数据包。下方是一些基本的 expression:
#IP过滤: 过滤目标IP以及源IP
tcpdump dst host 192.168.0.1
tcpdump src host 127.0.0.1
#端口过滤:
tcpdump port 80 # 过滤所有80端口
tcpdump dst port 80 # 目标80端口
tcpdump src port 80 # 源80端口
tcpdump src portrange 80-8080 # 目标端口范围在80-8080内
#请求方式过滤:
tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420' ## GET
tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354' ## POST
#逻辑运算: and,or,not
tcpdump src host 192.168.0.1 and dst port 80 # 来自192.168.0.1,目标端口为80的请求
tcpdump dst host 192.168.0.1 or dst host 192.168.0.2
#常用:
tcpdump -A -nn src host baidu.com and src host 127.0.0.1
whistle
whistle 是基于 Node 实现的跨平台调试代理工具,主要用于查看、修改 HTTP、HTTPS、Websocket 的请求、响应,也可以作为 HTTP 代理服务器使用。在开发移动端网页的时候,我们不仅需要抓包,更想要真机能够直接访问到本地 server。whistle 恰好就可以提供这样的一站式服务,提升移动端的开发体验。
whislte的安装启动过程十分简单:
npm install -g whistle
w2 help # 确认安装完成
w2 start # 启动,默认端口为8899
w2 stop # 停止
w2 restart # 重启
首先需要将手机和电脑接入同一局域网,然后在手机的 Wi-Fi 中设置代理,选择代理模式为手动,填写电脑的 IP 及 whistle 服务的端口。设置代理后,便可以在 localhost:8899 中查看到手机的请求了。但是这个时候 HTTPS 的请求还是无法查看的,需要在手机及电脑上配置证书才可以查看到 HTTPS 的请求。
同样 whistle 也提供了 filter 用于过滤请求:
m:pattern
:pattern为字符串或正则表达式,匹配请求方法包含该字符串(不区分大小写)或匹配该正则的请求\i:ip
:ip表示客户端ip或正则表达式,匹配客户端ip包含该字符串(不区分大小写)或匹配该正则的请求h:header
:header表示请求头rawData的某部分字符或正则表达式,匹配请求头包含该字符串(不区分大小写)或匹配该正则的请求H:host
:host表示Network里面的host字段,为请求的域名加端口,匹配请求host字段包含该字符串(不区分大小写)或匹配该正则的请求其它
:正则或普通字符串,匹配请求URL包含该字符串(不区分大小写)或匹配该正则的请求如果想要将 xxx.com 代理到电脑的 127.0.0.1:8080 ,只需要在左侧的 Rules 中配置规则就可以了,如:
xxx.com 127.0.0.1:8080
。whistle还有很多强大的功能,有兴趣的童鞋可以去官方文档学习学习。