COW(爬墙)代理
COW是一个简化穿墙的HTTP代理服务器。它能自动检测到墙网站,仅对这些网站使用二级代理。
当前版本:0.9.8 CHANGELOG
欢迎在develop分支进行开发并发送拉请求:)
功能
COW的设计目标是自动化,理想情况下用户无需担心其他网站无法访问,可直连网站也不会因为使用二级代理而降低访问速度。
- 作为HTTP代理,可提供给移动设备使用;若部署在国内服务器上,可作为APN代理
- 支持HTTP,SOCKS5,shadowsocks和cow本身作为二级代理
- 可使用多个二级代理,支持简单的负载均衡
- 自动检测网站是否被墙,仅对被墙网站使用二级代理
- 自动生成包含直连网站的PAC,访问这些网站时可绕过过COW
- 内置常见可直连网站,如国内社交,视频,银行,电商等网站(可手工添加)
快速开始
安装:
- OS X,Linux(x86,ARM):执行以下命令(也可用于更新)
curl -L git.io/cow | bash
- 环境变量
COW_INSTALLDIR
可以指定安装的路径,若该环境变量不是目录则询问用户 - 所有二进制文件在OS X上编译获得,若ARM版本可能无法工作,请下载Go ARM后从二进制安装
- 环境变量
- Windows:从发行页面下载
- 熟悉Go的用户可用
go get github.com/cyfdecyf/cow
从源码安装
编辑~/.cow/rc
(Linux)或rc.txt
(Windows),简单的配置实例如下:
#开头的行是注释,会被忽略
# 本地 HTTP 代理地址
# 配置 HTTP 和 HTTPS 代理时请填入该地址
# 若配置代理时有对所有协议使用该代理的选项,且你不清楚此选项的含义,请勾选
# 或者在自动代理配置中填入 http://127.0.0.1:7777/pac
listen = http://127.0.0.1:7777
# SOCKS5 二级代理
proxy = socks5://127.0.0.1:1080
# HTTP 二级代理
proxy = http://127.0.0.1:8080
proxy = http://user:[email protected]:8080
# shadowsocks 二级代理
proxy = ss://aes-128-cfb:[email protected]:8388
# cow 二级代理
proxy = cow://aes-128-cfb:[email protected]:8388
使用cow协议的二级代理需要在国外服务器上安装COW,并使用如下配置:
listen = cow://aes-128-cfb:[email protected]:8388
完成配置后启动COW并配置好代理即可使用。
详细使用说明
配置文件在Unix系统上为~/.cow/rc
,Windows上为COW所在目录的rc.txt
文件。样例配置包含了所有选项以及详细的说明,建议下载然后修改。
启动COW:
- Unix系统在命令行上执行
cow &
(如果COW在该PATH
目录下,请执行./cow &
)- Linux启动脚本,如何使用请参考注释(Debian测试通过,其他Linux发行版应该也可使用)
- 视窗
- 双击
cow-taskbar.exe
,隐藏到托盘执行 - 双击
cow-hide.exe
,隐藏为后台程序执行 - 以上所有都会启动
cow.exe
- 双击
PAC url为http://<listen address>/pac
,也可将浏览器的HTTP / HTTPS代理设置为listen address
使所有网站都通过COW访问。
使用PAC可以提供更好的性能,但如果PAC中某网站从直连变成被封,浏览器会依然尝试直连。遇到这种情况可以暂时不使用PAC而总是走HTTP代理,让COW学习到新的被封网站。
命令行选项可以覆盖部分配置文件中的选项,打开debug / request / reply日志,执行cow -h
来获取更多信息。
手动指定被墙和直连网站
一般情况下无需手动指定被墙和直连网站,该功能只是是为了处理特殊情况和性能优化。
配置文件所在目录下的blocked
和direct
可指定被墙和直连网站(direct
中的主机会添加到PAC)。Windows下文件称为blocked.txt
和direct.txt
。
- 每行一个域名或主机名(COW会先检查主机名是否在列表中,再检查域名)
- 二级域名如
google.com
相当于*.google.com
com.hk
,edu.cn
等二级域名下的三级域名,作为二级域名处理。如google.com.hk
相当于*.google.com.hk
- 其他三级及以上域名/主机名做精确匹配,例如
plus.google.com
- 二级域名如
技术细节
访问网站记录
COW在配置文件所在目录下的stat
json文件中记录经常访问网站被墙和直连访问的次数。
- 对未知网站,先尝试直接连接,失败后使用二级代理重试请求,2分钟后再尝试直接
- 内置常见被墙网站,减少检测被墙所需时间(可手工添加)
- 直连访问成功一定一定次数后相应的主机会添加到PAC
- 主机被墙一定次数后会直接用二级代理访问
- 为避免误判,会以一定概率再次尝试直连访问
- 主机若有没有访问会自动被删除(避免
stat
文件无限增长) - 内置网站列表和用户指定的网站不会出现在统计文件中
COW如何检测被墙网站
COW将以下错误认为是墙在作怪:
- 服务器连接被重置(连接重置)
- 创建连接超时
- 服务器读操作超时
(如果已经有内容发送回客户端则不会重试或直接替换连接。)不论是普通的HTTP GET等请求还是CONNECT请求,失败后COW都会自动重试请求。
COW每隔半分钟会尝试尝试适当的超时间隔,避免在网络连接差的情况下把直连网站通过超时也当成被墙。COW默认配置下检测到被墙后,过两分钟再次尝试直连也是为了避免误判。
如果超时自动重试给你造成了问题,请参考样例配置高级选项中的readTimeout
,dialTimeout
选项。
限制条件
- 不提供缓存
- 不支持HTTP管道(Chrome,Firefox默认都没开启管道,支持这个功能容易增加问题而好处并不明显)