Pages

Saturday, 28 November 2015

pac文件生成器-genpac

PAC file Generator, working with gfwlist, support custom rules.

基于gfwlist的代理自动配置(Proxy Auto-config)文件生成工具,支持自定义规则。
Generate PAC file from gfwlist, custom rules supported. 

Installation

$ pip install genpac
$ pip install --upgrade genpac
$ pip uninstall genpac
or
$ pip install -e git+https://github.com/JinnLynn/genpac.git#egg=genpac
$ pip install --upgrade -e git+https://github.com/JinnLynn/genpac.git#egg=genpac

Usage

genpac [-h|--help] [-v|version]
       [-p PROXY|--proxy=PROXY]
       [--gfwlist-url=URL] [--gfwlist-proxy=PROXY]
       [--gfwlist-local=FILE] [--update-gfwlist-local]
       [--user-rule=RULE] [--user-rule-from=FILE]
       [-c FILE|--config-from=FILE] [-o FILE|--output=FILE]
       [-z|--compress]
       [--base64]
       [--init[=PATH]]

可选参数:
  -h, --help                帮助
  -v, --version             版本信息
  -p PROXY, --proxy=PROXY   PAC文件中使用的代理信息, 如:
                              SOCKS 127.0.0.1:8080
                              SOCKS5 127.0.0.1:8080; SOCKS 127.0.0.1:8080
                              PROXY 127.0.0.1:8080
  --gfwlist-proxy=PROXY     获取gfwlist时的代理设置, 如果你可以正常访问gfwlist, 则无必要使用该选项
                            格式为 "代理类型 [用户名:密码]@地址:端口" 其中用户名和密码可选, 如:
                              SOCKS5 127.0.0.1:8080
                              SOCKS5 username:password@127.0.0.1:8080
  --gfwlist-url=URL         gfwlist网址,无此参数或URL为空则使用默认地址, URL为-则不在线获取
                              https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt
  --gfwlist-local=FILE      本地gfwlist文件地址, 当在线地址获取失败时使用
  --update-gfwlist-local    当在线gfwlist成功获取且gfwlist-local存在时, 更新gfwlist-local内容
  --user-rule=RULE          自定义规则, 该参数允许重复使用或在单个参数中使用`,`分割多个规则,如:
                              --user-rule="@@sina.com" --user-rule="||youtube.com"
                              --user-rule="@@sina.com,||youtube.com"
  --user-rule-from=FILE     从文件中读取自定义规则, 该参数使用规则与--user-rule相同
  -c FILE, --config-from=FILE
                            从文件中读取配置信息
  -o FILE, --output=FILE    输出到文件, 无此参数或FILE为-, 意味着输出到stdout
  -z, --compress            压缩输出
  --base64                  base64加密输出, 注意: 部分浏览器并不支持经过base64加密的pac文件
  --init[=PATH]             初始化配置和用户规则文件

Config

支持通过 --config-from 参数读入配置信息,配置文件书写方法可参考config-sample.ini

Custom Rules

