效率工具篇 — fiddler 抓包代理
啥都不要做,先跑起来
代理端口在哪里配置?
对象存储协议怎么研究?
怎么抓对应 host 的包?
断点交互
http 代理工具
通常来说,代理的作用常常有以下几种原因:
-
解决网络问题:比如不同机房网络跨公网或者跨网络通信,需要走代理来解决通信问题 -
统一鉴权:比如内部组件不能直接暴露给外部,需要走鉴权,但是我们通常不会给每一个组件都搞一套鉴权,这种情况可以只暴露一个代理组件,由这个组件解决鉴权问题,鉴权之后,请求做纯转发 -
调试,处理:代理的本质是请求转发,请求包会过一遍代理,所以我们可以趁这个中间过程,可以对包分析,或者处理
通常,我们学习一种网络协议的时候,最简单也最深刻的方式就是抓包来看看,这里网络包到底是什么格式,传递的是什么内容?交互是几次?
对吧,有了网络协议包,还有啥不明白的,不得比直接看代码强一百倍。
对象存储的 S3 协议是基于 http 协议之上的,当我们在使用对象存储的时候,你就不好奇 PUT,GET,DELETE 等操作到底是怎么回事?
所以,我们就需要一个好用的抓包工具,这里有三个选项:
-
wireshark -
fiddler -
charles
其中 wireshark 这个呢肯定功能是满足的,别说 http 包了,啥协议层的包都能抓,缺点就是太重了,大炮打蚊子,而且对于这种简单抓取 http 包的场景不是很友好。
fiddler 这个工具呢就非常简单易用,能够直接代理 http 的请求,代理协议支持 https 和 socks ,缺点是只有 windows 系统平台上有。
charles 这个也好用,而且是跨平台的,几大平台都有,windows,mac,但是缺点是要钱,还挺贵。
所以呢,我自己代理 http 包的时候,用的基本都是 fiddler 工具,相信 fiddler 应该很多搞 web 开发的人都用过,这个 http 的代理工具最大的特点免费加实用就够了,在初期研究 S3 协议层的时候,这个工具非常有用。
fiddler
官网:https://www.telerik.com/fiddler
啥都不要做,先跑起来
fiddler 启动之后,会自动把自己设置成系统默认的代理,默认代理端口 8888 。你打开个浏览器,然后刷下百度页面,你就能看到抓到的 http 包了,如下:
这个注意两个东西:
-
左边的页面:能看到抓到的页面,点击能看到详情包 -
右边我们先注意到 filter 这个按钮,这个是定义让你抓什么样的 http 包的过滤条件,我这里设置的是 “ * ”,就是说,所有的 http 包都抓。
代理示意图:
代理端口在哪里配置?
因为有些时候,我们可能需要显式指定代理端口,所以我们在深入看下配置,其实这个端口是可以配置的。
Tools -> Options -> Connections
Connections 配置:
这里我们看到 fiddler 的默认代理端口是 8888 ,并且 fiddler 启动之后,默认情况会自动把系统代理设置成 fiddler 。
对象存储协议怎么研究?
怎么抓对应 host 的包?
为什么需要过滤指定的 host ?如果过滤条件是“ * ”,就会被无关的请求刷屏。研发对象存储系统的时候,经常需要在本地调试系统,调试的入口自然是 S3 协议,现在我们就看下怎么抓到指定的 http 包。
Filters 设置
Inspectors 页面
这个页面就可以看到协议的详情,http 的请求,http 的响应,如下:
上面的例子,通过这个我们就可以看到请求包,就这么几个 header :
-
User-Agent:CloudBerryLab.Base.HttpUtil.Client 5.9.1 (http://www.cloudberrylab.com/)
-
我测试用的 S3 客户端是 CloudBerryLab ,这里的头部是这个工具加的。其实还有很多的 S3 工具,可以见我另一篇文章:【】 -
x-amz-date:Sun, 07 Jun 2020 13:53:31 GMT
-
跟 aws 字段含义一样 -
Authorization:AWS PjFtQJWfvKrSLYkSlV-keCKWzmXzSK1Zp3R9S5MV:DNkuelnTQY4xgwARx+NTuQ4Gxc4=
-
S3 V2 签名字段 -
Host:192.168.56.12:20000
-
我为了展示,在一台虚拟机上起了一个 S3 的服务端,虚拟机地址+端口就是 192168.56.12,20000
所以,这就明白了呀,原来 S3 V2 版本的请求包这么简单,我这里发送的是一个 list bucket 的请求,返回的是 bucket的列表,响应包如下:
HTTP/1.1 200 OK
X-Log: BUCKET:4;S3APIv2:5
X-Reqid: -UYAAG3e9GdjRxYW
x-amz-request-id: -UYAAG3e9GdjRxYW
Date: Sun, 07 Jun 2020 13:53:30 GMT
Content-Length: 231
Content-Type: text/plain; charset=utf-8
<ListAllMyBucketsResult>
<Owner>
<ID>260637563</ID>
<DisplayName>260637563</DisplayName>
</Owner>
<Buckets>
<Bucket>
<Name>qiya-bucket</Name>
<CreationDate>2020-06-07T13:52:25.000Z</CreationDate>
</Bucket>
</Buckets>
</ListAllMyBucketsResult>
断点交互
我们更进一步,如果我能把这个请求暂停住,并且做自己的设置,是不是就更好?这样我们甚至可以篡改请求包,做更深入的调试请求。
下面我举一个断点住 list bucket 请求,故意篡改签名,让请求失败。
bpu 设置断点
在下面黑框框里,使用 bpu 命令断点:
bpu 192.168.56.12:20000
断点住就显示成红色如下:
篡改签名头部数据
右键点击,选中 'Edit Header' 编辑头部数据(估计随便改掉几个字符串,预期签名不过)
修改完之后,点击 'Run to Completion' ,让请求继续走下去,发到后端:
返回结果截屏:
返回的结果也和预期一样,返回的错误码是 403 ,响应里面也是预期的是 SignatureDoesNotMatch 信息。看,我们就利用这个 fiddler 中间 hook 代理的过程,无业务感知的篡改了头部数据,达到了预期。
你能抓包,你能篡改,就能完成非常多的功能,接下来就靠大家的想象力。
坚持思考,方向比努力更重要。关注我:奇伢云存储