https://github.com/cyfdecyf/cow COW项目


一、介绍

COW最好使用两台服务器配合应用。一台国外服务器用于×××,一台国内服务器用于搭建cow方便用户代理。

COW可以自动检测网站是否被墙,只有被墙的网站走代理。


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


----服务器连接被重置 (connection reset)

----创建连接超时

----服务器读操作超时

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



二、配置步骤:

环境

国外服务器:128.1.37.57 

内网服务器:192.168.41.2



1、在国外服务器128.1.37.57上起cow

×××地址:curl -L git.io/cow | bash



下载后启动文件在当前目录下,配置文件是  

~/.cow/rc


编辑配置文件 写上监听的协议地址等

vim ~/.cow/rc
listen = cow://aes-128-cfb:passwd@0.0.0.0:8388
# listen = 协议是cow协议://加密方式:密码@监听地址:端口

启动cow

./cow &


2、本地服务器192.168.41.2上配置

下载cow: curl -L git.io/cow | bash

修改配置文件:

vim ~/.cow/rc

listen = http://127.0.0.1:8388   #监听地址
proxy = cow://aes-128-cfb:passwd@128.1.37.57:8388 #配置二级代理
logFile = /var/log/cow.log  #日志文件

启动Cow


3、在本地计算机上配置代理:

火狐浏览器举例:

打开菜单 → 选项 →  高级 → 设置 在自动代理配置中填入:http://192.168.41.2:8388/pac即可



如果想让用户输入账号密码才能访问代理时,可以在41.2上配置

userPasswd = username:password

来实现用户名密码认证(详见配置文件介绍)

配置完认证后,当客户端尝试连接二级代理时,浏览器会弹出一个输入账号密码的认证界面。

wKiom1nDmSDzfDOyAACc6_m6GhM308.png-wh_50



附配置文件详细介绍:


# 配置文件中 # 开头的行为注释

#

# 代理服务器监听地址,重复多次来指定多个监听地址,语法:

#

#   listen = protocol://[optional@]server_address:server_port

#

# 支持的 protocol 如下:

#

# HTTP (提供 http 代理):

#   listen = http://127.0.0.1:7777

#

#   上面的例子中,cow 生成的 PAC url 为 http://127.0.0.1:7777/pac

#   配置浏览器或系统 HTTP 和 HTTPS 代理时请填入该地址

#   若配置代理时有对所有协议使用该代理的选项,且你不清楚此选项的含义,请勾选

#

# cow (需两个 cow 服务器配合使用):

#   listen = cow://encrypt_method:password@1.2.3.4:5678

#

#   若 1.2.3.4:5678 在国外,位于国内的 cow 配置其为二级代理后,两个 cow 之间可以

#   通过加密连接传输 http 代理流量。目前的加密采用与 shadowsocks 相同的方式。

#

# 其他说明:

# - 若 server_address 为 0.0.0.0,监听本机所有 IP 地址

# - 可以用如下语法指定 PAC 中返回的代理服务器地址(当使用端口映射将 http 代理提供给外网时使用)

#   listen = http://127.0.0.1:7777 1.2.3.4:5678

#

#listen = http://127.0.0.1:7777


# 日志文件路径,如不指定则输出到 stdout

#logFile =


# COW 默认仅对被墙网站使用二级代理

# 下面选项设置为 true 后,所有网站都通过二级代理访问

#alwaysProxy = false


# 指定多个二级代理时使用的负载均衡策略,可选策略如下

#

#   backup:  默认策略,优先使用第一个指定的二级代理,其他仅作备份使用

#   hash:    根据请求的 host name,优先使用 hash 到的某一个二级代理

#   latency: 优先选择连接延迟最低的二级代理

#

# 一个二级代理连接失败后会依次尝试其他二级代理

# 失败的二级代理会以一定的概率再次尝试使用,因此恢复后会重新启用

#loadBalance = backup


#############################

# 指定二级代理

#############################


# 二级代理统一使用下列语法指定:

#

#   proxy = protocol://[authinfo@]server:port

#

# 重复使用 proxy 多次指定多个二级代理,backup 策略将按照二级代理出现的顺序来使用

