该文的说明解释可能需要如下的软件及环境:

Chrome v71.0.3578.98
macOS v10.13.6
Charles v4.2.7
ShadowsocksX-NG v1.8.2 (1)


Charles作为一款HTTP(S)抓包工具非常好用,不过国内的用户基本上还都挂Shadowsocks翻墙了,系统代理只能有一个(注意是系统代理,一般软件也都可以配置自己的代理服务),在macOS上,Chrome默认使用的就是系统代理(单独设置代理请参考为谷歌chrome浏览器设置独立代理服务器),所以如果想要两者同时工作不冲突,还需要一些特别的设置。

charles与shadowsocks共存说明了如果通过让所有HTTP(S)流量都走Charles,然后Charles 再设置外部代理(External Proxy)为Shadowsocks的本地代理即可,这样流量依次经过两个代理,既能抓包,又能翻墙。

不过这种方法需要一直开着Charles,不然翻不了墙(因为Charles已经取代Shadowsocks成为系统代理)。除了PAC模式,两款软件后启动或者切换模式(Shadowsocks的PAC, Global, Manual)的那一方会清除掉其他代理设置,改为目标设置。

一般情况下都会设置Shadowsocks随系统启动,我们多数又都是使用PAC模式,这样国内的网站就不走梯子了,速度快。所以打开Charles后,需要将Shadowsocks切换至Manual模式(即不设置系统代理,各软件自己配置代理),不然流量优先通过PAC,Charles的HTTP(S)代理就不起作用了,当关闭Charles后,再将Shadowsocks切换至PAC或者Global,也可以保持Manual模式,各个软件自己配置代理。

让流量先通过Charles然后再通过Shadowsocks,注意这种模式已经不是Shadowsocks提供的PAC了,只能是Shadowsocks的HTTP(S)或者SOCKS5了(根据Charles的Extenal Proxy配置而定),如果是本地网站开发调试,需要把测试用的域名诸如localhost, 127.0.0.1或者是修改的hosts文件中的域名填入Charles External Proxy设置中的Bypass, 注意不是Charles Proxy Setting的Bypass,也不是系统WIFI设置代理的Bypass,后两者是不走Charles代理。由于走了梯子,前端的其他资源如CDN等某些资源可能加载失败或者是加载超时,需要当心。

这种方法既需要一直开着Charles/不断的切换Shadowsocks模式,又对国内网站抓包还不友好,所以还是比较鸡肋的,价值不大,简单的方式是:如果要抓包的软件可以单独设置代理,那么不要让Charles设置系统代理,配置各个软件的代理好了;如果不能,暂时性的抓包可以不翻墙,或者就忍受一下这种鸡肋的设置吧!

[1]. charles与shadowsocks共存
[2]. Charles
[3]. 为谷歌chrome浏览器设置独立代理服务器