Android 代理自動配置PAC研究

小拓先森發表於2018-02-26

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),函式返回一個字串,這個字串就是代理的配置。函式有兩個引數:urlhosturl是瀏覽的地址url全路徑,host是這個url中的主機名部分。

整個PAC檔案就包含FindProxyForURL(url, host)這一個函式,該函式的返回值可能有三種情況:

  1. DIRECT,就是直接連線,不通過代理
  2. PROXY http://www.example.com:8080,http代理的主機和埠,指定代理伺服器的地址和埠號
  3. SOCKS socks5sample.com:1080,socks5代理的主機和埠,主機也可以用IP表示

一個自動代理可以是多個選擇的組合,各個選擇間用分號;隔開,PAC的容災性是比較好的,因為你可以同時給一個url配置多個代理,以分號隔開,如果第一個代理掛了,會自動選擇第二個;如果第二個掛了,則會繼續自動選擇第三個......

1. PAC的一些函式

  1. isPlainHostName(host):判斷是否是本地主機
  2. dnsDomainIs(host,domain) localHostOrDomainIs(host, ""):判斷訪問主機是否屬於某個域和某個域名
  3. isInNet(host, subnet1, subnet2):訪問IP是否在某個子網內
  4. shExpMatch(host, ""):主機名判斷,正則
  5. url.substring(0,n):字串擷取
  6. 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的代理

Android 代理自動配置PAC研究

  • 點選上圖紅圈中右邊的箭頭,進入配置頁面

Android 代理自動配置PAC研究

  • 點選上圖紅圈中的代理,選擇代理自動配置

Android 代理自動配置PAC研究

  • 輸入PAC網址,也就是上文中的http://121.42.Xx.Xx:8080/proxy.pac,點選頁面右上角的確定即可
  • 最後,開啟Charles,小米6隨便訪問一下網路,比如開啟瀏覽器啥的,這時候Charles可能會彈個窗,預設選中DenyAccess即可
  • 代理自動配置成功,已經可以使用Charles進行抓包了

Android 代理自動配置PAC研究

展望

上文中,我們已經實現了代理自動配置,但是,如果每次都得這麼弄,那不得累死?但是,既然這個PAC配置檔案是一個遠端的配置檔案,就可以動態修改呀,只需配置一次自動代理,以後修改的事情通過修改PAC檔案來實現。不過,不還是很麻煩麼?我是這麼想的,可以實現一個Mac的狀態列應用程式,輕鬆編輯之後,就會修改遠端PAC配置檔案的內容,這樣就可以輕鬆編輯代理,也可以在多套代理配置之間進行切換,豈不美哉。當然這些都是後話,畢竟這個東西還只是個想法,暫時也沒做出來呢~

參考資料

相關文章