我复杂的网络环境中,proxy是个很有用的工具,我们可以通过proxy代理帮我们完成网络流量的转发。
这个proxy得先能接收请求,所以这里先启动一个tcp的监听,获取请求
func (s *@H_403_4@Server) Start() { var @H_403_4@err error s.listener,@H_403_4@err = net.Listen("tcp",s.addr) if @H_403_4@err != nil { glog.Fatal(@H_403_4@err) } glog.Infof("proxy listen in %s,waiTing for connection...\n",s.addr) for { conn,@H_403_4@err := s.listener.Accept() if @H_403_4@err != nil { glog.Error(@H_403_4@err) conTinue } go newConn(s,conn).serve() } }
当获取的请求连接conn,交个serve方法去处理。
func (c *conn) serve() { defer c.netConn.Close() rawhttprequestHeader,remote,ishttps,err := c.getTunnelInfo() if err != nil { glog.Error(err) return } glog.Info("connecTing to " + remotE) remoteConn,err := net.Dial("tcp",remotE) if err != nil { glog.Error(err) return } if ishttps { glog.V(10).Infof("get https req remote %s \n",remotE) // if https,should sent 200 to client _,err = c.netConn.Write([]byte("http/1.1 200 Connection established\r\n\r\n")) if err != nil { glog.Error(err) return } } else { // if not https,should sent the request header to remote _,err = rawhttprequestHeader.WriteTo(remoteConn) if err != nil { glog.Error(err) return } } // build bidirectional-streams glog.Info("begin tunnel",c.netConn.RemoteAddr(),"<->",remotE) c.tunnel(remoteConn) glog.Info("stop tunnel",remotE) }
getTunnelInfo是获取连接信息的,譬如访问host、port、协议和请求头之类的东西。
然后就可以建立远程连接,通过net.Dial(“tcp”,remotE)建立。
最后就是简单复制流量c.tunnel(remoteConn),具体代码如下
_,err := io.Copy(c.netConn,remoteConn)
这样就可以通过它转发流量
下面是例子
启动服务
./goproxy --addr :9999 --log_dir=/tmp/goproxy --v=10 到另外的机器上面执行 curl --proxy 10.39.0.45:9999 http://10.39.0.45:9090 curl -k --proxy 10.39.0.45:9999 https://10.0.0.43:443
大佬总结
以上是大佬教程为你收集整理的用golang写一个proxy全部内容,希望文章能够帮你解决用golang写一个proxy所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。