目录
网络为资源的共享提供了极大便利。使用网络中的资源,最重要的是解决两个问题。
- 资源在哪里?
- 通过什么路径找到它?
网络中的资源定位问题通过 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
的高级功能,有很多子函数可用,如 shExpMatch
、isInNet
等,具体用法可参见 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 配置。