曲径通幽 – 浏览器的导航员 PAC

网络为资源的共享提供了极大便利。使用网络中的资源,最重要的是解决两个问题。

  • 资源在哪里?
  • 通过什么路径找到它?

网络中的资源定位问题通过 URL 解决,而资源抵达路径问题则有直接和间接两种方式。直接访问源头地址直接暴露给了资源所在地,间接访问则基本通过代理服务器形式完成。结合访问效率、连接路径流量成本、安全性、隐私等方面的考虑,不同的资源使用不同的方式进行访问往往是最佳选择。为此,在访问不同的网络资源时,经常要在两种不同的访问方式之间不停切换。手动切换效率较低,自动化的切换才是高效之选。PAC 即为此目标而生。

PAC 概貌

PAC,全名 “proxy auto-config(代理服务器自动配置)”,是专门针对 Web 浏览器和用户的其他类型网络访问 agent 在访问特定 URL 时,自动化选择代理服务器的一种技术。

计算机中的 agent 是一种“数字化的身份”,可视为自然世界中的用户(人)在数字计算机中对应映射的一个代理人,或代表。

PAC 不是一种网络连接技术,其本质上是一种规则控制技术,其高效应用有赖于底层网络链路的连通性给予支撑。

PAC 技术 1996 年起源于 Netscape 浏览器,目前几乎被所有的浏览器支持,已成为一种事实上的标准。

现代浏览器资源访问方式切换技术

现代浏览器实现了几个级别的资源访问方式切换的自动化:

  • 单一代理服务器配置

    这是最常见一种方式,在浏览器代理服务器设置页面直接设置一个代理服务器。即,为所有的 URLs 规定一个主机名和端口作为代理。

    默认情况下,所有的 URL 都是通过代理服务器访问。为了实现访问方式的切换,大多数浏览器允许用户规定一个域名的列表(如 localhost),访问这个列表里面的域名的时候不通过代理服务器。

    这是一种二元式的切换方式,简单直接,只提供了两个访问通道,要么通过唯一指定的代理服务器访问,要么通过默认的方式访问。

  • 代理自动配置(PAC)

    PAC 克服了单一代理服务器的弱点,可以同时使用多个代理服务器,提供一个多通道的方位方式。

    通过一个 PAC 文件,来确定访问每个 URL 时所选用的合适代理。

    对于需要几个不同代理配置的笔记本电脑用户,或有很多不同代理服务器的复杂的企业级设置。PAC 提供了优秀的解决方案。

  • 网络代理自发现协议(WPAD)

    使用 PAC 技术的一个负担是需要编写 PAC 文件,为此,WPAD 提供了一种更为便捷的解决方案。不需要用户自己编写 PAC 文进,而是利用浏览器在网络主动查找,通过 DHCP 和 DNS 的查询来搜索 PAC 文件的位置。

PAC 技术的实现

PAC 技术以一个 “PAC 文件” 的形式实现,使用 JavaScript 语法编写。其中,最核心内容就是编写一个 JavaScript 的函数 FindProxyForURL(url, host)

 function FindProxyForURL(url, host)
 {
            ...
 }
  • url – 被访问的全路径 URL

  • host – 从 URL 中抽取的主机名

这个函数输入一个要访问的的 url 和它的主机名,则返回一个或多个代理服务器的地址;也可以返回一个命令,告知浏览器不使用代理访问该 url。

ret = FindProxyForURL(url, host);
  • ret – 函数的返回字符串。
    • ret 为空,则不使用代理服务器

    • ret 不为空,则返回代理服务器列表,列表由以下几种代理服务器类型构成。

      • DIRECT – 直接连接,浏览器不适用代理服务器
      • PROXY host:port – http、https 代理服务器
      • SOCKS host:port – SOCKS 代理服务器

    其中,不同类型代理服务器之间用分号隔开,使用优先级从左到右依次降低。

函数 FindProxyURL 一个典型的示例如下:

function FindProxyForURL(url, host)
{
    return "PROXY proxy.example.com:8080; DIRECT";
}

此外,为实现 FindProxyURL 的高级功能,有很多子函数可用,如 shExpMatchisInNet 等,具体用法可参见 PAC Functions

MIME 类型

PAC 文件虽然语法形式借鉴了 JavaScript,但已成为一种特有的文件类型,文件以 .pac 后缀命名,也有自己独有的 MIME 类型,即 applcation/x-ns-proxy-autoconfig

PAC 应用实例

GenPAC,顾名思义,是基于 “特定访问规则集(gfwlist)” 的 PAC 文件生成工具,支持自定义规则。

安装 genpac

# 安装pip
sudo apt-get install python-pip
pip install --upgrade pip

# 安装genpac
sudo pip install genpac

#  更新
pip install --upgrade genpac

#  卸载
pip uninstall genpac

获取 paclist 文件

#  从“访问规则集”生成代理信息为 SOCKS5 127.0.0.1:1080 的 PAC 文件
genpac --proxy="SOCKS5 127.0.0.1:1080" --gfwlist-proxy="SOCKS5 127.0.0.1:1080" -o autoproxy.pac --gfwlist-url="https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"

设置全局代理

在浏览器或系统网络配置中,将 autoproxy.pac 文件导入全局代理设置。

附注:
浏览器的 SwitchyOmega 插件,支持上网通道种类非常丰富;既支持直接代理设置,也支持 PAC 文件形式,还支持直接利用规则集(无需像上述示例生成 PAC 文件)访问。设置方法可参考 SwitchyOmega 配置

Reference:

  1. wikipedia – proxy auto config
  2. Netscape Documentation
  3. https://www.jianshu.com/p/9d3b0ee17dda
  4. https://www.twblogs.net/a/5c016176bd9eee7aec4ec799?lang=zh-cn
  5. https://mannuan.github.io/post/20190710221501/
  6. https://kknews.cc/zh-tw/tech/g25yp9e.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注