local.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package client
  2. import (
  3. "github.com/cnlh/nps/lib/common"
  4. "github.com/cnlh/nps/lib/config"
  5. "github.com/cnlh/nps/lib/conn"
  6. "github.com/cnlh/nps/lib/crypt"
  7. "github.com/cnlh/nps/lib/file"
  8. "github.com/cnlh/nps/lib/mux"
  9. "github.com/cnlh/nps/vender/github.com/astaxie/beego/logs"
  10. "github.com/cnlh/nps/vender/github.com/xtaci/kcp"
  11. "net"
  12. "net/http"
  13. "strings"
  14. )
  15. var LocalServer []*net.TCPListener
  16. var udpConn net.Conn
  17. var muxSession *mux.Mux
  18. var fileServer []*http.Server
  19. func CloseLocalServer() {
  20. for _, v := range LocalServer {
  21. v.Close()
  22. }
  23. for _, v := range fileServer {
  24. v.Close()
  25. }
  26. }
  27. func startLocalFileServer(config *config.CommonConfig, t *file.Tunnel, vkey string) {
  28. remoteConn, err := NewConn(config.Tp, vkey, config.Server, common.WORK_FILE, config.ProxyUrl)
  29. if err != nil {
  30. logs.Error("Local connection server failed ", err.Error())
  31. return
  32. }
  33. srv := &http.Server{
  34. Handler: http.StripPrefix(t.StripPre, http.FileServer(http.Dir(t.LocalPath))),
  35. }
  36. logs.Info("start local file system, local path %s, strip prefix %s ,remote port %s ", t.LocalPath, t.StripPre, t.Ports)
  37. fileServer = append(fileServer, srv)
  38. listener := mux.NewMux(remoteConn.Conn)
  39. logs.Warn(srv.Serve(listener))
  40. }
  41. func StartLocalServer(l *config.LocalServer, config *config.CommonConfig) error {
  42. listener, err := net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP("0.0.0.0"), l.Port, ""})
  43. if err != nil {
  44. logs.Error("local listener startup failed port %d, error %s", l.Port, err.Error())
  45. return err
  46. }
  47. LocalServer = append(LocalServer, listener)
  48. logs.Info("successful start-up of local monitoring, port", l.Port)
  49. for {
  50. c, err := listener.AcceptTCP()
  51. if err != nil {
  52. if strings.Contains(err.Error(), "use of closed network connection") {
  53. break
  54. }
  55. logs.Info(err)
  56. continue
  57. }
  58. if l.Type == "secret" {
  59. go processSecret(c, config, l)
  60. } else {
  61. go processP2P(c, config, l)
  62. }
  63. }
  64. return nil
  65. }
  66. func processSecret(localTcpConn net.Conn, config *config.CommonConfig, l *config.LocalServer) {
  67. remoteConn, err := NewConn(config.Tp, config.VKey, config.Server, common.WORK_SECRET, config.ProxyUrl)
  68. if err != nil {
  69. logs.Error("Local connection server failed ", err.Error())
  70. return
  71. }
  72. if _, err := remoteConn.Write([]byte(crypt.Md5(l.Password))); err != nil {
  73. logs.Error("Local connection server failed ", err.Error())
  74. return
  75. }
  76. conn.CopyWaitGroup(remoteConn, localTcpConn, false, false, nil, nil)
  77. }
  78. func processP2P(localTcpConn net.Conn, config *config.CommonConfig, l *config.LocalServer) {
  79. if udpConn == nil {
  80. newUdpConn(config, l)
  81. if udpConn == nil {
  82. return
  83. }
  84. muxSession = mux.NewMux(udpConn)
  85. }
  86. nowConn, err := muxSession.NewConn()
  87. if err != nil {
  88. logs.Error(err)
  89. return
  90. }
  91. link := conn.NewLink(common.CONN_TCP, l.Target, config.Cnf.Crypt, config.Cnf.Compress, localTcpConn.LocalAddr().String())
  92. if _, err := conn.NewConn(nowConn).SendLinkInfo(link); err != nil {
  93. logs.Error(err)
  94. return
  95. }
  96. conn.CopyWaitGroup(nowConn, localTcpConn, config.Cnf.Crypt, config.Cnf.Compress, nil, nil)
  97. }
  98. func newUdpConn(config *config.CommonConfig, l *config.LocalServer) {
  99. remoteConn, err := NewConn(config.Tp, config.VKey, config.Server, common.WORK_P2P, config.ProxyUrl)
  100. if err != nil {
  101. logs.Error("Local connection server failed ", err.Error())
  102. return
  103. }
  104. if _, err := remoteConn.Write([]byte(crypt.Md5(l.Password))); err != nil {
  105. logs.Error("Local connection server failed ", err.Error())
  106. return
  107. }
  108. var rAddr []byte
  109. //读取服务端地址、密钥 继续做处理
  110. if rAddr, err = remoteConn.GetShortLenContent(); err != nil {
  111. logs.Error(err)
  112. return
  113. }
  114. //与服务端udp建立连接
  115. tmpConn, err := common.GetLocalUdpAddr()
  116. if err != nil {
  117. logs.Warn(err)
  118. return
  119. }
  120. //与服务端建立udp连接
  121. localAddr, _ := net.ResolveUDPAddr("udp", tmpConn.LocalAddr().String())
  122. localConn, err := net.ListenUDP("udp", localAddr)
  123. if err != nil {
  124. logs.Error(err)
  125. return
  126. }
  127. localKcpConn, err := kcp.NewConn(string(rAddr), nil, 150, 3, localConn)
  128. conn.SetUdpSession(localKcpConn)
  129. if err != nil {
  130. logs.Error(err)
  131. return
  132. }
  133. //写入密钥、provider身份
  134. if _, err := localKcpConn.Write([]byte(crypt.Md5(l.Password))); err != nil {
  135. logs.Error(err)
  136. return
  137. }
  138. if _, err := localKcpConn.Write([]byte(common.WORK_P2P_VISITOR)); err != nil {
  139. logs.Error(err)
  140. return
  141. }
  142. //接收服务端传的visitor地址
  143. if b, err := conn.NewConn(localKcpConn).GetShortLenContent(); err != nil {
  144. logs.Error(err)
  145. return
  146. } else {
  147. //关闭与服务端连接
  148. localConn.Close()
  149. //建立新的连接
  150. localConn, err = net.ListenUDP("udp", localAddr)
  151. udpTunnel, err := kcp.NewConn(string(b), nil, 150, 3, localConn)
  152. if err != nil || udpTunnel == nil {
  153. logs.Warn(err)
  154. return
  155. }
  156. conn.SetUdpSession(udpTunnel)
  157. udpConn = udpTunnel
  158. }
  159. }