我以往喜欢 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 |