Random Tech Thoughts

The title above is not random

用 Go 写了个代理服务器:COW

最近在做两个比较无聊的项目时抽空用 Go 写了个 HTTP 代理服务器,主要用来正常访问 Google 等网站。给这个代理服务器起名字的时候头疼了下,最后决定叫 COW (Clime Over the Wall)

我的需求是只有访问被墙网站时走其他通道,其他网站直接访问。使用 VPN 需要通过路由表来实现这个目的,因此需要被墙网站 ip 列表,或者反过来拿到国内网站 ip 列表。不过我不太喜欢在系统上添加一堆路由表,所以以前一直是通过 socks 代理加 PAC 文件来达到目的。socks 代理加 PAC 的问题有两个:

  1. 需要手动维护被墙网站列表
  2. Google 这种被抽风型网站只能一直走代理,不抽风时访问速度变慢

COW 解决的就是这两个问题。对客户端的 HTTP 请求,COW 会首先尝试直接连接,如果发现被墙则记录下访问网站的域名,然后尝试使用 socks 代理完成请求。以后再次访问这个域名下的主机时就会直接走 socks 代理。对于抽风型网站,被墙后每过一段时间会再次尝试直连。

COW 还支持生成 PAC 文件,其中包含所有访问过的可以直接连接的域名。通过 PAC 来配置代理时,client 在访问这些域名下的主机时会直接连接而不通过 COW。所以使用 COW 一段时间后,经常访问的那些未被墙网站会直接连接而不会有走代理的开销。(PAC 解析开销可以忽略。)

目前 COW 版本号为 0.3.1,只支持 socks 作为二级代理。我日常在 MBP 上将 COW 设置为全系统代理,实验室 Linux 台机上也开着 COW 同时提供给实验室多位同学使用。肯定还存在一些 bug,不过就日常使用来说还算稳定了。用 socks 代理的同学可以试试看,欢迎提供 bug report 和建议。

PS: 写 COW 的时候越来越觉得 Go 是个不错的语言。

Comments