cyfdecyf / cow

HTTP proxy written in Go. COW can automatically identify blocked sites and use parent proxies to access.
BSD 2-Clause "Simplified" License
8.45k stars 1.61k forks source link

COW (Climb Over the Wall) proxy

COW 是一个简化穿墙的 HTTP 代理服务器。它能自动检测被墙网站,仅对这些网站使用二级代理。

English README.

当前版本:0.9.8 CHANGELOG Build Status

欢迎在 develop branch 进行开发并发送 pull request :)

功能

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:password@127.0.0.1:8080
# shadowsocks 二级代理
proxy = ss://aes-128-cfb:password@1.2.3.4:8388
# cow 二级代理
proxy = cow://aes-128-cfb:password@1.2.3.4:8388

使用 cow 协议的二级代理需要在国外服务器上安装 COW,并使用如下配置:

listen = cow://aes-128-cfb:password@0.0.0.0:8388

完成配置后启动 COW 并配置好代理即可使用。

详细使用说明

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

启动 COW:

PAC url 为 http://<listen address>/pac,也可将浏览器的 HTTP/HTTPS 代理设置为 listen address 使所有网站都通过 COW 访问。

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

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

手动指定被墙和直连网站

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

配置文件所在目录下的 blockeddirect 可指定被墙和直连网站(direct 中的 host 会添加到 PAC)。 Windows 下文件名为 blocked.txtdirect.txt

技术细节

访问网站记录

COW 在配置文件所在目录下的 stat json 文件中记录经常访问网站被墙和直连访问的次数。

COW 如何检测被墙网站

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

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

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

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

限制

致谢 (Acknowledgements)

贡献代码:

Bug reporter:

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