tcp.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package server
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/astaxie/beego"
  6. "github.com/cnlh/easyProxy/bridge"
  7. "github.com/cnlh/easyProxy/utils"
  8. "log"
  9. "net"
  10. "net/http"
  11. "strings"
  12. )
  13. type TunnelModeServer struct {
  14. server
  15. errorContent []byte
  16. process process
  17. listener *net.TCPListener
  18. }
  19. //tcp|http|host
  20. func NewTunnelModeServer(process process, bridge *bridge.Tunnel, cnf *utils.ServerConfig) *TunnelModeServer {
  21. s := new(TunnelModeServer)
  22. s.bridge = bridge
  23. s.process = process
  24. s.config = cnf
  25. return s
  26. }
  27. //开始
  28. func (s *TunnelModeServer) Start() error {
  29. var err error
  30. if s.errorContent, err = utils.ReadAllFromFile(beego.AppPath + "/web/static/page/error.html"); err != nil {
  31. s.errorContent = []byte("easyProxy 404")
  32. }
  33. s.listener, err = net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP("0.0.0.0"), s.config.TcpPort, ""})
  34. if err != nil {
  35. return err
  36. }
  37. for {
  38. conn, err := s.listener.AcceptTCP()
  39. if err != nil {
  40. if strings.Contains(err.Error(), "use of closed network connection") {
  41. break
  42. }
  43. log.Println(err)
  44. continue
  45. }
  46. s.ResetConfig()
  47. go s.process(utils.NewConn(conn), s)
  48. }
  49. return nil
  50. }
  51. //权限认证
  52. func (s *TunnelModeServer) auth(r *http.Request, c *utils.Conn, u, p string) error {
  53. if u != "" && p != "" && !utils.CheckAuth(r, u, p) {
  54. c.Write([]byte(utils.UnauthorizedBytes))
  55. c.Close()
  56. return errors.New("401 Unauthorized")
  57. }
  58. return nil
  59. }
  60. func (s *TunnelModeServer) writeConnFail(c net.Conn) {
  61. c.Write([]byte(utils.ConnectionFailBytes))
  62. c.Write(s.errorContent)
  63. }
  64. //与客户端建立通道
  65. func (s *TunnelModeServer) dealClient(c *utils.Conn, cnf *utils.ServerConfig, addr string, method string, rb []byte) error {
  66. var link *utils.Conn
  67. var err error
  68. defer func() {
  69. if cnf.Mux && link != nil {
  70. s.bridge.ReturnTunnel(link, cnf.ClientId)
  71. }
  72. }()
  73. if link, err = s.GetTunnelAndWriteHost(utils.CONN_TCP, cnf, addr); err != nil {
  74. log.Println("get bridge tunnel error: ", err)
  75. return err
  76. }
  77. if flag, err := link.ReadFlag(); err == nil {
  78. if flag == utils.CONN_SUCCESS {
  79. if method == "CONNECT" {
  80. fmt.Fprint(c, "HTTP/1.1 200 Connection established\r\n")
  81. } else if rb != nil {
  82. link.WriteTo(rb, cnf.CompressEncode, cnf.Crypt)
  83. }
  84. out, in := utils.ReplayWaitGroup(link.Conn, c.Conn, cnf.CompressEncode, cnf.CompressDecode, cnf.Crypt, cnf.Mux)
  85. s.FlowAdd(in, out)
  86. }
  87. }
  88. return nil
  89. }
  90. //close
  91. func (s *TunnelModeServer) Close() error {
  92. return s.listener.Close()
  93. }
  94. //web管理方式
  95. type WebServer struct {
  96. server
  97. }
  98. //开始
  99. func (s *WebServer) Start() {
  100. beego.BConfig.WebConfig.Session.SessionOn = true
  101. log.Println("web管理启动,访问端口为", beego.AppConfig.String("httpport"))
  102. beego.SetViewsPath(beego.AppPath + "/web/views")
  103. beego.SetStaticPath("/static", beego.AppPath+"/web/static")
  104. beego.Run()
  105. }
  106. //new
  107. func NewWebServer(bridge *bridge.Tunnel) *WebServer {
  108. s := new(WebServer)
  109. s.bridge = bridge
  110. return s
  111. }
  112. //host
  113. type HostServer struct {
  114. server
  115. }
  116. //开始
  117. func (s *HostServer) Start() error {
  118. return nil
  119. }
  120. func NewHostServer(cnf *utils.ServerConfig) *HostServer {
  121. s := new(HostServer)
  122. s.config = cnf
  123. return s
  124. }
  125. //close
  126. func (s *HostServer) Close() error {
  127. return nil
  128. }