科学上网之 PAC 代理自动配置

科学上网之 PAC 代理自动配置

PAC 介绍

摘自维基百科

代理自动配置(英语:Proxy auto-config,简称PAC)是一种网页浏览器技术,用于定义浏览器该如何自动选择适当的代理服务器来访问一个网址。

一张图片解释什么是 PAC
科学上网之 PAC 代理自动配置
图片出处
简单的讲,PAC 就是一种配置,需要配合浏览器使用。它能让你的浏览器智能判断哪些网站走代理,哪些不需要走代理。
用过 Shadowsocks 的应该会知道, shadowsocks.exe 同级目录下有一个 pac.txt 文件,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Generated by gfwlist2pac in precise mode
 
var proxy = “__PROXY__”;
 
var rules = [
“||2dbook.com“,
“||4tern.com“,
“||adorama.com“,
“||agnesb.fr”,
“||akiba-web.com“,
“||altrec.com“,
“||arena.taipei”,
“||azubu.tv”,
“||bash-hackers.org”,

可以看到 PAC 配置文件是用的 JavaScript 语法,里面有一个变量 rules ,是一个 JSON 数组格式的数据类型,数组里面存放的是各种 URL 的通配符,在 PAC 模式下,当访问符合这个数组里面任意一个 URL 通配符的网址时,系统会走代理,反之直连。

相比全局代理,PAC 的优点:

  • 智能判断,不影响国内网站的访问速度,防止无意义的绕路
  • 节省代理服务器的流量和资源
  • 易于维护

PAC 语法和函数详解

FindProxyForURL

PAC 的核心是FindProxyForURL

一个PAC文件包含一个JavaScript形式的函数“FindProxyForURL(url, host)”。这个函数返回一个包含一个或多个访问规则的字符串。用户代理根据这些规则适用一个特定的代理器或者直接访问。当一个代理服务器无法响应的时候,多个访问规则提供了其他的后备访问方法。浏览器在访问其他页面以前,首先访问这个PAC文件。PAC文件中的URL可能是手工配置的,也可能是是通过网页的网络代理自动发现协议(WPAD)自动配置的。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function FindProxyForURL(url, host) {
// our local URLs from the domains below example.com don’t need a proxy:
if (shExpMatch(url,”*.example.com/*”)) {return “DIRECT”;}
if (shExpMatch(url, “*.example.com:*/*”)) {return “DIRECT”;}
 
// URLs within this network are accessed through
// port 8080 on fastproxy.example.com:
if (isInNet(host, “10.0.0.0”, “255.255.248.0”)) {
return “PROXY fastproxy.example.com:8080″;
}
 
// All other requests go through port 8080 of proxy.example.com.
// should that fail to respond, go directly to the WWW:
return “PROXY proxy.example.com:8080; DIRECT”;
}

return 类型

return 语句有三种指令:

  • DIRECT,表示无代理直接连接
  • PROXY host:port,表示走host:port 的 proxy 服务
  • SOCKS host:port,表示走host:port 的 socks 服务

或者混合多种指令
例子1:

1
return “PROXY proxy.example.com:8080; DIRECT”;

表示默认走proxy.example.com:8080的 proxy 服务,如果失败,则不使用代理直接连接

例子2:

1
return “PROXY proxy.example.com:8080; SOCKS socks.example.com:8080; DIRECT”;

表示默认走proxy.example.com:8080的 proxy 服务;如果代理挂了或者超时,则走socks.example.com:8080的 socks 代理;如果 socks 也挂了,则无代理直接连接。

从这里可以看出 PAC 的另一大优势:自动容灾

shExpMatch

Shell 正则匹配

1
2
3
4
if (shExpMatch(host, “vpn.domain.com“) ||
shExpMatch(url, “http://abcdomain.com/folder/*“)) {
return “DIRECT”;
}

isInNet

判断是否在网段内,一般需要忽略内网服务器和VPN网络等

1
2
3
if (isInNet(dnsResolve(host), “192.168.1.0”, “255.255.255.0”)) {
return “DIRECT”;
}

weekdayRange/dateRange/timeRange

根据不同时间选择不同代理

例如:
周一到周五

1
2
3
4
5
if (weekdayRange(“MON”, “FRI”)) {
return “PROXY proxy1.example.com:8080″;
} else {
return “DIRECT”;
}

一月到五月

1
2
3
4
5
if (dateRange(“JAN”, “MAR”)) {
return “PROXY proxy1.example.com:8080″;
} else {
return “DIRECT”;
}

八点到十八点

1
2
3
4
5
if (timeRange(8, 18)) {
return “PROXY proxy1.example.com:8080″;
} else {
return “DIRECT”;
}

PAC 示例文件

https://github.com/n0wa11/gfw_whitelist/blob/master/examples/whitelist_socks5_7070.pac
https://github.com/n0wa11/gfw_whitelist/blob/master/examples/whitelist_http_8081.pac
https://github.com/n0wa11/gfw_whitelist/blob/master/whitelist.pac
https://pac.itzmx.com/abc.pac
https://github.com/breakwa11/gfw_whitelist/blob/master/proxy.pac

PAC 制作

Shadowsocks 的 PAC 文件

Shadowsocks 的 PAC 文件是根据 GFWList 和 user-rule.txt 两个文件共同生成的。
如果用户想要添加某些网站进入 PAC,最好的方式是写入 user-rule.txt 这个文件,而不是修改 GFWList 这个文件,因为 GFWList 这个文件会时不时的和 github 上做同步,可能会造成已有的修改会被覆盖掉。

注1:
Shadowsocks 生成 PAC 的仓库 https://github.com/clowwindy/gfwlist2pac 已经404

注2:
Shadowsocks-4.0.4 默认只有一个 exe 文件,有以下几种方式可以生成 PAC 文件:
“PAC -> Edit Local PAC File…” (根据 GFWList 自动生成 PAC 文件 pac.txt)
“PAC -> Update Local PAC File from GFWList” (更新 GFWList 自动覆盖 PAC 文件 pac.txt)
“PAC -> Edit User Rule for GFWList…” (同时生成 PAC 文件 pac.txt 和空的 user-rule.txt)

SwitchyOmega 的 PAC 文件

进入”SETTINGS -> Import/Export -> Profile” (chrome-extension://padekgcemlokbadohgkifijomclgjgif/options.html#/io)

To export a profile, use the top-right action bar on the profile page.

选择某个 PROFILE(一般是”自动切换”这个 PROFILE),点击右上角的”Export PAC”,自动下载到本地

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
huzhifeng@Ubuntu16041:~$ cat Downloads/OmegaProfile_ss.pac
var FindProxyForURL = function(init, profiles) {
return function(url, host) {
“use strict”;
var result = init, scheme = url.substr(0, url.indexOf(“:”));
do {
result = profiles[result];
if (typeof result === “function”) result = result(url, host, scheme);
} while (typeof result !== “string” || result.charCodeAt(0) === 43);
return result;
};
}(“+ss”, {
“+ss”: function(url, host, scheme) {
“use strict”;
if (host === “127.0.0.1” || host === “::1” || host.indexOf(“.”) < 0 || host[host.length – 1] >= 0 && isInNet(host, “192.168.10.0”, “255.255.255.0”) || host[host.length – 1] >= 0 && isInNet(host, “192.168.1.0”, “255.255.255.0”)) return “DIRECT”;
return “PROXY 127.0.0.1:1080”;
}
});huzhifeng@Ubuntu16041:~$

GenPAC

JinnLynn/genpac

基于gfwlist的多种代理软件配置文件生成工具,支持自定义规则,目前可生成的格式有pac, dnsmasq, wingy。

安装

1
2
3
4
5
6
> # 安装
> $ pip install genpac
> # 或从github安装开发版本
> 注意: 如果安装后,执行时出现无法找到命令的错误,可能是因为genpac命令没有被安装到系统路径,如Ububtu 16.04且通过apt-get安装的pip的环境下,genpac执行入口文件被安装到了~/.local/bin,遇到这种情况,将~/.local/bin添加到系统路径,或卸载重新使用sudo安装,都可以解决问题。
>

示例

1
2
3
4
5
6
7
8
9
10
11
12
# 从gfwlist生成代理信息为SOCKS5 127.0.0.1:1080的PAC文件
genpac –format=pac –pac-proxy=”SOCKS5 127.0.0.1:1080″
# PAC格式 压缩
genpac –format=pac –pac-proxy=”SOCKS5 127.0.0.1:1080″ –pac-compress
# PAC格式 自定义规则
genpac –format=pac –pac-proxy=”SOCKS5 127.0.0.1:1080″ “SOCKS5 127.0.0.1:1080″ –user-rule=”||example.com” –user-rule-from=~/user-rule.txt
# PAC格式 多个自定义规则文件
genpac –format=pac –pac-proxy=”SOCKS5 127.0.0.1:1080″ –user-rule=”||example.com” –user-rule=”||example2.com” –user-rule-from=~/user-rule.txt,~/user-rule2.txt
# PAC格式 使用HTTP代理127.0.0.1:8080获取在线gfwlist文件
genpac –format=pac –pac-proxy=”SOCKS5 127.0.0.1:1080″ –gfwlist-proxy=”PROXY 127.0.0.1:8080″
# PAC格式 如果在线gfwlist获取失败使用本地文件,如果在线gfwlist获取成功更新本地gfwlist文件
genpac –format=pac –pac-proxy=”SOCKS5 127.0.0.1:1080″ –gfwlist-local=~/gfwlist.txt –update-gfwlist-local

GFWlist2PAC (停止维护)

vangie/gfwlist2pac

PAC 配置

要使用PAC,应当在一个网页服务器上发布一个PAC文件,并且通过在浏览器的代理链接设置页面输入这个PAC文件的URL或者通过使用WPAD协议告知用户代理去使用这个文件。

Windows(IE)

在 Windows 系统中,通过「Internet选项 -> 连接 -> 局域网设置 -> 使用自动配置脚本」可以找到配置处,下放的地址栏填写 PAC 文件的 URI,这个 URI 可以是本地资源路径(file:///),也可以是网络资源路径(http://)。
如下图:
科学上网之 PAC 代理自动配置

注:
Windows 7 下 IE8 测试 OK

Linux(GNOME)

如下图:
科学上网之 PAC 代理自动配置

注: Ubuntu 16.04.1 下测试失败
设置为/home/huzhifeng/Downloads/proxy.pac和 https://blog.huzhifeng.com/proxy.pac 都测试失败

Mac OS X

「系统设置 -> 网络 -> 高级 -> 代理 -> 自动代理配置 -> URL中填入PAC地址 -> 好」
科学上网之 PAC 代理自动配置

Chrome

Chrome 中可以在「chrome://settings/ -> 显示高级设置 -> 更改代理服务器设置」中找到 PAC 填写地址。

SwitchyOmega

如下图:
科学上网之 PAC 代理自动配置
科学上网之 PAC 代理自动配置

FoxyProxy

科学上网之 PAC 代理自动配置

iOS (iPhone/iPad)

「设置 -> Wi-Fi」,选择当前使用的热点,拖到最下面的代理设置,选择”自动”,填写PAC地址

Android

「设置 -> Wi-Fi」,选择当前使用的热点,拖到最下面的代理设置,选择”自动”,填写PAC地址
我的 MIUI 国际版 (MIUI 8 Global 7.4.6 Beta) 能够支持 PAC,如下图:
科学上网之 PAC 代理自动配置

MIUI 8.2 稳定版 8.2.1.0(KHCCNDL) 不支持 PAC,如下图:
科学上网之 PAC 代理自动配置

如果原生不支持 PAC,可以下载代理APP

注意点

  • 注1: PAC 文件被访问时,返回的文件类型(Content-Type)应该为:application/x-ns-proxy-autoconfig,当然,如果你不写,一般浏览器也能够自动辨别
  • 注2: FindProxyByUrl(url, host) 中的 host 在上述函数对比时无需转换成小写,对大小写不敏感
  • 注3: 没必要对 dnsResolve(host) 的结果做缓存,DNS 在解析的时候会将结果缓存到系统中
  • 注4: Chrome 亲测失败
    点击更改代理服务器设置时进入到chrome://linux-proxy-config/,提示如下:

    When running Google Chrome under a supported desktop environment, the system proxy settings will be used. However, either your system is not supported or there was a problem launching your system configuration.

    But you can still configure via the command line. Please see man google-chrome-stable for more information on flags and environment variables.

原文来自huzhifeng blog,原文链接“https://blog.huzhifeng.com/2017/07/16/PAC/

微信公众号【木头分享】,超多福利超多资源木头分享 » 科学上网之 PAC 代理自动配置
微信公众号:ex-tool
微信公众号【木头分享】,超多福利超多资源
142518人已关注
分享到:
赞(0) 打赏

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

女装大佬众筹计划qwq

支付宝扫一扫打赏

微信扫一扫打赏