tcp.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package proxy
  2. import (
  3. "errors"
  4. "net"
  5. "net/http"
  6. "path/filepath"
  7. "strconv"
  8. "ehang.io/nps/bridge"
  9. "ehang.io/nps/lib/common"
  10. "ehang.io/nps/lib/conn"
  11. "ehang.io/nps/lib/file"
  12. "ehang.io/nps/server/connection"
  13. "github.com/astaxie/beego"
  14. "github.com/astaxie/beego/logs"
  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 NetBridge, 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(s.task.ServerIp+":"+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.task.Client.AddConn()
  40. }, &s.listener)
  41. }
  42. //close
  43. func (s *TunnelModeServer) Close() error {
  44. return s.listener.Close()
  45. }
  46. //web管理方式
  47. type WebServer struct {
  48. BaseServer
  49. }
  50. //开始
  51. func (s *WebServer) Start() error {
  52. p, _ := beego.AppConfig.Int("web_port")
  53. if p == 0 {
  54. stop := make(chan struct{})
  55. <-stop
  56. }
  57. beego.BConfig.WebConfig.Session.SessionOn = true
  58. beego.SetStaticPath(beego.AppConfig.String("web_base_url")+"/static", filepath.Join(common.GetRunPath(), "web", "static"))
  59. beego.SetViewsPath(filepath.Join(common.GetRunPath(), "web", "views"))
  60. err := errors.New("Web management startup failure ")
  61. var l net.Listener
  62. if l, err = connection.GetWebManagerListener(); err == nil {
  63. beego.InitBeforeHTTPRun()
  64. if beego.AppConfig.String("web_open_ssl") == "true" {
  65. keyPath := beego.AppConfig.String("web_key_file")
  66. certPath := beego.AppConfig.String("web_cert_file")
  67. err = http.ServeTLS(l, beego.BeeApp.Handlers, certPath, keyPath)
  68. } else {
  69. err = http.Serve(l, beego.BeeApp.Handlers)
  70. }
  71. } else {
  72. logs.Error(err)
  73. }
  74. return err
  75. }
  76. func (s *WebServer) Close() error {
  77. return nil
  78. }
  79. //new
  80. func NewWebServer(bridge *bridge.Bridge) *WebServer {
  81. s := new(WebServer)
  82. s.bridge = bridge
  83. return s
  84. }
  85. type process func(c *conn.Conn, s *TunnelModeServer) error
  86. //tcp proxy
  87. func ProcessTunnel(c *conn.Conn, s *TunnelModeServer) error {
  88. targetAddr, err := s.task.Target.GetRandomTarget()
  89. if err != nil {
  90. c.Close()
  91. 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())
  92. return err
  93. }
  94. return s.DealClient(c, s.task.Client, targetAddr, nil, common.CONN_TCP, nil, s.task.Flow, s.task.Target.LocalProxy)
  95. }
  96. //http proxy
  97. func ProcessHttp(c *conn.Conn, s *TunnelModeServer) error {
  98. _, addr, rb, err, r := c.GetHost()
  99. if err != nil {
  100. c.Close()
  101. logs.Info(err)
  102. return err
  103. }
  104. if r.Method == "CONNECT" {
  105. c.Write([]byte("HTTP/1.1 200 Connection established\r\n\r\n"))
  106. rb = nil
  107. }
  108. if err := s.auth(r, c, s.task.Client.Cnf.U, s.task.Client.Cnf.P); err != nil {
  109. return err
  110. }
  111. return s.DealClient(c, s.task.Client, addr, rb, common.CONN_TCP, nil, s.task.Flow, s.task.Target.LocalProxy)
  112. }