server.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. package lib
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/astaxie/beego"
  6. "github.com/astaxie/beego/session"
  7. "io/ioutil"
  8. "log"
  9. "net"
  10. "net/http"
  11. "strings"
  12. )
  13. var GlobalHostSessions *session.Manager
  14. const (
  15. VERIFY_EER = "vkey"
  16. WORK_MAIN = "main"
  17. WORK_CHAN = "chan"
  18. RES_SIGN = "sign"
  19. RES_MSG = "msg0"
  20. TEST_FLAG = "tst"
  21. CONN_TCP = "tcp"
  22. CONN_UDP = "udp"
  23. Unauthorized_BYTES = `HTTP/1.1 401 Unauthorized
  24. Content-Type: text/plain; charset=utf-8
  25. WWW-Authenticate: Basic realm="easyProxy"
  26. 401 Unauthorized`
  27. )
  28. type process func(c *Conn, s *TunnelModeServer) error
  29. type HttpModeServer struct {
  30. bridge *Tunnel
  31. httpPort int
  32. enCompress int
  33. deCompress int
  34. vKey string
  35. crypt bool
  36. }
  37. //http
  38. func NewHttpModeServer(httpPort int, bridge *Tunnel, enCompress int, deCompress int, vKey string, crypt bool) *HttpModeServer {
  39. s := new(HttpModeServer)
  40. s.bridge = bridge
  41. s.httpPort = httpPort
  42. s.enCompress = enCompress
  43. s.deCompress = deCompress
  44. s.vKey = vKey
  45. s.crypt = crypt
  46. return s
  47. }
  48. //开始
  49. func (s *HttpModeServer) Start() {
  50. http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  51. retry:
  52. u := beego.AppConfig.String("basic.user")
  53. p := beego.AppConfig.String("basic.password")
  54. if u != "" && p != "" && !checkAuth(r, u, p) {
  55. w.Header().Set("WWW-Authenticate", `Basic realm="easyProxy""`)
  56. w.WriteHeader(401)
  57. w.Write([]byte("401 Unauthorized\n"))
  58. return
  59. }
  60. err, conn := s.bridge.GetSignal(getverifyval(s.vKey))
  61. if err != nil {
  62. BadRequest(w)
  63. return
  64. }
  65. if err := s.writeRequest(r, conn); err != nil {
  66. log.Println("write request to client error:", err)
  67. conn.Close()
  68. goto retry
  69. return
  70. }
  71. err = s.writeResponse(w, conn)
  72. if err != nil {
  73. log.Println("write response error:", err)
  74. conn.Close()
  75. goto retry
  76. return
  77. }
  78. s.bridge.ReturnSignal(conn, getverifyval(s.vKey))
  79. })
  80. log.Fatalln(http.ListenAndServe(fmt.Sprintf(":%d", s.httpPort), nil))
  81. }
  82. //req转为bytes发送给client端
  83. func (s *HttpModeServer) writeRequest(r *http.Request, conn *Conn) error {
  84. raw, err := EncodeRequest(r)
  85. if err != nil {
  86. return err
  87. }
  88. conn.wSign()
  89. conn.WriteConnInfo(s.enCompress, s.deCompress, s.crypt)
  90. c, err := conn.WriteTo(raw, s.enCompress, s.crypt)
  91. if err != nil {
  92. return err
  93. }
  94. if c != len(raw) {
  95. return errors.New("写出长度与字节长度不一致。")
  96. }
  97. return nil
  98. }
  99. //从client读取出Response
  100. func (s *HttpModeServer) writeResponse(w http.ResponseWriter, c *Conn) error {
  101. flags, err := c.ReadFlag()
  102. if err != nil {
  103. return err
  104. }
  105. switch flags {
  106. case RES_SIGN:
  107. buf := make([]byte, 1024*1024*32)
  108. n, err := c.ReadFrom(buf, s.deCompress, s.crypt)
  109. if err != nil {
  110. return err
  111. }
  112. resp, err := DecodeResponse(buf[:n])
  113. if err != nil {
  114. return err
  115. }
  116. bodyBytes, err := ioutil.ReadAll(resp.Body)
  117. if err != nil {
  118. return err
  119. }
  120. for k, v := range resp.Header {
  121. for _, v2 := range v {
  122. w.Header().Set(k, v2)
  123. }
  124. }
  125. w.WriteHeader(resp.StatusCode)
  126. w.Write(bodyBytes)
  127. case RES_MSG:
  128. BadRequest(w)
  129. return errors.New("客户端请求出错")
  130. default:
  131. BadRequest(w)
  132. return errors.New("无法解析此错误")
  133. }
  134. return nil
  135. }
  136. type TunnelModeServer struct {
  137. httpPort int
  138. tunnelTarget string
  139. process process
  140. bridge *Tunnel
  141. listener *net.TCPListener
  142. enCompress int
  143. deCompress int
  144. basicUser string
  145. basicPassword string
  146. vKey string
  147. crypt bool
  148. }
  149. //tcp|http|host
  150. func NewTunnelModeServer(httpPort int, tunnelTarget string, process process, bridge *Tunnel, enCompress, deCompress int, vKey, basicUser, basicPasswd string, crypt bool) *TunnelModeServer {
  151. s := new(TunnelModeServer)
  152. s.httpPort = httpPort
  153. s.bridge = bridge
  154. s.tunnelTarget = tunnelTarget
  155. s.process = process
  156. s.enCompress = enCompress
  157. s.deCompress = deCompress
  158. s.vKey = vKey
  159. s.basicUser = basicUser
  160. s.basicPassword = basicPasswd
  161. s.crypt = crypt
  162. return s
  163. }
  164. //开始
  165. func (s *TunnelModeServer) Start() error {
  166. s.listener, err = net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP("0.0.0.0"), s.httpPort, ""})
  167. if err != nil {
  168. return err
  169. }
  170. for {
  171. conn, err := s.listener.AcceptTCP()
  172. if err != nil {
  173. if strings.Contains(err.Error(), "use of closed network connection") {
  174. break
  175. }
  176. log.Println(err)
  177. continue
  178. }
  179. go s.process(NewConn(conn), s)
  180. }
  181. return nil
  182. }
  183. //权限认证
  184. func (s *TunnelModeServer) auth(r *http.Request, c *Conn, u, p string) error {
  185. if u != "" && p != "" && !checkAuth(r, u, p) {
  186. c.Write([]byte(Unauthorized_BYTES))
  187. c.Close()
  188. return errors.New("401 Unauthorized")
  189. }
  190. return nil
  191. }
  192. //与客户端建立通道
  193. func (s *TunnelModeServer) dealClient(vKey string, en, de int, c *Conn, target string, method string, rb []byte) error {
  194. link, err := s.bridge.GetTunnel(getverifyval(vKey), en, de, s.crypt)
  195. if err != nil {
  196. log.Println(err)
  197. c.Close()
  198. return err
  199. }
  200. if _, err := link.WriteHost(CONN_TCP, target); err != nil {
  201. c.Close()
  202. link.Close()
  203. log.Println(err)
  204. return err
  205. }
  206. if method == "CONNECT" {
  207. fmt.Fprint(c, "HTTP/1.1 200 Connection established\r\n")
  208. } else {
  209. link.WriteTo(rb, en, s.crypt)
  210. }
  211. go relay(link, c, en, s.crypt)
  212. relay(c, link, de, s.crypt)
  213. return nil
  214. }
  215. //close
  216. func (s *TunnelModeServer) Close() error {
  217. return s.listener.Close()
  218. }
  219. //tcp隧道模式
  220. func ProcessTunnel(c *Conn, s *TunnelModeServer) error {
  221. method, _, rb, err, r := c.GetHost()
  222. if err == nil {
  223. if err := s.auth(r, c, s.basicUser, s.basicPassword); err != nil {
  224. return err
  225. }
  226. }
  227. return s.dealClient(s.vKey, s.enCompress, s.deCompress, c, s.tunnelTarget, method, rb)
  228. }
  229. //http代理模式
  230. func ProcessHttp(c *Conn, s *TunnelModeServer) error {
  231. method, addr, rb, err, r := c.GetHost()
  232. if err != nil {
  233. c.Close()
  234. return err
  235. }
  236. if err := s.auth(r, c, s.basicUser, s.basicPassword); err != nil {
  237. return err
  238. }
  239. return s.dealClient(s.vKey, s.enCompress, s.deCompress, c, addr, method, rb)
  240. }
  241. //多客户端域名代理
  242. func ProcessHost(c *Conn, s *TunnelModeServer) error {
  243. method, addr, rb, err, r := c.GetHost()
  244. if err != nil {
  245. c.Close()
  246. return err
  247. }
  248. host, task, err := getKeyByHost(addr)
  249. if err := s.auth(r, c, task.U, task.P); err != nil {
  250. return err
  251. }
  252. if err != nil {
  253. c.Close()
  254. return err
  255. }
  256. de, en := getCompressType(task.Compress)
  257. return s.dealClient(host.Vkey, en, de, c, host.Target, method, rb)
  258. }
  259. //web管理方式
  260. type WebServer struct {
  261. bridge *Tunnel
  262. }
  263. //开始
  264. func (s *WebServer) Start() {
  265. InitFromCsv()
  266. p, _ := beego.AppConfig.Int("hostPort")
  267. t := &TaskList{
  268. TcpPort: p,
  269. Mode: "httpHostServer",
  270. Target: "",
  271. VerifyKey: "",
  272. U: "",
  273. P: "",
  274. Compress: "",
  275. Start: 1,
  276. IsRun: 0,
  277. ClientStatus: 0,
  278. }
  279. AddTask(t)
  280. beego.BConfig.WebConfig.Session.SessionOn = true
  281. log.Println("web管理启动,访问端口为", beego.AppConfig.String("httpport"))
  282. beego.Run()
  283. }
  284. //new
  285. func NewWebServer(bridge *Tunnel) *WebServer {
  286. s := new(WebServer)
  287. s.bridge = bridge
  288. return s
  289. }
  290. //host
  291. type HostServer struct {
  292. crypt bool
  293. }
  294. //开始
  295. func (s *HostServer) Start() error {
  296. return nil
  297. }
  298. //TODO:host模式的客户端,无需指定和监听端口等
  299. func NewHostServer(crypt bool) *HostServer {
  300. s := new(HostServer)
  301. s.crypt = crypt
  302. return s
  303. }
  304. //close
  305. func (s *HostServer) Close() error {
  306. return nil
  307. }