func (si *ServerInfo) channelConn(conn *t.TCPConn) { // 收到隧道的连接 KolonseWeb.DefaultLogs().Info("收到隧道连接 Remote:%v Local:%v", conn.RemoteAddr().String(), conn.LocalAddr().String()) si.Cache = []byte("") }
func (si *ServerInfo) serverRecv(conn *t.TCPConn, buff []byte, err error) { // 收到用户数据 if err != nil { pp := kdp.NewKDP() pp.Add("Method", "Close"). Add("RemoteAddr", conn.RemoteAddr().String()). Stringify() // 将数据发送出去 _, err := si.ChannelConn.conn.Write(pp.GetBuff()) if err != nil { KolonseWeb.DefaultLogs().Error("服务连接 Addr r_%v|l_%v Error:%v", conn.RemoteAddr(), conn.LocalAddr(), err.Error()) } delete(si.Parters, conn.RemoteAddr().String()) return } KolonseWeb.DefaultLogs().Info("服务连接 Addr r_%v|l_%v 收到数据,size:%v", conn.RemoteAddr(), conn.LocalAddr(), len(buff)) pp := kdp.NewKDP() pp.Add("Method", "REQ"). Add("RemoteAddr", conn.RemoteAddr().String()). StringifyBody(buff). Stringify() fmt.Println("SEND:\n" + pp.HeaderString() + "\n") // 将数据发送出去 if si.ChannelConn.conn == nil { KolonseWeb.DefaultLogs().Error("服务连接 Addr r_%v|l_%v Error:%v", conn.RemoteAddr(), conn.LocalAddr(), "隧道连接不存在") conn.Close() return } _, err = si.ChannelConn.conn.Write(pp.GetBuff()) if err != nil { KolonseWeb.DefaultLogs().Error("服务连接 Addr r_%v|l_%v Error:%v", conn.RemoteAddr(), conn.LocalAddr(), err.Error()) return } }
func (si *ServerInfo) serverConn(conn *t.TCPConn) { // 收到用户数据的连接 KolonseWeb.DefaultLogs().Info("收到服务连接 Remote:%v Local:%v", conn.RemoteAddr().String(), conn.LocalAddr().String()) who := Who{} who.SetConn(conn.Conn) si.Parters[conn.RemoteAddr().String()] = who }
func (si *ServerInfo) ProcessProtoRes(conn net.Conn, pp *kdp.KDP) { remoteAddr, ok := pp.Get("RemoteAddr") if !ok { // 连接已经不存在 通知客户端关闭连接 KolonseWeb.DefaultLogs().Error("协议不存在 RemoteAddr", remoteAddr) return // } pWho, ok := si.Parters[remoteAddr] if !ok { // 连接已经不存在 通知客户端关闭连接 KolonseWeb.DefaultLogs().Error("RemoteAddr:%v not found", remoteAddr) return // } // 发送消息 KolonseWeb.DefaultLogs().Info("向请求源 %v 发送数据,长度:%v", conn.RemoteAddr().String(), len(pp.GetBody())) pWho.conn.Write(pp.GetBody()) }
func (si *ServerInfo) ProcessProtoConn(conn net.Conn, pp *kdp.KDP) { // 将连接信息进行赋值 connInfo := make(map[string]string) json.Unmarshal(pp.GetBody(), &connInfo) // 读取出连接时填写的 name 字段 KolonseWeb.DefaultLogs().Info("收到连接请求数据 Remote:%v Local:%v info:%v", conn.RemoteAddr().String(), conn.LocalAddr().String(), string(pp.GetBody())) si.ChannelConn.SetConn(conn) }
func (si *ServerInfo) channelRecv(conn *t.TCPConn, buff []byte, err error) { if err != nil { // 关闭所有的服务连接 for _, value := range si.Parters { value.conn.Close() } // 关闭当前的监听连接 si.Channel.Stop() si.Server.Stop() //conn.Close() KolonseWeb.DefaultLogs().Error("隧道连接 Addr r_%v|l_%v Error:%v", conn.RemoteAddr(), conn.LocalAddr(), err.Error()) return } KolonseWeb.DefaultLogs().Info("Addr r_%v|l_%v 收到隧道数据,长度:%v", conn.RemoteAddr(), conn.LocalAddr(), len(buff)) si.Cache = append(si.Cache, buff...) for { pp := kdp.NewKDP() Err := pp.Parse(si.Cache).GetError() if Err.GetCode() == kdp.KDP_PROTO_ERROR_LENGTH { KolonseWeb.DefaultLogs().Warn("Addr r_%v|l_%v Warn:%v", conn.RemoteAddr(), conn.LocalAddr(), Err.Error()) return } else if Err.GetCode() != kdp.KDP_PROTO_SUCCESS { KolonseWeb.DefaultLogs().Error("Addr r_%v|l_%v Buff:%v Error:%v", conn.RemoteAddr(), conn.LocalAddr(), string(buff), Err.Error()) conn.Close() return } switch method, _ := pp.Get("Method"); method { // 处理协议 case "CONN": si.ProcessProtoConn(conn.Conn, pp) case "RES": si.ProcessProtoRes(conn.Conn, pp) case "Close": si.ProcessProtoClose(conn.Conn, pp) } si.Cache = si.Cache[pp.GetProtoLen():] if len(si.Cache) == 0 { break } } }
func main() { svcConfig := &service.Config{ Name: "RTCPProxyServer", DisplayName: "逆向TCP代理服务", Description: "主要用来处理第三方回调的问题 方便调试", } prg := &program{} s, err := service.New(prg, svcConfig) if err != nil { KolonseWeb.DefaultLogs().Error(err.Error()) } logger, err := s.Logger(nil) if err != nil { KolonseWeb.DefaultLogs().Error(err.Error()) } err = s.Run() if err != nil { logger.Error(err) } }
func (p *program) run() { // Do work here KolonseWeb.DefaultApp.Get("/RegisterProxy", func(req *HttpLib.Request, res *HttpLib.Response, next Type.Next) { port := req.URL.Query().Get("port") // 启动监听端口 KolonseWeb.DefaultLogs().Info("处理客户端请求 Req Client Addr:%v Register Port:%v", req.RemoteAddr, port) // 创建一个TCP服务 然后启动 portInt, _ := strconv.Atoi(port) ts := TCPServer.NewServerInfo() err := ts.Start(portInt) if err != nil { res.Json(NewRespProto(RPOXY_PROTO_ERROR_NET, err.Error(), nil)) // 返回服务状态 } else { res.Json(NewRespProto(RPOXY_PROTO_SUCCESS, "", nil)) // 返回服务状态 } }) KolonseWeb.DefaultApp.Listen("0.0.0.0", *Port) }