Installation
$ pip install genpac
$ pip install --upgrade genpac
$ pip uninstall genpac
$ 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.iniCustom Rules
--user-rule
自定义单个规则或 --user-rule-from
读入自定义规则文件,这两个参数均可重复使用。- 通配符支持,如
*.example.com/*
实际书写时可省略*
为.example.com/
- 正则表达式支持,以
\
开始和结束,如\[\w]+:\/\/example.com\\
- 例外规则
@@
,如@@*.example.com/*
满足@@
后规则的地址不使用代理 - 匹配地址开始和结尾
|
,如|http://example.com
、example.com|
分别表示以http://example.com
开始和以example.com
结束的地址 ||
标记,如||example.com
则http://example.com https://example.com ftp://example.com
等地址均满足条件- 注释
!
如! Comment
---------
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
-------------------------
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 段的时间损失。
使用方法
- 首先要有一个能用的代理服务器,然后
git clone https://github.com/zhiyi7/gfw-pac.git
或者直接下载 https://github.com/zhiyi7/gfw-pac/archive/master.zip。 - 用文本编辑器打开
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
代表不使用代理。 - 把
gfw.pac
放到 web 服务器或者本地,然后在各个系统网络设置的自动代理配置文件里填上这个文件的 URL。如果是本地文件系统,则用file://
开头(并不是所有系统或者浏览器都支持这种,为了兼容性尽量放在 web 服务器上,也便于其他设备使用)
自定义域名
- 自定义不需要用代理的域名:找到
gfw.pac
里var directDomains =
,把不需要走代理的域名按照格式填进数组。 - 自定义需要用代理的域名:找到
gfw.pac
里var domainsUsingProxy =
,把域名按照格式填进数组。 - 自定义开发用顶级域。一些开发者会把例如
*.test
作为开发域名,这样可以配置一个.test
的 TLD 就让所有这个顶级域下的域名都不走代理。找到gfw.pac
里var localTlds =
,把顶级域填进去。这里不支持.com.cn
这种实际为二级域的顶级域。记得域名前面的.
要填写,例如.mycompany
。
自己生成
我有空时会把基于最新国内 IP 和 gfwlist 的 pac 文件 commit 上去,但并不保证及时更新。如果本机有 python 环境,可直接使用 gfw-pac.py
自己更新。关于这个脚本的使用说明,直接参考 项目主页 的说明即可。