Android 代理自動配置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示例:
function FindProxyForURL(url, host) {
return "PROXY 172.18.104.54:8888; DIRECT";
}
複製程式碼
這個PAC配置很簡單,就是指定所有流量一律走代理172.18.104.54:8888
,如果代理掛了,則直接連線不走代理。
再來一個比較簡單的PAC:
function FindProxyForURL(url, host)
{
if (host == "www.mydomain.com") {
return "DIRECT";
}
return "PROXY myproxy:80; PROXY myotherproxy:8080; DIRECT";
}
複製程式碼
上面這個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指令碼:
function FindProxyForURL(url, host) {
return "PROXY 172.18.104.54:8888; DIRECT";
}
複製程式碼
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配置檔案的內容,這樣就可以輕鬆編輯代理,也可以在多套代理配置之間進行切換,豈不美哉。當然這些都是後話,畢竟這個東西還只是個想法,暫時也沒做出來呢~