#

# 目前支持的二级代理及配置举例:

#

# 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://encrypt_method:password@1.2.3.4:8388

#   proxy = ss://encrypt_method-auth:password@1.2.3.4:8388

#

#   encrypt_method 添加 -auth 启用 One Time Auth

#   authinfo 中指定加密方法和密码,所有支持的加密方法如下:

#     aes-128-cfb, aes-192-cfb, aes-256-cfb,

#     bf-cfb, cast5-cfb, des-cfb, rc4-md5,

#     chacha20, salsa20, rc4, table

#   推荐使用 aes-128-cfb

#

# cow:

#   proxy = cow://method:passwd@1.2.3.4:4321

#

#   authinfo 与 shadowsocks 相同



#############################

# 执行 ssh 命令创建 SOCKS5 代理

#############################


# 下面的选项可以让 COW 执行 ssh 命令创建本地 SOCKS5 代理,并在 ssh 断开后重连

# COW 会自动使用通过 ssh 命令创建的代理,无需再通过 proxy 选项指定

# 可重复指定多个

#

# 注意这一功能需要系统上已有 ssh 命令,且必须使用 ssh public key authentication

#

# 若指定该选项,COW 将执行以下命令:

#     ssh -n -N -D-p@server>

# server_ssh_port 端口不指定则默认为 22

# 如果要指定其他 ssh 选项,请修改 ~/.ssh/config

#sshServer = user@server:local_socks_port[:server_ssh_port]


#############################

# 认证

#############################


# 指定允许的 IP 或者网段。网段仅支持 IPv4,可以指定 IPv6 地址,用逗号分隔多个项

# 使用此选项时别忘了添加 127.0.0.1,否则本机访问也需要认证

#allowedClient = 127.0.0.1, 192.168.1.0/24, 10.0.0.0/8


# 要求客户端通过用户名密码认证

# COW 总是先验证 IP 是否在 allowedClient 中,若不在其中再通过用户名密码认证

#userPasswd = username:password


# 如需指定多个用户名密码,可在下面选项指定的文件中列出,文件中每行内容如下

#   username:password[:port]

# port 为可选项,若指定,则该用户只能从指定端口连接 COW

# 注意:如有重复用户,COW 会报错退出

#userPasswdFile = /path/to/file


# 认证失效时间

# 语法:2h3m4s 表示 2 小时 3 分钟 4 秒

#authTimeout = 2h


#############################

# 高级选项

#############################


# 将指定的 HTTP error code 认为是被干扰,使用二级代理重试,默认为空

#httpErrorCode =


# 最多允许使用多少个 CPU 核

#core = 2


# 检测超时时间使用的网站,最好使用能快速访问的站点

#estimateTarget = example.com


# 允许建立隧道连接的端口,多个端口用逗号分隔,可重复多次

# 默认总是允许下列服务的端口: ssh, http, https, rsync, imap, pop, jabber, cvs, git, svn

# 如需允许其他端口,请用该选项添加

# 限制隧道连接的端口可以防止将运行 COW 的服务器上只监听本机 ip 的服务暴露给外部

#tunnelAllowedPort = 80, 443


# GFW 会使 DNS 解析超时,也可能返回错误的地址,能连接但是读不到任何内容

# 下面两个值改小一点可以加速检测网站是否被墙,但网络情况差时可能误判


# 创建连接超时(语法跟 authTimeout 相同)

#dialTimeout = 5s

# 从服务器读超时

#readTimeout = 5s


# 基于 client 是否很快关闭连接来检测 SSL 错误,只对 Chrome 有效

# (Chrome 遇到 SSL 错误会直接关闭连接,而不是让用户选择是否继续)

# 可能将可直连网站误判为被墙网站,当 GFW 进行 SSL 中间人***时可以考虑使用

#detectSSLErr = false


# 修改 stat/blocked/direct 文件路径,如不指定,默认在配置文件所在目录下

# 执行 cow 的用户需要有对 stat 文件所在目录的写权限才能更新 stat 文件

#statFile =

#blockedFile =

#directFile =