local.go 4.7 KB

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