2013-04-15 16:24:32 +08:00
2012-12-23 14:18:48 +08:00
2012-08-25 11:11:06 +08:00
2013-01-29 12:56:34 +08:00
2013-04-15 13:15:43 +08:00
2013-02-17 23:48:22 +08:00
2013-04-15 12:56:40 +08:00
2013-03-14 12:35:53 +08:00
2013-02-01 18:08:17 +08:00
2013-03-18 22:19:22 +08:00
2013-02-22 22:30:53 +08:00
2013-03-07 23:21:44 +08:00
2013-04-15 13:15:43 +08:00
2013-02-17 23:48:22 +08:00
2013-04-14 13:51:15 +08:00

COW (Climb Over the Wall) proxy

COW 是一个利用二级代理帮助自动化翻墙的 HTTP 代理服务器。它能自动检测被墙网站,且仅对被墙网站使用二级代理。

当前版本0.6.1 Build Status

功能

  • 支持 HTTP, SOCKS5 和 shadowsocks 作为二级代理
    • 可同时指定多个二级代理,支持简单的负载均衡
  • 自动检测网站是否被墙,仅对被墙网站使用二级代理
    • 对未知网站先尝试直接连接失败后使用二级代理重试请求2 分钟后再尝试直接
    • 内置常见被墙网站,减少检测被墙所需时间(可手工添加)
  • 自动记录经常访问网站是否被墙
  • 提供 PAC 文件,直连网站绕过 COW

安装

  • OS X, Linux: 执行以下命令(也可用于更新,该安装脚本在 OS X 上可将 COW 设置为登录时启动)

      curl -s -L https://github.com/cyfdecyf/cow/raw/master/install-cow.sh | bash
    
  • Windows:Google Code 下载

  • 如需其他平台二进制文件,请从源码安装

bug fix 和新功能在测试后会直接进入 master branch 而不等到发布下一个版本,因此二进制版本可能缺少一些新功能。

从源码安装

仅推荐熟悉 Go 的用户从源码安装。安装 Go设置好 GOPATH,执行以下命令(go get -u 来更新):

go get github.com/cyfdecyf/cow

使用说明

配置文件在 Unix 系统上为 ~/.cow/rcWindows 上为 COW 所在目录的 rc.txt 文件。 样例配置 包含了所有选项以及详细的说明,建议下载然后修改。

启动 COW

  • Unix 系统在命令行上执行 cow &
  • Windows 上执行 cow-taskbar.exe 即可

PAC url 为 http://<listen address>/pac,也可设置 listen address 为 HTTP/HTTPS 代理。

使用 PAC 可获得更好的性能,但若 PAC 中某网站从直连变成被封,浏览器会依然尝试直连。遇到这种情况可以暂时不使用 PAC 而总是走 HTTP 代理,让 COW 学习到新的被封网站。

命令行选项可以覆盖部分配置文件中的选项、打开 debug/request/reply 日志,执行 cow -h 来获取更多信息。

手动指定被墙和直连网站

COW 的目标是自动化翻墙,一般情况下无需手工指定被墙和直连网站,该功能只是是为了处理特殊情况和性能优化。

~/.cow/blocked~/.cow/direct 可指定被墙和直连网站(direct 中的 host 会添加到 PAC

  • 每行一个域名或者主机名COW 会先检查主机名是否在列表中,再检查域名)
    • 二级域名如 google.com 相当于 *.google.com
    • com.hk, edu.cn 等二级域名下的三级域名,作为二级域名处理。如 google.com.hk 相当于 *.google.com.hk
    • 其他三级及以上域名/主机名做精确匹配,例如 plus.google.com

注意:对 IPv4 地址及 simple host nameCOW 总是直接连接,生成的 PAC 也让浏览器直接访问。(因此开发者访问 localhost 和局域网内机器会绕过 COW。

技术细节

访问网站记录

COW 在 ~/.cow/stat json 文件中记录经常访问网站被墙和直连访问的次数。

  • 直连访问成功一定次数后相应的 host 会添加到 PAC
  • host 被墙一定次数后会直接用二级代理访问
    • 为避免误判,会以一定概率再次尝试直连访问
  • host 若一段时间没有访问会自动被删除(避免 stat 文件无限增长)
  • 内置网站列表和用户指定的网站不会出现在统计文件中

COW 如何检测被墙网站

COW 将以下错误认为是墙在作怪:

  • 服务器连接被重置 (connection reset)
  • 创建连接超时
  • 服务器读操作超时

无论是普通的 HTTP GET 等请求还是 CONNECT 请求,失败后 COW 都会自动重试请求。(如果已经有内容发送回 client 则不会重试而是直接断开连接。)

用连接被重置来判断被墙通常来说比较可靠超时则不可靠。COW 每隔半分钟会尝试估算合适的超时间隔,避免在网络连接差的情况下把直连网站由于超时也当成被墙。 COW 默认配置下检测到被墙后,过两分钟再次尝试直连也是为了避免误判。

如果超时自动重试给你造成了问题,请参考样例配置高级选项中的 readTimeout, dialTimeout 选项。

限制

  • 不提供 cache
  • 不支持 HTTP pipelineChrome, Firefox 默认都没开启 pipeline支持这个功能容易增加问题而好处并不明显

致谢

贡献代码:

@tevino: http parent proxy basic authentication

Bug report:

@glacjay, @fantasticfears, @hieixu, @Blaskyy, @lucifer9, @zellux

@glacjay 对 0.3 版本的 COW 提出了让它更加自动化的建议,使我重新考虑 COW 的设计目标并且改进成 0.5 版本中的工作方式。

Description
No description provided
Readme BSD-2-Clause 1.6 MiB
Languages
Go 92.8%
Shell 4.8%
JavaScript 2.4%