實用自動代理配置示例

自動代理上網算是個比較常用的需求,比如好多測試工程師使用charles抓包是就需要配置代理。常見的瀏覽器插件Proxy SwitchyOmega等其實也是方便你設置代理的。

本文主要講代理自動配置,昨天配置後,的確很方便實用,可能對讀者有用,分享出來。

先看維基百科解釋,摘取核心部分。

代理自動配置(英語:Proxy auto-config,簡稱PAC)是一種網頁瀏覽器技術,用於定義瀏覽器該如何自動選擇適當的代理服務器來訪問一個網址。

一個PAC文件包含一個JavaScript的函數“FindProxyForURL(url, host)”,這個函數返回一個包含一個或多個訪問規則的字符串。用戶代理根據這些規則使用一個特定的代理器或者直接訪問,這些規則也有優先級。當使用高優先級的規則無法訪問的時候,低優先級的訪問規則(如果存在)就提供了備用的訪問方式。瀏覽器在訪問網頁以前,會首先訪問這個PAC文件。PAC文件中的URL可能是手工配置的,也可能是是通過網頁的網絡代理自動發現協議自動配置的。

話不多說,直接上pac代碼:

 1mephisto@RMBP ~/gfw> cat proxy.pac
 2function FindProxyForURL(url, host) {
 3
 4    var _http = 'PROXY 192.168.18.193:1081';
 5
 6    if (shExpMatch(host, '*.v2ex.com')) { return _http; }
 7    if (shExpMatch(host, '*.google.com')) { return _http; }
 8    if (shExpMatch(host, '*.gmail.com')) { return _http; }
 9    if (shExpMatch(host, '*.google.co.jp')) { return _http; }
10    if (shExpMatch(host, '*..googleusercontent.com')) { return _http; }
11    if (shExpMatch(host, '*.googleusercontent.com')) { return _http; }
12    if (shExpMatch(host, '*.googleapis.com')) { return _http; }
13    if (shExpMatch(host, '*.github.com')) { return _http; }
14    if (shExpMatch(host, '*.githubassets.com')) { return _http; }
15    if (shExpMatch(host, '*.githubusercontent.com')) { return _http; }
16    if (shExpMatch(host, '*.youtube.com')) { return _http; }
17    if (shExpMatch(host, '*.inkscape.org')) { return _http; }
18    if (shExpMatch(host, '*.bootstrapcdn.com')) { return _http; }
19    if (shExpMatch(host, '*.reddit.com')) { return _http; }
20    if (shExpMatch(host, '*.openvpn.net')) { return _http; }
21    if (shExpMatch(host, '*.wikipedia.org')) { return _http; }
22    if (shExpMatch(host, '*.wikimedia.org')) { return _http; }
23    if (shExpMatch(host, '*.medium.com')) { return _http; }
24    if (shExpMatch(host, '*.web.dev')) { return _http; }
25    if (shExpMatch(host, '*.openai.com')) { return _http; }
26    if (shExpMatch(host, '*.googleadservices.com')) { return _http; }
27    if (shExpMatch(host, '*.gstaic.com')) { return _http; }
28    if (shExpMatch(host, '*.ycombinator.com')) { return _http; }
29    if (shExpMatch(host, '*.ytimg.com')) { return _http; }
30    if (shExpMatch(host, '*.ggpht.com')) { return _http; }
31    if (shExpMatch(host, '*.googlevideo.com')) { return _http; }
32    if (shExpMatch(host, '*.x.com')) { return _http; }
33    if (shExpMatch(host, '*.twitter.com')) { return _http; }
34    if (shExpMatch(host, '*.twimg.com')) { return _http; }
35    if (shExpMatch(host, '*.hysteria.network')) { return _http; }
36    if (shExpMatch(host, '*.facebook.com')) { return _http; }
37    if (shExpMatch(host, '*.instagram.com')) { return _http; }
38
39    return 'DIRECT';
40  }

上面的代碼不漂亮,可以說有點醜但是能工作!有潔癖的自己改下,簡單解釋就是匹配到目標網址,走http代理 192.168.18.193:1081,其它的不走代理直接訪問。

這樣的作用是什麼,我想你看網址應該都能明白。

都介紹pac文件了,當然要順帶說下怎麼搭建本地代理。服務端的代理我以前寫過,請在我的個人網站搜索相關文章。

1. 代理服務

 1mephisto@RMBP ~/gfw> pwd
 2/Users/mephisto/gfw
 3mephisto@RMBP ~/gfw> ls
 4OmegaProfile_auto_switch.pac  config.yaml                   hysteria-darwin-amd64*        proxy.pac
 5mephisto@RMBP ~/gfw> cat config.yaml
 6server: stock.mephisto.cc:443
 7
 8auth: your_passwd
 9
