🍶 为什么你的 Charles 会抓包失败?
文章已于 2022-08-22 更新
作为一名 Web 开发工程师,天天都会和网络打交道。Charles 作为一款网络抓包工具,几乎成了 Web 开发的标配。
本文是我深度使用 Charles 后总结而成,不同于其它介绍 Charles 的文章,这篇文章不会详细介绍 Charles 的各个功能(例如 remote 和 rewrite),而是专注于分析一个问题:什么情况下 Charles 会抓包失败?
为了解决这个问题,我会从 Charles 的原理分析,并且结合 Android/iOS 的官方政策,一一分析 Charles 抓包中的那些失效问题。
一、Charles 抓包原理
市面上绝大多数的抓包软件,背后的原理都是中间人攻击(Man-in-the-middle attack,缩写:MITM)。
维基百科是这样定义 MITM 的:
中间人攻击在密码学和计算机安全领域中是指攻击者与通讯的两端分别建立独立的联系,并交换其所收到的数据 ,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。
上面的定义写的很清晰,我结合 Charles 画了一个图,结合箭头方向就能看懂 HTTP Packets 的流向:
只看理论有些干,我们可以用个实例看一下 Charles 内部的工作情况。我在电脑浏览器上访问 cdn.staticfile.org
的一个 HTTP 资源,具体的网络报文我用 Wireshark 抓了一下:
结合 Wireshark 的抓包报文和 Charles 的网络分析,我们可以看出这个 HTTP 请求的报文流向:
-
浏览器(Client)从端口号
56075
发起一个请求,请求发送到本地 Charles 监听的8888
端口(MITM Server),这个连接直接在本机进行 -
收到浏览器的请求后,Charles 再从端口号
56076
(MITM Client)发起一个新的请求,因为这个网络包要入公网,所以 IP 为192.168.31.44
(我的电脑 IP 地址,下节会介绍);cdn.staticfile.org
(Server)的 IP 为111.63.183.223
,因为是 HTTP 请求,所以端口号为80
-
111.63.183.223:80
返回一个 HTTP 响应到 Charles 的代理客户端192.168.31.44:56076
-
Charles 内部做了一些处理(Capture & Analysis),然后把响应报文通过
8888
端口发送到127.0.0.1:56075
,到这里浏览器就收到了响应
在第二步和第三步中,报文经过了 Charles,Charles 这时就可以对报文进行一些加工,例如 Remote 重定向,Rewrite,缓存报文并可视化等操作。
二、Charles 抓包配置
为了文章的连续性,这里我会对 Charles 的抓包代理配置进行简单的说明。如果你对这里很熟悉可以选择跳过,不太熟悉可以把文章收藏方便后续检索查阅。
开始配置前我们先回顾一下基础的网络知识,网络数据如果想从 A 传输到 B,想确定一个连接就必须确定 5 个关键信息:源 IP 地址
,源端口
,传输层协议
,目的 IP 地址
和目的端口
。这 5 个关键信息又叫五元组
,一个五元组就可以确定一个连接。
如果用 Charles 抓包,我们就要对照分析一下 Client 和 MITM Server 间代理链接的五元组:
源 IP 地址
:被抓包应用的 IP 地址,一般为设备 IP,一般不做修改源端口
:被抓包应用的端口号,一般为操作系统分配,无法修改传输层协议
:Charles 目前主要代理的是 HTTP 协议,一般为 TCP目的 IP 地址
:Charles 的 IP 地址,一般为电脑本机 IP,一般不做修改目的端口
:Charles 的代理端口,默认为 8888,可以修改
上述分析中只考虑了一般情况,如果你真的想改也可以改,但这种 hack 行为不在本文考虑范围内
从上面的分析我们可以看出,想要打通五元组,我们主要要关注两个点:目的 IP 地址和目的端口。
我们先分析一下目的 IP 地址。因为 Charles 安装在电脑上,所以 Charles 的 IP 就是电脑的 IP。如果你是 Mac 电脑,可以按住 option
键再用鼠标点击菜单栏的 Wi-Fi 图标,得到电脑 IP 地址。也可以访问 系统偏好设置 -> 网络 得到 IP 地址。这里我的 IP 地址是 192.168.31.44
,后面会用到。
Charles 的代理端口号可以从 Charles -> Proxy -> Proxy Setttings 进行查看和更改。端口默认是 8888
,一般不建议修改。
HTTP 代理配置
确定好 Charles 的 IP 和端口号后,我们就可以分设备配置 HTTP 代理了。
1.电脑端 HTTP 代理配置
无论你使用的是 window 还是 mac,Charles 作为一款在电脑上安装的 APP,代理本机请求时,网络数据都是在本地转发的,所以相对来说电脑端的配置是最简单的。我们只要根据路径 Charles -> Proxy -> macOS Proxy 依次点击开启代理就可。
因为本机代理默认是关闭的,我们也可以在 Proxy Setttings
中点击 macOS
,勾选 Enable macOS proxy on lounch
,这样每次打开 Charles 就会默认打开代理了。
2.iOS 代理配置
想要抓 iOS 的网络包,只需要把 iOS 的网络包转发到代理 IP 和代理端口就行。
配置前我们要保证手机和电脑在同一个局域网里(一般手机电脑连同一个 Wi-Fi 就行),然后打开 iOS 的 设置 -> 无线局域网,进入已连接的 Wi-Fi 的设置页面,滑动到最底部选择配置代理,然后手动配置代理。
服务器要输入的就是前面得到的 Charles IP 地址,案例里是 192.168.31.44
;端口是前面的 Charles 代理端口,一般为 8888
。