实用自动代理配置示例

自动代理上网算是个比较常用的需求,比如好多测试工程师使用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
欢迎关注微信公众号,留言交流。

相关文章:

翻译: