我最近用VPN的时候觉得有些地方不太好用,比如说用HTTP代理的时候可以用Chrome的proxy-switchysharp插件做自动切换,这样访问国内资源时和访问国外资源时都很快。因此我用goproxy写了几行代码做了个可以指定本地出口IP的http proxy,连VPN时去掉“Send all traffic over VPN connection“选项,然后用proxy-switchysharp自动切换出口。
不过现在程序还有一些问题,我尝试去访问facebook和twitter都失败了,不知道为什么,同样是https,google和stackoverflow都是正常的,求高手指点。
#########
好了,我知道为什么脸书和推推不能访问了,因为DNS墙了。。。解析出来的地址就不对。
不知道有没有办法在go里面指定ResolveTCPAddr的dns服务器,我现在只能在hosts里面加上正确的IP地址来访问。
#########
代码如下:
package main
import (
"github.com/elazarl/goproxy"
"log"
"net"
"flag"
"net/http"
)
var (
listen = flag.String("listen", "localhost:8080", "listen on address")
ip = flag.String("ip", "", "listen on address")
verbose = flag.Bool("verbose", false, "verbose output")
)
func main() {
flag.Parse()
if *ip == "" {
log.Fatal("IP address must be speicified")
}
proxy := goproxy.NewProxyHttpServer()
proxy.Verbose = *verbose
proxy.Tr.Dial = func (network, addr string) (c net.Conn, err error) {
if network == "tcp" {
localAddr, err := net.ResolveTCPAddr(network, *ip + ":0");
if err != nil {
return nil, err;
}
remoteAddr, err := net.ResolveTCPAddr(network, addr);
if err != nil {
return nil, err;
}
return net.DialTCP(network, localAddr, remoteAddr);
}
return net.Dial(network, addr);
}
log.Fatal(http.ListenAndServe(*listen, proxy))
}
使用方法
go run proxy.go -ip VPN虚拟网卡的IP地址
启动代理之后就可以像普通http代理一样在浏览器中使用他咯,非常方便。
另外看到一个也是基于goproxy的项目功能也挺有意思,主要是为开发者解决切换开发、生产环境麻烦的问题。有时间的话想整合一下这些功能,但是好像作者已经不更新了,而且是发布在bitbucket的。。。
http://rongmayisheng.com/post/goproxy-灵活的反向代理和静态资源代理