10bandwidth:
11  up: 20 mbps
12  down: 100 mbps
13
14tls:
15  insecure: true
16
17
18socks5:
19  listen: 127.0.0.1:1080
20
21http:
22  listen: 0.0.0.0:1081
23mephisto@RMBP ~/gfw> ./hysteria-darwin-amd64 -c config.yaml
242024-04-25T17:07:17+08:00       INFO    client mode
252024-04-25T17:07:18+08:00       INFO    connected to server     {"udpEnabled": true, "tx": 2500000, "count": 1}
262024-04-25T17:07:18+08:00       INFO    HTTP proxy server listening     {"addr": "0.0.0.0:1081"}
272024-04-25T17:07:18+08:00       INFO    SOCKS5 server listening {"addr": "127.0.0.1:1080"}
282024-04-25T17:07:21+08:00       INFO    update available        {"version": "v2.4.1", "url": "https://github.com/apernet/hysteria/releases", "urgent": false}

我是在Mac上面操作的,這樣即可本地開啓一個 hysteria 客戶端代理。走不同協議,一個socks5,一個http的,http的我選擇了全網卡監聽。方便家裏的其它設備連接,socks5的供Mac本身使用。

1mephisto@RMBP ~> ip a
2lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
3        inet 127.0.0.1/8 lo0
4        inet6 ::1/128
5        inet6 fe80::1/64 scopeid 0x1
6en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
7        ether 34:36:3b:c6:68:b6
8        inet6 fe80::1462:852a:9b96:efa2/64 secured scopeid 0x4
9        inet 192.168.18.193/24 brd 192.168.18.255 en0

由於我本機分配的ip是 192.168.18.193,所以對應的http代理就是 192.168.18.193:1081

其實,你也可以找個路由器,或者樹莓派跑,分配固定ip,甚至可以自己本地弄個dnsmasq,綁定一個自定義域名使用。當然那樣就搞複雜了,本文主要寫給非高手看的。

2. 配置自動代理

Mac 本機,我一般是通過瀏覽器插件 Proxy SwitchyOmega,配置走socks5代理,這一部分網上有很多教程,這裏不再贅述。主要是上網衝浪,滿足個人需求。

iPhone 或者 iPad 配置自動代理:

點這個地方進入 wifi 設置,最底下有 http 代理設置的部分

wifi settings

填入pac文件的下載地址。

pac settings

細心的讀者,可能就要問了,這個下載地址怎麼來的。別急,看下文。

3. 在本機開啓一個靜態文件服務器

這裏我使用dufs這rust工具提供靜態文件下載服務(我個人喜歡這個小工具)。

當然你使用Nginx、Apache、甚至 python3 -m http.sever,或者其它小工具都行。

1mephisto@RMBP ~/gfw> dufs proxy.pac
2Listening on:
3  http://127.0.0.1:5000/
4  http://192.168.18.193:5000/
5  http://[::1]:5000/

值得一提的是:

雖然現代的大多數客戶端無論從HTTP請求返回的MIME類型是什麼都能正確處理,但爲了完整性和最佳的兼容性,我們應該設置網頁服務器將這個文件的MIME類型聲明爲application/x-ns-proxy-autoconfig或者application/x-javascript-config。(application/x-ns-proxy-autoconfig相對application/x-javascript-config被更多的客戶端所支持,因爲它是最初被定義在Netscape規範裏面的,而後者最近纔開始被使用。)

我實際使用的dufs的時候,iPhone 和 iPad不用設置MIME都可以正常使用,其它系統或者硬件我沒有測試。

4. 最後

訪問鏈路是這樣的。

你的移動設備--》http自動代理 --》本地hysteria客戶端 --》 海外hysteria服務端 --》自由世界互聯網

這樣你的移動設備甚至都不用下載額外軟件。當然前提是你使用 Wi-Fi網絡,移動網絡還是得用小飛機等軟件。4G/5G等移動網絡是沒有辦法設置http proxy的。

請相信我,直接使用這種pac的方式,訪問google推特什麼的,速度真的非常快,畢竟沒有中間軟件性能損耗。同一個服務端,小飛機等各種菊花轉,這個順暢得很!

後續,我想把客戶端跑在我的喫灰樹莓上,樹莓派插到家裏的路由器上,配置固定ip。再整個dnsmasq,配置個內網域名,這樣更加方便,不用記各種ip。

當然,Ubuntu/Mac OS/Windows 等都是可以配置全局 http 代理的,個人一般只在手機或者pad上玩,回家都不怎麼開電腦,也就瀏覽器配置下代理,個人夠用。

最後修改於: Thursday, April 25, 2024

相關文章:

翻譯: