Pages

Friday, 31 July 2015

用 Flora_Pac.py 生成自动翻墙的 pac 文件


我以往喜欢 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 。
现在你打开任意一个国外的网站,都不会被墙,打开大陆网站,速度和不翻墙一样。打开TwitterFacebookYouTube动态网博讯网、 美博园 、电驴基地德国之声等试试看。
五、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.

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

Get help

See also


from https://github.com/Leask/Flora_Pac
-----

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