https://juejin.im/post/5a93cfebf265da4e951908af
这几天玩代理,需要注意的是,手机端可以直接配置PAC地址,可以直接用内网ip:port/pac这种形式。
有时设置了没生效,过了一会切下网络又生效了,囧~
环境
- 小米6 MIUI9.2 Android7.1.1
- MacOS 10.13.3
- Charles 4.0.2
什么是PAC
PAC,全称Proxy Auto Config,中文名代理自动配置。PAC类似于配置文件,通过这个配置文件,浏览器或者其他UA可以对每一个url配置代理服务,比如这个url要走这个代理,那类url要走那个代理等。
简单的PAC示例
最简单的PAC示例:
1 2 3 4 |
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">FindProxyForURL</span>(<span class="hljs-params">url, host</span>) </span>{ <span class="hljs-keyword">return</span> <span class="hljs-string">"PROXY 172.18.104.54:8888; DIRECT"</span>; } |
这个PAC配置很简单,就是指定所有流量一律走代理172.18.104.54:8888
,如果代理挂了,则直接连接不走代理。
再来一个比较简单的PAC:
1 2 3 4 5 6 7 8 9 |
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">FindProxyForURL</span>(<span class="hljs-params">url, host</span>) </span>{ <span class="hljs-keyword">if</span> (host == <span class="hljs-string">"www.mydomain.com"</span>) { <span class="hljs-keyword">return</span> <span class="hljs-string">"DIRECT"</span>; } <span class="hljs-keyword">return</span> <span class="hljs-string">"PROXY myproxy:80; PROXY myotherproxy:8080; DIRECT"</span>; } |
上面这个PAC脚本也比较简单,大概意思就是:www.mydomain.com
的流量直接走,不走代理;www.mydomain.com
以外的流量默认走代理,先走myproxy:80
代理,如果超时那就再走myotherproxy:8080
,如果这个还走不通?那对不起,老子不走代理了,直接裸连吧~
怎么写PAC
0. PAC的一些基础知识
PAC本质上就是一文本文件,不过一般以.pac
结尾,比如proxy.pac
等。PAC文件里面包含一个JavaScript函数FindProxyForURL(url, host)
,函数返回一个字符串,这个字符串就是代理的配置。函数有两个参数:url
和host
,url
是浏览的地址url全路径,host
是这个url中的主机名部分。
整个PAC文件就包含FindProxyForURL(url, host)
这一个函数,该函数的返回值可能有三种情况:
DIRECT
,就是直接连接,不通过代理PROXY http://www.example.com:8080
,http代理的主机和端口,指定代理服务器的地址和端口号SOCKS socks5sample.com:1080
,socks5代理的主机和端口,主机也可以用IP表示
一个自动代理可以是多个选择的组合,各个选择间用分号;
隔开,PAC的容灾性是比较好的,因为你可以同时给一个url配置多个代理,以分号隔开,如果第一个代理挂了,会自动选择第二个;如果第二个挂了,则会继续自动选择第三个……
1. PAC的一些函数
- isPlainHostName(host):判断是否是本地主机
- dnsDomainIs(host,domain) localHostOrDomainIs(host, “”):判断访问主机是否属于某个域和某个域名
- isInNet(host, subnet1, subnet2):访问IP是否在某个子网内
- shExpMatch(host, “”):主机名判断,正则
- url.substring(0,n):字符串截取
- myIpAddress():本地IP
2. PAC支持的函数列表
完整的PAC支持的函数列表,可以看这里:http://findproxyforurl.com/pac-functions/
如何在小米6上配置PAC实现Charles抓包
1. 实现简单的PAC脚本
我本机的IP是172.18.104.54,然后我需要用Charles进行抓包,所以端口号是8888,于是就有了下面这个三行的PAC脚本:
1 2 3 4 |
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">FindProxyForURL</span>(<span class="hljs-params">url, host</span>) </span>{ <span class="hljs-keyword">return</span> <span class="hljs-string">"PROXY 172.18.104.54:8888; DIRECT"</span>; } |
2. 上传脚本到公网服务器上
将该脚本另存为proxy.pac
,上传到我的公网服务器上,可以通过http://121.42.Xx.Xx:8080/proxy.pac
访问到
3. 配置小米6的PAC
- 将小米6和Mac连上同一个WiFi热点,然后配置小米6的代理
- 点击上图红圈中右边的箭头,进入配置页面
- 点击上图红圈中的
代理
,选择代理自动配置
- 输入PAC网址,也就是上文中的
http://121.42.Xx.Xx:8080/proxy.pac
,点击页面右上角的确定即可 - 最后,打开Charles,小米6随便访问一下网络,比如打开浏览器啥的,这时候Charles可能会弹个窗,默认选中
Deny
,Access
即可 - 代理自动配置成功,已经可以使用Charles进行抓包了
展望
上文中,我们已经实现了代理自动配置,但是,如果每次都得这么弄,那不得累死?但是,既然这个PAC配置文件是一个远程的配置文件,就可以动态修改呀,只需配置一次自动代理,以后修改的事情通过修改PAC文件来实现。不过,不还是很麻烦么?我是这么想的,可以实现一个Mac的状态栏应用程序,轻松编辑之后,就会修改远端PAC配置文件的内容,这样就可以轻松编辑代理,也可以在多套代理配置之间进行切换,岂不美哉。当然这些都是后话,毕竟这个东西还只是个想法,暂时也没做出来呢~