tcp.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package proxy
  2. import (
  3. "errors"
  4. "github.com/cnlh/nps/bridge"
  5. "github.com/cnlh/nps/lib/common"
  6. "github.com/cnlh/nps/lib/conn"
  7. "github.com/cnlh/nps/lib/file"
  8. "github.com/cnlh/nps/server/connection"
  9. "github.com/cnlh/nps/vender/github.com/astaxie/beego"
  10. "github.com/cnlh/nps/vender/github.com/astaxie/beego/logs"
  11. "net"
  12. "net/http"
  13. "path/filepath"
  14. "strconv"
  15. )
  16. type TunnelModeServer struct {
  17. BaseServer
  18. process process
  19. listener net.Listener
  20. }
  21. //tcp|http|host
  22. func NewTunnelModeServer(process process, bridge *bridge.Bridge, task *file.Tunnel) *TunnelModeServer {
  23. s := new(TunnelModeServer)
  24. s.bridge = bridge
  25. s.process = process
  26. s.task = task
  27. return s
  28. }
  29. //开始
  30. func (s *TunnelModeServer) Start() error {
  31. return conn.NewTcpListenerAndProcess(":"+strconv.Itoa(s.task.Port), func(c net.Conn) {
  32. if err := s.CheckFlowAndConnNum(s.task.Client); err != nil {
  33. logs.Warn("client id %d, task id %d,error %s, when tcp connection", s.task.Client.Id, s.task.Id, err.Error())
  34. c.Close()
  35. return
  36. }
  37. logs.Trace("new tcp connection,local port %d,client %d,remote address %s", s.task.Port, s.task.Client.Id, c.RemoteAddr())
  38. s.process(conn.NewConn(c), s)
  39. }, &s.listener)
  40. }
  41. //close
  42. func (s *TunnelModeServer) Close() error {
  43. return s.listener.Close()
  44. }
  45. //web管理方式
  46. type WebServer struct {
  47. BaseServer
  48. }
  49. //开始
  50. func (s *WebServer) Start() error {
  51. p, _ := beego.AppConfig.Int("web_port")
  52. if p == 0 {
  53. stop := make(chan struct{})
  54. <-stop
  55. }
  56. beego.BConfig.WebConfig.Session.SessionOn = true
  57. beego.SetStaticPath("/static", filepath.Join(common.GetRunPath(), "web", "static"))
  58. beego.SetViewsPath(filepath.Join(common.GetRunPath(), "web", "views"))
  59. if l, err := connection.GetWebManagerListener(); err == nil {
  60. beego.InitBeforeHTTPRun()
  61. http.Serve(l, beego.BeeApp.Handlers)
  62. } else {
  63. logs.Error(err)
  64. }
  65. return errors.New("Web management startup failure")
  66. }
  67. func (s *WebServer) Close() error {
  68. return nil
  69. }
  70. //new
  71. func NewWebServer(bridge *bridge.Bridge) *WebServer {
  72. s := new(WebServer)
  73. s.bridge = bridge
  74. return s
  75. }
  76. type process func(c *conn.Conn, s *TunnelModeServer) error
  77. //tcp隧道模式
  78. func ProcessTunnel(c *conn.Conn, s *TunnelModeServer) error {
  79. targetAddr, err := s.task.GetRandomTarget()
  80. if err != nil {
  81. c.Close()
  82. logs.Warn("tcp port %d ,client id %d,task id %d connect error %s", s.task.Port, s.task.Client.Id, s.task.Id, err.Error())
  83. return err
  84. }
  85. return s.DealClient(c, s.task.Client, targetAddr, nil, common.CONN_TCP, nil, s.task.Flow)
  86. }
  87. //http代理模式
  88. func ProcessHttp(c *conn.Conn, s *TunnelModeServer) error {
  89. _, addr, rb, err, r := c.GetHost()
  90. if err != nil {
  91. c.Close()
  92. logs.Info(err)
  93. return err
  94. }
  95. if r.Method == "CONNECT" {
  96. c.Write([]byte("HTTP/1.1 200 Connection Established\r\n"))
  97. rb = nil
  98. }
  99. if err := s.auth(r, c, s.task.Client.Cnf.U, s.task.Client.Cnf.P); err != nil {
  100. return err
  101. }
  102. return s.DealClient(c, s.task.Client, addr, rb, common.CONN_TCP, nil, s.task.Flow)
  103. }