No description, website, or topics provided.
Python D Perl
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
data
debian
server
test
uniproxy
.gitignore
Makefile
README.md
antigfw
dns2tcp.py
dnsproxy.py
gengae.py
sc.py
setup.py

README.md

简述

目标

一体化的自动翻墙工具,为多人共享一到两个翻墙帐号,实现流畅的翻墙而作。

系统分为两个部分,uniproxy和antigfw。antigfw是一套配置-启动-监管脚本,用于启动和管理ssh以及uniproxy。uniproxy负责实施代理分流,将需要代理和不需要代理的流量分离开。

管理

如果你想要看ssh代理的使用状况,当前有多少页面正在处理,可以访问http://localhost:8118/

安装

python安装方法

antigfw包含两个部分,python安装方法能安装的仅有uniproxy而已。antigfw的程序主体是一套debian打包脚本,因此无法通过python方式安装。

python setup.py install

注意,如果需要向系统内安装,你需要sudo。

启动程序

你需要准备一个antigfw.conf,就像uniproxy目录中提供的那样。

随后,你可以到uniproxy的安装目录中,使用以下指令启动uniproxy。configure是配置文件的路径。

python main.py configure

deb打包安装

deb打包

deb打包能够同时安装antigfw和uniproxy,比较简单的打包方法如下。最简单的打包方法,是在setup.py的目录下,执行debuild。注意,这需要你在系统中安装了devscripts包。

如果你希望打出比较干净的包,可以用pbuilder或cowbuilder。具体使用方法不展开。

deb包安装

deb包安装比较简单,使用以下指令即可。

dpkg -i antigfw_xxx.deb

具体文件名看你打出来的包叫什么。如果当前用户没有系统权限,你可能需要使用sudo。

系统配置

  1. 安装python-gevent和openssh-client包,并且有一个以上可以用于翻墙的ssh帐号。
  2. 在翻墙帐号上设定密钥而非密码(将你的公钥导出到~/.ssh/authorized_keys文件,具体参照LinuxWindows)。
  3. 设定/etc/antigfw/antigfw文件,修改其中的sshs记录。
  4. 完成修改后,将/etc/default/antigfw配置中的daemon由0改为1。
  5. 用/etc/init.d/antigfw restart重启服务。
  6. 在浏览器上设定服务器的8118端口为代理,类型为http代理,如:localhost:8118(其中localhost为你启动antigfw服务的机器IP)。
  7. 如果有iptables防火墙,又需要对外服务,开放8118端口。(参考:-A INPUT -p tcp -m tcp --dport 8118 -j ACCEPT)

antigfw

项目目的

启动uniproxy和ssh,互相连接,形成自动翻墙系统。

系统配置

在/etc/default/antigfw文件中

  • LOGFILE: 记录到哪个日志文件。
  • RUNDAEMON: 是否启动服务程序,用于暂停服务,阻止软件包刚刚完成安装后服务立刻启动导致的配置错误
  • CONFIGFILE: 下面所使用的配置文件。一般为/etc/antigfw/antigfw.conf。

全局配置

  • loglevel: 记录级别,默认WARNING。

ssh配置

  • autossh: 控制ssh启动管理是否生效
  • sshs: 一个列表,每个元素记录一个服务器的配置。
    • sockport: 代理的本地工作端口,即"socksv5"端口。整型。
    • listenport: 转发模式的代理端口,一般是http端口。整型,格式为(本地端口,远程端口)。注意远程ip是localhost。
    • username: 登录ssh服务器的用户名。
    • password: 如果设定此项,并且没有设定sshprivfile,则会使用password登录。
    • sshhost: 代理服务器主机名。
    • sshport: 代理服务器端口名。
    • sshprivfile: 代理服务器私钥文件路径。

uniproxy

项目目的

替换squid,做一个轻量级的代理系统,用于翻墙。

依赖

  • python-gevent。该包基于python-greenlet和libevent。注意:greenlet0.3.2在i386环境下有一个已知bug会导致段错误,请使用该版本的人自行升级。

工作流程

假定有一个或多个ssh或者同类型socksv5代理在工作,在此之上做一个http代理,让其他程序使用,达到以下目的:

  1. 自动分流,只有特定的域名才进行翻墙。内置了三套机制来分析是否需要翻墙。
  2. 白名单模式,当域名的IP在白名单地址表中,则翻墙。
  3. 黑名单模式,当域名的IP不在黑名单地址表中,则翻墙。
  4. 支持CONNECT模式,可以用于https翻墙。
  5. 负载均衡,每个upstream服务器尽量均衡访问,并可以设定最高上限。

