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

    科学上网 yamakuchi 3个月前 (03-18) 851次浏览 0个评论 扫描二维码

    科学上网之 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/

    百度未收录

    木头分享 , 版权所有丨如未侵权, 联系删除jasminezx88@gmail丨本网站采用BY-NC-SA协议进行授权
    转载请注明原文链接:科学上网之 PAC 代理自动配置
    赞赏

    微信赞赏支付宝赞赏

    喜欢 (0)
    发表我的评论
    取消评论

    表情 贴图 加粗 删除线 居中 斜体 签到

    Hi,您需要填写昵称和邮箱!

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