tcp.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package server
  2. import (
  3. "bufio"
  4. "errors"
  5. "fmt"
  6. "github.com/astaxie/beego"
  7. "github.com/cnlh/easyProxy/bridge"
  8. "github.com/cnlh/easyProxy/utils"
  9. "log"
  10. "net"
  11. "net/http"
  12. "net/http/httputil"
  13. "strings"
  14. "sync"
  15. )
  16. type process func(c *utils.Conn, s *TunnelModeServer) error
  17. type TunnelModeServer struct {
  18. process process
  19. bridge *bridge.Tunnel
  20. config *ServerConfig
  21. listener *net.TCPListener
  22. }
  23. //tcp|http|host
  24. func NewTunnelModeServer(process process, bridge *bridge.Tunnel, cnf *ServerConfig) *TunnelModeServer {
  25. s := new(TunnelModeServer)
  26. s.bridge = bridge
  27. s.process = process
  28. s.config = cnf
  29. return s
  30. }
  31. //开始
  32. func (s *TunnelModeServer) Start() error {
  33. var err error
  34. s.listener, err = net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP("0.0.0.0"), s.config.TcpPort, ""})
  35. if err != nil {
  36. return err
  37. }
  38. for {
  39. conn, err := s.listener.AcceptTCP()
  40. if err != nil {
  41. if strings.Contains(err.Error(), "use of closed network connection") {
  42. break
  43. }
  44. log.Println(err)
  45. continue
  46. }
  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.Unauthorized_BYTES))
  55. c.Close()
  56. return errors.New("401 Unauthorized")
  57. }
  58. return nil
  59. }
  60. func (s *TunnelModeServer) dealClient2(c *utils.Conn, cnf *ServerConfig, addr string, method string, rb []byte) error {
  61. return nil
  62. }
  63. //与客户端建立通道
  64. func (s *TunnelModeServer) dealClient(c *utils.Conn, cnf *ServerConfig, addr string, method string, rb []byte) error {
  65. var link *utils.Conn
  66. var err error
  67. defer func() {
  68. if cnf.Mux && link != nil {
  69. s.bridge.ReturnTunnel(link, getverifyval(cnf.VerifyKey))
  70. }
  71. }()
  72. if link, err = s.GetTunnelAndWriteHost(c, cnf, addr); err != nil {
  73. log.Println("get bridge tunnel error: ", err)
  74. return err
  75. }
  76. if flag, err := link.ReadFlag(); err == nil {
  77. if flag == utils.CONN_SUCCESS {
  78. if method == "CONNECT" {
  79. fmt.Fprint(c, "HTTP/1.1 200 Connection established\r\n")
  80. } else if rb != nil {
  81. link.WriteTo(rb, cnf.CompressEncode, cnf.Crypt)
  82. }
  83. utils.ReplayWaitGroup(link.Conn, c.Conn, cnf.CompressEncode, cnf.CompressDecode, cnf.Crypt, cnf.Mux)
  84. }
  85. }
  86. return nil
  87. }
  88. //close
  89. func (s *TunnelModeServer) Close() error {
  90. return s.listener.Close()
  91. }
  92. func (s *TunnelModeServer) GetTunnelAndWriteHost(c *utils.Conn, cnf *ServerConfig, addr string) (*utils.Conn, error) {
  93. var err error
  94. link, err := s.bridge.GetTunnel(getverifyval(cnf.VerifyKey), cnf.CompressEncode, cnf.CompressDecode, cnf.Crypt, cnf.Mux)
  95. if err != nil {
  96. return nil, err
  97. }
  98. if _, err = link.WriteHost(utils.CONN_TCP, addr); err != nil {
  99. link.Close()
  100. return nil, err
  101. }
  102. return link, nil
  103. }
  104. //tcp隧道模式
  105. func ProcessTunnel(c *utils.Conn, s *TunnelModeServer) error {
  106. _, _, rb, err, r := c.GetHost()
  107. if err == nil {
  108. if err := s.auth(r, c, s.config.U, s.config.P); err != nil {
  109. return err
  110. }
  111. }
  112. return s.dealClient(c, s.config, s.config.Target, "", rb)
  113. }
  114. //http代理模式
  115. func ProcessHttp(c *utils.Conn, s *TunnelModeServer) error {
  116. method, addr, rb, err, r := c.GetHost()
  117. if err != nil {
  118. log.Println(err)
  119. c.Close()
  120. return err
  121. }
  122. if err := s.auth(r, c, s.config.U, s.config.P); err != nil {
  123. return err
  124. }
  125. return s.dealClient(c, s.config, addr, method, rb)
  126. }
  127. //多客户端域名代理
  128. func ProcessHost(c *utils.Conn, s *TunnelModeServer) error {
  129. var (
  130. isConn = true
  131. link *utils.Conn
  132. cnf *ServerConfig
  133. host *HostList
  134. wg sync.WaitGroup
  135. )
  136. for {
  137. r, err := http.ReadRequest(bufio.NewReader(c))
  138. if err != nil {
  139. break
  140. }
  141. //首次获取conn
  142. if isConn {
  143. isConn = false
  144. if host, cnf, err = GetKeyByHost(r.Host); err != nil {
  145. log.Printf("the host %s is not found !", r.Host)
  146. break
  147. }
  148. if err = s.auth(r, c, cnf.U, cnf.P); err != nil {
  149. break
  150. }
  151. if link, err = s.GetTunnelAndWriteHost(c, cnf, host.Target); err != nil {
  152. log.Println("get bridge tunnel error: ", err)
  153. break
  154. }
  155. if flag, err := link.ReadFlag(); err != nil || flag == utils.CONN_ERROR {
  156. log.Printf("the host %s connection to %s error", r.Host, host.Target)
  157. break
  158. } else {
  159. wg.Add(1)
  160. go func() {
  161. utils.Relay(c.Conn, link.Conn, cnf.CompressDecode, cnf.Crypt, cnf.Mux)
  162. wg.Done()
  163. }()
  164. }
  165. }
  166. utils.ChangeHostAndHeader(r, host.HostChange, host.HeaderChange, c.Conn.RemoteAddr().String())
  167. b, err := httputil.DumpRequest(r, true)
  168. if err != nil {
  169. break
  170. }
  171. if _, err := link.WriteTo(b, cnf.CompressEncode, cnf.Crypt); err != nil {
  172. break
  173. }
  174. }
  175. wg.Wait()
  176. if cnf != nil && cnf.Mux && link != nil {
  177. link.WriteTo([]byte(utils.IO_EOF), cnf.CompressEncode, cnf.Crypt)
  178. s.bridge.ReturnTunnel(link, getverifyval(cnf.VerifyKey))
  179. } else if link != nil {
  180. link.Close()
  181. }
  182. c.Close()
  183. return nil
  184. }
  185. //web管理方式
  186. type WebServer struct {
  187. bridge *bridge.Tunnel
  188. }
  189. //开始
  190. func (s *WebServer) Start() {
  191. beego.BConfig.WebConfig.Session.SessionOn = true
  192. log.Println("web管理启动,访问端口为", beego.AppConfig.String("httpport"))
  193. beego.SetViewsPath(beego.AppPath + "/web/views")
  194. beego.SetStaticPath("/static", beego.AppPath+"/web/static")
  195. beego.Run()
  196. }
  197. //new
  198. func NewWebServer(bridge *bridge.Tunnel) *WebServer {
  199. s := new(WebServer)
  200. s.bridge = bridge
  201. return s
  202. }
  203. //host
  204. type HostServer struct {
  205. config *ServerConfig
  206. }
  207. //开始
  208. func (s *HostServer) Start() error {
  209. return nil
  210. }
  211. func NewHostServer(cnf *ServerConfig) *HostServer {
  212. s := new(HostServer)
  213. s.config = cnf
  214. return s
  215. }
  216. //close
  217. func (s *HostServer) Close() error {
  218. return nil
  219. }