默认模式是黑名单。域名内放置常用域名列表,黑名单是来自chnroutes的IP列表。凡是非中国IP,一概翻墙。这会引入另一个问题,即,对于某些智能DNS,它会引导你访问国外站点而非国内站点。

另外,在dnsproxy模式下会打开dns代理服务。这个服务会使用uniproxy内置的代理服务群,以tcp方式转发udp的dns请求,从而避免dns劫持和污染。你可以仅将DNS服务器设定到本机,而不用uniproxy代理所有请求。

基本配置

默认绑定到本地的8118端口。向命令行传入配置文件路径可以加载一个到多个配置文件,配置文件为python格式,其中可以定义以下变量:

  • logfile: 记录到哪个日志文件。
  • loglevel: 记录级别,默认WARNING。
  • uniproxy: 是否启动uniproxy。
  • localip: 绑定到哪个IP,默认0.0.0.0。
  • localport: 绑定到哪个端口,默认8118。
  • managers: 一个dict,用户名为key,密码为value。如果为None或者为空则不验证。
  • users: 一个dict,用户名为key,密码为value。如果为None或者为空则不验证。

代理配置

  • max_conn: 默认最大可连接数。如果设定为0,则sshs到proxy的自动转换不生效。
  • proxy: 一个列表,每个元素为一个代理对象,目前可以取socks5和http。
  • conn_tout: connect请求的超时参数
  • http_tout: http请求的超时参数
  • conn_noac: connect请求的无动作超时参数
  • http_noac: http请求的无动作超时参数

socks5必须参数:

  • addr: 服务器地址。
  • port: 端口。

socks5可选参数:

  • username: 连接用户名。
  • password: 密码。
  • rdns: 是否使用dns解析域名。
  • max_conn: 最大可连接数。
  • name: 显示名。
  • ssl: 是否需要ssl连接,默认为False。

http必须参数:

  • addr: 服务器地址。
  • port: 端口。

http可选参数:

  • username: 连接用户名。
  • password: 密码。
  • max_conn: 最大可连接数。
  • name: 显示名。
  • ssl: 是否需要ssl连接,默认为False。

过滤配置

  • whitenets: 翻墙白名单,一个规则,一般使用NetFilter。 每个参数都是字符串,表示NetFilter文件名。 当DNS解析后的结果在此IP范围内,会启用代理。None不启用。
  • blacknets: 翻墙黑名单,一个规则,一般使用NetFilter。 每个参数都是字符串,表示NetFilter文件名。 当启用后,DNS解析结果不在此IP范围内,会启用代理。None不启用。
  • upstream: 对于满足翻墙的请求,可以转交给upstream处理。 一般此处会填写HttpOverHttp或者GAE的实例。

DNS配置

  • dnsserver: 一个DNS服务器,代理在需要DNS查询时会使用这个DNS作为默认DNS。
    • dnsserver: DNS服务器IP
    • dnscache: DNS缓存大小,默认为512。
    • dnstimeout: dns超时时间,如果一直没有结果返回,就出错
  • dnsport: 内建的dns服务器打开哪个端口,建议值53。为None则不打开DNS服务器

如何引入假的dns列表:

dnsserver.loadfile('/usr/share/uniproxy/dnsfake')

NetFilter

IP地址过滤系统,主要是whitenets和blacknets上使用。具体格式为,文本格式,回车分割,每行一个地址段。第一部分的内容是IP,第二部分是mask。允许以下两种格式。

  • ip mask: 例如39.64.0.0 255.224.0.0
  • ip/mask: 39.64.0.0/11

对上述文本格式进行gzip压缩,即可以得到ip地址过滤文件。通常建议的配置方法是利用chnroutes项目生成中国地址池,然后转换为netfilter格式,再gzip压缩即可。

自动配置

  • socks: 当max_conn不为0,并且sshs有配置的时候,会自动为每个sshs产生一条proxy记录。
  • max_conn: 用于自动配置socks中的max_conn默认值。

dns2tcp

在53端口上运行一个dns服务器,将请求以tcp方式转发到远程服务器上(默认8.8.8.8)。由于gfw只对udp包进行污染,因此可以避免dns污染问题。

但是,由于仅仅做了udp-tcp转换,而没有任何加密。因此无法保证内容不被拦截和替换。

Issus

bug report

有问题可以向项目主页http://github.com/shell909090/antigfw提交issus,或者向我的邮箱发送信件。

lintian

W: antigfw source: diff-contains-git-control-dir .git
W: antigfw: init.d-script-uses-usr-interpreter etc/init.d/antigfw /usr/bin/python

TODO

  • GAE支持了,可是服务器被拔线了
  • 增加了ssh保活检测,但是只检测连通。应当检测socksv5头部响应,但是超时又是个问题