goproxy是基于go写的隧道代理服务器。主要分为两个部分,客户端和服务器端。客户端使用http或socks5协议向其他程序提供一个标准代理。当客户端接受请求后,会加密连接服务器端,请求服务器端连接目标。双方通过预共享的密钥和加密算法通讯,通过用户名/密码验证身份。
goproxy拥有众多参数,以下为参数解释。
- config: 配置文件路径。
服务器模式一般需要定义用户名/密码对以验证客户端身份。如果没有定义,则允许匿名使用。
用户名/密码对在配置文件的auth项目下定义。
客户端模式提供socks5协议的代理,代理端口在listen中指定。启动时需要在第一个参数指定一个服务端。
黑名单文件是一个路由文件,其中列出的子网将不会由服务器端代理,而是直接连接。这通常用于部分IP不希望通过服务器端的时候。
黑名单文件使用文本格式,每个子网一行。行内以空格分割,第一段为IP地址,第二段为子网掩码。允许使用gzip压缩,后缀名必须为gz,可以直接读取。routes.list.gz为样例。
dns是goproxy中很特殊的一个功能。由于代理经常接到连接某域名的指令,因此为了进行ip匹配,需要先进行dns查询。为了某些特殊原因,goproxy将go自带的dns做了修改。
系统会首先尝试读取本目录的resolv.conf,然后读取/etc/goproxy/resolv.conf。该文件支持一般resolv.conf的所有配置,但是额外多出一项,blackip。
如果blackip有指定,那么当dns查询结果为blackip所指定的ip时,结果丢弃,等待下一个响应包的返回。这个行为可以很大程度上抵御dns污染。
源码中附带了一个resolv.conf,一般可以直接使用。
http模式提供http协议的代理。推荐使用。
黑名单,DNS配置同socks5模式。
在debian目录下有个默认的init脚本,负责将goproxy封装为服务。
系统默认使用/etc/goproxy/config.json作为配置文件,这一路径可以通过-config来修改。
配置文件内使用json格式,其中可以指定以下内容:
- mode: 运行模式,可以为server/socks5/http。
- listen: 监听地址,一般是:port,表示监听所有interface的该端口。
- server: 服务地址,在socks5/http模式下需要,表示需要连接的目标地址。
- logfile: log文件路径,留空表示输出到stdout。
- loglevel: 日志级别。支持EMERG/ALERT/CRIT/ERROR/WARNING/NOTICE/INFO/DEBUG,默认WARNING。
- cipher: 加密算法,可以为aes/des/tripledes/rc4,默认aes。
- keyfile: 密钥文件。
- blackfile: 流量分离文件,socks/http模式下需要。
- username: 连接用户名,socks/http模式下需要。
- password: 连接密码,socks/http模式下需要。
- auth: 认证用户名/密码对,server模式下需要。
另外需要注意,/etc/default/goproxy下有一个RUNDAEMON。刚安装的时候,RUNDAEMON关闭,直到配置完成后改为1,goproxy才可以启动。
DAEMON_OPTS里面需要指名运行goproxy所需的参数。注意goproxy自身不算参数,不需要写在里面。
系统自带的black文件在/usr/share/goproxy/routes.list.gz。
可以使用以下语句生成。文件生成后,在服务器端和客户端使用keyfile指定即可。
dd if=/dev/random of=key count=16 bs=1
chmod 400 key
其中aes/des/tripledes/rc4需要16字节的随机数。当然,在默认情况下,debian打出的包会在安装时自动生成一个/etc/goproxy/key(如果没有的话)。
服务器端。
{
"mode": "server",
"listen": ":5233",
"logfile": "/var/log/goproxy.log",
"loglevel": "WARNING",
"cipher": "aes",
"keyfile": "/etc/goproxy/key",
"passwd": {
"shell": "123"
}
}
客户端。
{
"mode": "http",
"listen": ":5233",
"server": "srv:5233",
"logfile": "/var/log/goproxy.log",
"loglevel": "WARNING",
"cipher": "aes",
"keyfile": "/etc/goproxy/key",
"blackfile": "/usr/share/goproxy/routes.list.gz",
"username": "shell",
"password": "123"
}
msocks协议最大的改进是增加了连接复用能力,这个功能允许你在一个TCP连接上代理多个http请求。由于qsocks协议非常快速的建立和释放连接,并且每次连接时必然是连接方向目标方发送大量数据,目标方再反向发送。因此有可能被流量模型发现。msocks保持这个连接,因此连接建立速度更快,没有大量的打开和关闭开销,而且流量模型很难发现。
但是目前连接复用协议中,每个chunk都是1024字节大小。下一步考虑使用随机大小,彻底打乱流量模型。同时启用内容数据压缩(考虑snappy),加快传输速度。
Copyright (C) 2012-2014 Shell Xu
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.