支持通过 --user-rule 自定义单个规则或 --user-rule-from 读入自定义规则文件,这两个参数均可重复使用。
自定义规则文件可参考user-rules-sample.txt
自定义规则的语法与gfwlist相同,使用AdBlock Plus过滤规则( http://adblockplus.org/en/filters ),简述如下:
  1. 通配符支持,如 *.example.com/* 实际书写时可省略 * 为 .example.com/
  2. 正则表达式支持,以 \ 开始和结束,如 \[\w]+:\/\/example.com\\
  3. 例外规则 @@ ,如 @@*.example.com/* 满足 @@ 后规则的地址不使用代理
  4. 匹配地址开始和结尾 | ,如 |http://example.com 、 example.com| 分别表示以 http://example.com 开始和以 example.com 结束的地址
  5. || 标记,如 ||example.com 则 http://example.com https://example.com ftp://example.com 等地址均满足条件
  6. 注释 ! 如 ! Comment
配置自定义规则时需谨慎,尽量避免与gfwlist产生冲突,或将一些本不需要代理的网址添加到代理列表
规则优先级从高到底为: user-rule > user-rule-from > gfwlist

from https://github.com/JinnLynn/genpac
(https://github.com/vangie/gfwlist2pac)
---------

pac办法如下
使用GenPAC生成pac文件
sudo apt-get update
sudo apt-get install python-pip
sudo pip install genpac
genpac -p "SOCKS5 127.0.0.1:1080" --gfwlist-proxy="SOCKS5 127.0.0.1:1080" 
--gfwlist-url=https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt 
--output="autoproxy.pac"
更详细的使用方法请见其wiki。
生成pac之后在系统设置-网络代理设置一下,方法选“自动” 配置URL填入刚才生成的PAC路径,格式为:file:///home/{username}/autoproxy.pac
-------------------------

科学上网。通过 gfwlist 和中国 IP 地址生成 PAC(Proxy auto-config) 文件。对存在于 gfwlist 的域名和解析出的 IP 在国外的域名使用代理。

gfw-pac

科学上网。通过 gfwlist 和中国 IP 地址生成 PAC(Proxy auto-config) 文件。对存在于 gfwlist 的域名和解析出的 IP 在国外的域名使用代理。

特性

  • 速度快,优先按域名匹配,再按解析后的 IP 匹配
  • 可自定义需要代理的域名
  • 可自定义本地开发 TLD 域名,例如 .test
  • 可自定义不需要代理的域名
  • 如果访问的域名不在列表里,但是 IP 在国外,也返回代理服务器

用法

编辑 gfw.pac 的第一行换成自己的代理服务器直接使用,或者手工运行 gfw-pac.py 生成自己的 pac 文件。

gfw-pac.py 使用说明

usage: gfw-pac.py -f PAC -p PROXY [-h] [-i GFWLIST_FILE]
                  [--user-rule USER_RULE_FILE]
                  [--direct-rule DIRECT_RULE_FILE]
                  [--localtld-rule LOCAL_TLD_RULE_FILE]
                  [--ip-file IP_FILE]

参数说明:

-h 显示帮助
-i 指定本地 gfwlist 文件,若不指定则自动下载
-f (必须)输出的 pac 文件
-p (必须)指定代理服务器
--user-rule 自定义使用代理的域名文件,文件里每行一个域名
--direct-rule 自定义不使用代理的域名文件,文件里每行一个域名
--localtld-rule 自定义不使用代理的顶级域,文件里每行一个域名,必须带前导圆点(例如 .test)
--ip-file 指定本地的从 apnic 下载的 IP 分配文件。若不指定则自动从 apnic 下载

举例:

./gfw-pac.py -i gfwlist.txt \
             -f gfw.pac \
             -p "PROXY 192.168.1.200:3128; DIRECT" \
             --user-rule=custom-domains.txt \
             --direct-rule=direct-domains.txt \
             --localtld-rule=local-tlds.txt \
             --ip-file=delegated-apnic-latest.txt

疑难解答

若自动下载 APNIC 的 IP 分配文件很慢,可自行用科学办法下载 http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest 后,用 --ip-file 参数指定下载好的文件。同理 gfwlist 从 https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt 下载后用 -i 参数指定。


from  https://github.com/zhiyi7/gfw-pac

------


用 v2ray/ss 结合 PAC 文件科学上网

作为一个码农,不能上 Google 等于自废武功。很多年前,我的科学上网方式是路由器刷 DD-WRT 拨 VPN,用 iptables 让国内 IP 走 WAN 路由,国外 IP 走 VPN 出口来实现智能分流。后来行政手段配合 GFW 深度探测学习拦截 VPN 流量技术,VPN 被严格限制,蓝灯/ss/v2ray 等变成了主流科学上网形式。

v2ray 自带分流功能,在配置文件里写好,访问国内地址时就可以不走上级服务器。然而这个自动分流功能,全部流量实际还是要 v2ray 程序本身做处理,这样就成了瓶颈。在我的 Asus AC88U 上,不通过 v2ray 可以跑满 250M 带宽,通过 v2ray 只能有200M左右,同时连接数多的时候可以明显感知到这个性能损失。

另一个问题是对于 Web 开发者,如果全局设置为使用代理,那就要额外小心的配置 v2ray,否则会出现访问开发服务器域名时被 v2ray 解析而访问失败。

幸好有 PAC(Proxy auto-config)技术。PAC 文件是一个 javascript 脚本文件,浏览器访问一个网址时会执行里面的 FindProxyForURL(url, host) 函数,这个函数返回一个字符串,浏览器根据返回的字符串来确认是用代理还是直接访问。iOS / macOS / Windows 都支持这个技术。那么直接用 PAC,让浏览器访问网站时判断该不该走代理就可以实现分流了。

一个自动脚本 gfw-pac,通过 gfwlist 和中国 IP 地址生成 PAC 文件。生成的 PAC 规则会先判断域名是否在白名单或者在 gfwlist(一个网友自己维护的被墙网址列表)。对存在于 gfwlist 的域名直接使用代理,对存在于白名单的域名直接让浏览器不用代理,其他网址就解析出 IP 后判断是否需要走代理,这样就省去了先解析域名再判断 IP 段的时间损失。

使用方法

  1. 首先要有一个能用的代理服务器,然后 git clone https://github.com/zhiyi7/gfw-pac.git 或者直接下载 https://github.com/zhiyi7/gfw-pac/archive/master.zip
  2. 用文本编辑器打开 gfw.pac,修改第一行的 var proxy = "PROXY 192.168.2.1:10080; DIRECT"; 换成自己的代理服务器。如果是 SOCKS 协议,则写法为 SOCKS5 IP:PORT,例如 var proxy = "SOCKS5 192.168.1.1:1080; DIRECT"。分号后的是 fallback,即如果前面的失效,浏览器会尝试使用后边的。DIRECT 代表不使用代理。
  3. 把 gfw.pac 放到 web 服务器或者本地,然后在各个系统网络设置的自动代理配置文件里填上这个文件的 URL。如果是本地文件系统,则用 file:// 开头(并不是所有系统或者浏览器都支持这种,为了兼容性尽量放在 web 服务器上,也便于其他设备使用)

自定义域名

  1. 自定义不需要用代理的域名:找到 gfw.pac 里 var directDomains =,把不需要走代理的域名按照格式填进数组。
  2. 自定义需要用代理的域名:找到 gfw.pac 里 var domainsUsingProxy =,把域名按照格式填进数组。
  3. 自定义开发用顶级域。一些开发者会把例如 *.test 作为开发域名,这样可以配置一个 .test 的 TLD 就让所有这个顶级域下的域名都不走代理。找到 gfw.pac 里 var localTlds = ,把顶级域填进去。这里不支持 .com.cn 这种实际为二级域的顶级域。记得域名前面的 . 要填写,例如 .mycompany

自己生成

我有空时会把基于最新国内 IP 和 gfwlist 的 pac 文件 commit 上去,但并不保证及时更新。如果本机有 python 环境,可直接使用 gfw-pac.py 自己更新。关于这个脚本的使用说明,直接参考 项目主页 的说明即可。