我以往喜欢 ssh -D 生成 SOCKS 代理后,搭配自己的 pac 文件翻墙。最近由于各种原因转到了 VPN 阵营。感觉 VPN 搭配 chnroutes 的确很舒服,不用再关心那些网站被墙,不会因为 gfwlist 更新延迟而影响访问。于是我在想,有没有办法让使用 ssh -D 或者其他翻墙代理的用户能和使用 VPN 的用户那样省心呢?于是我站在巨人的肩膀上,基于 chnroutes 项目,结合 pac 文件的 dnsResolve() 和 isInNet() 函数,开发了 Flora_Pac 这个小项目。
Flora_Pac 使用 Python 开发,能自动抓取 apnic.net 的 IP 数据,找出所有国内的 IP 地址段,生成能让浏览器自动判断国内外 IP 地址的 pac 文件,让代理用户有等价于 VPN + chnroutes 的翻墙体验。Flora_Pac 使用十分简单,兼容各种平台:
####### 获得帮助:
$ python flora_pac.py -h
usage: flora_pac.py [-h] [-x [PROXY]]
Generate proxy auto-config rules.
optional arguments:
-h, --help show this help message and exit
-x [PROXY], --proxy [PROXY]
Proxy Server, examples:
SOCKS 127.0.0.1:8964;
SOCKS5 127.0.0.1:8964;
PROXY 127.0.0.1:8964
####### 生成 pac 文件,国外 IP 通过代理 SOCKS 代理 127.0.0.1:8964 访问:
$ python flora_pac.py -x 'SOCKS 127.0.0.1:8964'
Fetching data from apnic.net, it might take a few minutes, please wait...
Rules: 3460 items.
Usage: Use the newly created flora_pac.pac as your web browser's automatic proxy configuration (.pac) file.
####### 生成 pac 文件,国外 IP 通过代理 HTTP 代理 127.0.0.1:8964 访问:
$ python flora_pac.py -x 'PROXY 127.0.0.1:8964'
Fetching data from apnic.net, it might take a few minutes, please wait...
Rules: 3460 items.
Usage: Use the newly created flora_pac.pac as your web browser's automatic proxy configuration (.pac) file.
程序跑完后,就会在当前目录产生 flora_pac.pac 文件,把它设为浏览器或系统代理设置的 pac 文件即可。
项目代码我放在 github 上开源了:https://github.com/Leask/Flora_Pac,其中 fetch_ip_data 函数 fork 自 chnroutes 项目。
不方便上 github 的朋友,直接复制以下代码保存为 flora_pac.py 就可以跑了:
#!/usr/bin/env python
#
# Flora_Pac by @leaskh
# www.leaskh.com, i@leaskh.com
#
# based on chnroutes project (by Numb.Majority@gmail.com)
#
import re
import urllib2
import argparse
import math
def generate_pac(proxy):
results = fetch_ip_data()
pacfile = 'flora_pac.pac'
rfile = open(pacfile, 'w')
strLines = (
"// Flora_Pac by @leaskh"
"\n// www.leaskh.com, i@leaskh.com"
"\n"
"\nfunction FindProxyForURL(url, host)"
"\n{"
"\n"
"\n var list = ["
)
intLines = 0
for ip,mask,_ in results:
if intLines > 0:
strLines = strLines + ','
intLines = intLines + 1
strLines = strLines + "\n ['%s', '%s']"%(ip, mask)
strLines = strLines + (
"\n ];"
"\n"
"\n var ip = dnsResolve(host);"
"\n"
"\n for (var i in list) {"
"\n if (isInNet(ip, list[i][0], list[i][1])) {"
"\n return 'DIRECT';"
"\n }"
"\n }"
"\n"
"\n return '%s';"
"\n"
"\n}"
"\n"%(proxy)
)
rfile.write(strLines)
rfile.close()
print ("Rules: %d items.\n"
"Usage: Use the newly created %s as your web browser's automatic "
"proxy configuration (.pac) file."%(intLines, pacfile))
def fetch_ip_data():
#fetch data from apnic
print "Fetching data from apnic.net, it might take a few minutes, please wait..."
url=r'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest'
data=urllib2.urlopen(url).read()
cnregex=re.compile(r'apnic\|cn\|ipv4\|[0-9\.]+\|[0-9]+\|[0-9]+\|a.*',re.IGNORECASE)
cndata=cnregex.findall(data)
results=[]
for item in cndata:
unit_items=item.split('|')
starting_ip=unit_items[3]
num_ip=int(unit_items[4])
imask=0xffffffff^(num_ip-1)
#convert to string
imask=hex(imask)[2:]
mask=[0]*4
mask[0]=imask[0:2]
mask[1]=imask[2:4]
mask[2]=imask[4:6]
mask[3]=imask[6:8]
#convert str to int
mask=[ int(i,16 ) for i in mask]
mask="%d.%d.%d.%d"%tuple(mask)
#mask in *nix format
mask2=32-int(math.log(num_ip,2))
results.append((starting_ip,mask,mask2))
return results
if __name__=='__main__':
parser=argparse.ArgumentParser(description="Generate proxy auto-config rules.")
parser.add_argument('-x', '--proxy',
dest = 'proxy',
default = 'SOCKS 127.0.0.1:8964',
nargs = '?',
help = "Proxy Server, examples: "
"SOCKS 127.0.0.1:8964; "
"SOCKS5 127.0.0.1:8964; "
"PROXY 127.0.0.1:8964")
args = parser.parse_args()
generate_pac(args.proxy)
我想,应该过不了多久就要解放了。
from http://www.leaskh.com/2011/12/02/%E7%94%A8-flora_pac-py-%E7%94%9F%E6%88%90%E8%87%AA%E5%8A%A8%E7%BF%BB%E5%A2%99%E7%9A%84-pac-%E6%96%87%E4%BB%B6/
-------------------------------------------------------------------------------------
智能翻墙Pac文件:Flora_Pac
下载Flora_Pac文件包,
内含14份Pac文件和一份说明。
14份Pac文件分别对应常用的自由门、逍遥游、无界、Puff、赛风3、 世界通、花园、张生翻墙、Vidalia、Your Freedom、ssh、ssh+Privory、Goagent、GAppProxy、Wallproxy、Hyk-proxy、Snova、西厢代理 等17种翻墙软件,
请选择自己使用的翻墙软件的Pac文件,其余的可以删除。
适用于windows系统。
一、什么是PAC文件?
PAC文件是用于浏览器自动翻墙的脚本。什么是自动翻墙?套用Autoproxy的广告就是:
引用:
你要翻墙对吗?你想让它聪明点:该翻墙时才翻,不要所有的网站都用代理,对吗?你还想让它再聪明一点:该不该翻墙它自己知道,不用什么事都要你跟它讲,对吗?
-
之前在电驴下载基地发过 《Opera 智能翻墙术》、《IE 内核浏览器智能翻墙术》 ,文中介绍了著名的PAC 文件——autoproxy2pac,这里,向大家介绍另一个新出的PAC 文件Flora_Pac。
windows下使用Opera、safari、 IE 内核浏览器、Chrome的各位,咱在这里强烈推荐你们都来使用Flora_Pac。使用Firefox 的可以和之前介绍过的智能翻墙方式对比,看看哪款最适合你。
二、Flora_Pac的原理
想了解Flora_Pac文件原理的,请看《Flora_Pac.py 生成自动翻墙的 pac 文件》。
提供下载的压缩包中的Flora_Pac文件是本人在WINDOWS下,用PyPy运行 Flora_Pac.py 文件而自动生成的,共含有3478条中国(大陆)IP。作者称“Flora_Pac兼容各种平台”,非WINDOWS操作系统的,各位可以参照文章去生成。
打开flora_pac文件,可以看到除了头三行、尾三行,其余内容都是IP地址,有3478行IP地址,它包含中国(大陆)所有的IP段。使用它,中国IP直接连接,海外IP则使用代理。因此,使用flora_pac不可能撞墙。
不足的地方在于,不论海外网站有没有被墙,都要翻墙。海外的中文网站,基本是有一个墙一个,因此,你上的多为中文网站的话,那就非常适合你。
而autoproxy2pac是 一个被墙网站的数据库,它由志愿者维护,网站收集完全依靠网民的撞墙经验,据说含3000多个网站,数量如此多,但被墙网站还是不可能都收集进去,当你上 小众网站的时候,仍旧有可能撞墙。当然你可以手工来添加,若你使用Firefox、Chrome等,添加不是问题,如果用的是其他的浏览器,那就悲剧鸟。
因此,本人认为,Flora_Pac比autoproxy2pac更好。
要实现智能翻墙,要有三要素:网页浏览器 + 翻墙软件 + Flora_Pac
三、flora_pac 的设置办法,分浏览器介绍
引用:
假定我们使用无界来翻墙
翻墙软件:无界
pac 文件名:wujie-flora.pac
pac 文件放置目录: D:\flora_pac
那么含路径的pac是:D:\flora_pac\wujie-flora.pac
一)Opera:
打开Opera浏览器,打开菜单栏 “工具”——“首选项”——“高级”——“网络”——“代理服务器”——“使用自动代理服务器配置”前点上圆点 , 在空格中填写pac文件本地地址:file://localhost/D:/flora_pac/wujie-flora.pac
二) IE
先关闭“无界”自动设置IE代理的功能。具体办法见本论坛 《IE 内核浏览器智能翻墙术》。
设置分两种状况:
如果你不需要拨号就能上网(LAN或是局域网),打开IE浏览器,打开菜单栏 “工具”——“Internet选项”————“连接”——“局域网设置”———“使用自动配置脚本”前打勾,在“地址”空格中填写pac文件本地地址:file://D:/flora_pac/wujie-flora.pac
如果你上网需要拨号才能连接到网络,打开IE浏览器,打开菜单栏 “工具”——“Internet选项”——“连接”——“设置”———“使用自动配置脚本”前打勾,在“地址”空格中填写pac文件本地地址:file://D:/flora_pac/wujie-flora.pac
三)Firefox
菜单栏 “工具”——”选项”——”高级”——“网络”——”设置”——”自动代理配置URL”前点上圆点,在空格中填写pac文件本地地址 file:///D:/flora_pac/wujie-flora.pac
Firefox用flora_pac的时候,感觉有点卡。还是推荐用AutoProxy扩展 翻墙,设置方法见《Firefox 智能翻墙术》
四)Chrome,两种方式任选一种
1、使用命令行参数
复制一个Chrome快捷方式,右键点击快捷方式,打开“属性”,在“目标(T)” 的空格中添加命令行: -proxy-pac-url=file:///D:/flora_pac/wujie-flora.pac ,保存。注意:-proxy前面有个空格 ,
2、超级搭配,与Proxy SwitchySharp和谐兼容,可以在多个翻墙软件间很方便地切换
安装Chrome扩展Proxy SwitchySharp,安装完毕后会进入SwitchySharp选项,设置如下
引用:
点击“新建情景模式”,在空格中添加资料,
“情景模式名称”中随便填,英文、中文都可,我填wujie-flora
点“自动设置”
“自动配置的URL”中填写
file:///D:/flora_pac/wujie-flora.pac
最后点“保存”,“关闭” 。
使用时左击Proxy SwitchySharp扩展的地球图标,弹出界面菜单,选择wujie-flora,就使Chrome处于自动翻墙状态下,如图3,可以在多个代理软件间切换。
注意:以上不同浏览器的本地地址都有小差异,别搞错了。
五)其他浏览器
1、 safari
Safari for windows 没有自己的代理, 直接调用IE的代理设置(打开“偏好设置——高级——代理:更改设置”,可以看到打开的是IE的设置)。
2、IE内核浏览器
先设置IE,然后设置 IE内核浏览器为“使用IE代理”。
国产浏览器中,除了少数基于Chromium开发的之外,基本上都是IE内核(含双核),如傲游、Avant Browser 、世界之窗、搜狗、腾讯TT、GreenBrowser、360安全浏览器等等,国产浏览器中的双核浏览器也适合使用IE代理。外国货中的IE内核浏览 器 有Sleipnir、Slim Browser等等。总之,以IE为内核的浏览器,在中国队伍很壮大。
3、基于Chromium的浏览器
参照Chrome的设置办法。
基于Chromium的浏览器国货有 枫树浏览器(Chromeplus)、太阳花浏览器(SunChrome)、360极速浏览器(360chrome)、世界之窗极速版(TheWorld Chrome),外国货有SRWare Iron、Comodo Dragon、RockMelt。
四、测试
设置好之后,打开无界,用浏览器查看外国IP网站 http://whatismyipaddress.com/ 和中国IP网站http://www.123cha.com/ ,如果分别看到你翻墙之后的IP 和你的本机IP,说明你已经智能翻墙成功了 。
注意:西厢代理例外,因它不使用代理服务器,不论外国中国,看到的都是本机IP 。
五、Flora_Pac的特殊事项
1、如果你使用的浏览器是IE、safari、 IE 内核浏览器,需注意:无界、自由门、逍遥游和某些软件在运行过程中会自动给IE设置代理,你需关闭此类软件自动设置IE代理的功能。当然最好的办法是使用那些不主动设置代理的代理软件。关闭办法见 《IE 内核浏览器智能翻墙术》。
2、如果你使用的翻墙软件是SSH,而且使用的SSH端口不是7070,可打开ssh-flora.pac,对倒数第二行(不计算空行)进行端口修改。
3、使用Flora_Pac,上所有的海外网站都是要翻墙的。如果你希望不翻墙状态下上某个海外网站,可以这样处理,以电驴基地网址 https://72.52.124.212为例,打开flora_pac文件, 在第4行(不含空白行)之后添加
引用:
['72.52.124.212', '255.255.255.0']
如图,如果https://72.52.124.212 今后被墙了,可以删除这一行,让它处于需翻墙状态。
不过我都怕麻烦,直接翻墙上,好像速度也很快。
4、国际分配给中国的Ip段基本稳定,因此Flora_Pac制作一次可以用很久。不过Ip段都会有一点小增加,要求高的话,可在半年更新一次Flora_Pac文件。
Flora_Pac项目地址:https://github.com/Leask/Flora_Pac
from https://72.52.124.213/viewthread.php?tid=357310
--------------------------------
Flora PAC
A PAC(Proxy auto-config) file generator with fetched China IP range, which helps walk around GFW.
Inspired by https://github.com/fivesheep/chnroutes .
Installation
$ git clone https://github.com/Leask/Flora_Pac.git
Usage
$ ./flora_pac -h
usage: flora_pac [-h] [-x [PROXY]] [-p [PORT]]
Generate proxy auto-config rules.
optional arguments:
-h, --help show this help message and exit
-x [PROXY], --proxy [PROXY]
Proxy Server, examples:
SOCKS5 127.0.0.1:8964;
SOCKS 127.0.0.1:8964;
PROXY 127.0.0.1:6489
-p [PORT], --port [PORT]
Pac Server Port [OPTIONAL], examples: 8970
- Run as a HTTP PAC server:
$ ./flora_pac -x 'SOCKS5 127.0.0.1:8964; SOCKS 127.0.0.1:8964; DIRECT' -p 8970
- [NEW] Use it directly from official host:
@ Get PAC file for proxy 'SOCKS 127.0.0.1:8964': $ curl http://flora.leaskh.com/pac?proxy=SOCKS%20127.0.0.1%3A8964 --- --- --- --- --- --- --- @ Get PAC file for proxy 'SOCKS5 127.0.0.1:8964': $ curl http://flora.leaskh.com/pac?proxy=SOCKS5%20127.0.0.1%3A8964 --- --- --- --- --- --- --- @ Get PAC file for proxy 'HTTP 127.0.0.1:6489': $ curl http://flora.leaskh.com/pac?proxy=PROXY%20127.0.0.1%3A6489 --- --- --- --- --- --- --- @ A fallback demo from 'SOCKS5 127.0.0.1:8964' to 'SOCKS 127.0.0.1:8964': $ curl http://flora.leaskh.com/pac?proxy=SOCKS5%20127.0.0.1%3A8964%3B%20SOCKS%20127.0.0.1%3A8964
More help: http://www.leaskh.com/blog/2013/10/30/测试为-flora_pac-提供-http-host/
Get help
- Email/iMsg/GTalk: i@leaskh.com
See also
- A powerful fork: https://github.com/yaleh/Flora_Pac
from https://github.com/Leask/Flora_Pac
-----
flora_pac.py文件的完整内容:
-----
flora_pac.py文件的完整内容:
| #!/usr/bin/env python | |
| # | |
| # Flora_Pac by @leaskh | |
| # www.leaskh.com, i@leaskh.com | |
| # | |
| # based on chnroutes project (by Numb.Majority@gmail.com) | |
| # | |
| import re | |
| import urllib2 | |
| import argparse | |
| import math | |
| def generate_pac(proxy): | |
| results = fetch_ip_data() | |
| pacfile = 'flora_pac.pac' | |
| rfile = open(pacfile, 'w') | |
| strLines = ( | |
| "// Flora_Pac by @leaskh" | |
| "\n// www.leaskh.com, i@leaskh.com" | |
| "\n" | |
| "\nfunction FindProxyForURL(url, host)" | |
| "\n{" | |
| "\n" | |
| "\n var list = [" | |
| ) | |
| intLines = 0 | |
| for ip,mask,_ in results: | |
| if intLines > 0: | |
| strLines = strLines + ',' | |
| intLines = intLines + 1 | |
| strLines = strLines + "\n ['%s', '%s']"%(ip, mask) | |
| strLines = strLines + ( | |
| "\n ];" | |
| "\n" | |
| "\n var ip = dnsResolve(host);" | |
| "\n" | |
| "\n for (var i in list) {" | |
| "\n if (isInNet(ip, list[i][0], list[i][1])) {" | |
| "\n return 'DIRECT';" | |
| "\n }" | |
| "\n }" | |
| "\n" | |
| "\n return '%s';" | |
| "\n" | |
| "\n}" | |
| "\n"%(proxy) | |
| ) | |
| rfile.write(strLines) | |
| rfile.close() | |
| print ("Rules: %d items.\n" | |
| "Usage: Use the newly created %s as your web browser's automatic " | |
| "proxy configuration (.pac) file."%(intLines, pacfile)) | |
| def fetch_ip_data(): | |
| #fetch data from apnic | |
| print "Fetching data from apnic.net, it might take a few minutes, please wait..." | |
| url=r'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | |
| data=urllib2.urlopen(url).read() | |
| cnregex=re.compile(r'apnic\|cn\|ipv4\|[0-9\.]+\|[0-9]+\|[0-9]+\|a.*',re.IGNORECASE) | |
| cndata=cnregex.findall(data) | |
| results=[] | |
| for item in cndata: | |
| unit_items=item.split('|') | |
| starting_ip=unit_items[3] | |
| num_ip=int(unit_items[4]) | |
| imask=0xffffffff^(num_ip-1) | |
| #convert to string | |
| imask=hex(imask)[2:] | |
| mask=[0]*4 | |
| mask[0]=imask[0:2] | |
| mask[1]=imask[2:4] | |
| mask[2]=imask[4:6] | |
| mask[3]=imask[6:8] | |
| #convert str to int | |
| mask=[ int(i,16 ) for i in mask] | |
| mask="%d.%d.%d.%d"%tuple(mask) | |
| #mask in *nix format | |
| mask2=32-int(math.log(num_ip,2)) | |
| results.append((starting_ip,mask,mask2)) | |
| return results | |
| if __name__=='__main__': | |
| parser=argparse.ArgumentParser(description="Generate proxy auto-config rules.") | |
| parser.add_argument('-x', '--proxy', | |
| dest = 'proxy', | |
| default = 'SOCKS 127.0.0.1:8964', | |
| nargs = '?', | |
| help = "Proxy Server, examples: " | |
| "SOCKS 127.0.0.1:8964; " | |
| "SOCKS5 127.0.0.1:8964; " | |
| "PROXY 127.0.0.1:8964") | |
| args = parser.parse_args() | |
| generate_pac(args.proxy) from https://raw.githubusercontent.com/qwj418/Flora_Pac/master/flora_pac.py https://github.com/qwj418/Flora_Pac |
