server.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. package hysteria
  2. import (
  3. "context"
  4. "io"
  5. "time"
  6. "github.com/xtls/xray-core/common"
  7. "github.com/xtls/xray-core/common/buf"
  8. "github.com/xtls/xray-core/common/errors"
  9. "github.com/xtls/xray-core/common/log"
  10. "github.com/xtls/xray-core/common/net"
  11. "github.com/xtls/xray-core/common/protocol"
  12. "github.com/xtls/xray-core/common/session"
  13. "github.com/xtls/xray-core/core"
  14. "github.com/xtls/xray-core/features/policy"
  15. "github.com/xtls/xray-core/features/routing"
  16. "github.com/xtls/xray-core/proxy/hysteria/account"
  17. "github.com/xtls/xray-core/transport"
  18. "github.com/xtls/xray-core/transport/internet/hysteria"
  19. "github.com/xtls/xray-core/transport/internet/stat"
  20. )
  21. type Server struct {
  22. config *ServerConfig
  23. validator *account.Validator
  24. policyManager policy.Manager
  25. }
  26. func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) {
  27. validator := account.NewValidator()
  28. for _, user := range config.Users {
  29. u, err := user.ToMemoryUser()
  30. if err != nil {
  31. return nil, errors.New("failed to get hysteria user").Base(err).AtError()
  32. }
  33. if err := validator.Add(u); err != nil {
  34. return nil, errors.New("failed to add user").Base(err).AtError()
  35. }
  36. }
  37. v := core.MustFromContext(ctx)
  38. s := &Server{
  39. config: config,
  40. validator: validator,
  41. policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager),
  42. }
  43. return s, nil
  44. }
  45. func (s *Server) HysteriaInboundValidator() *account.Validator {
  46. return s.validator
  47. }
  48. func (s *Server) AddUser(ctx context.Context, u *protocol.MemoryUser) error {
  49. return s.validator.Add(u)
  50. }
  51. func (s *Server) RemoveUser(ctx context.Context, e string) error {
  52. return s.validator.Del(e)
  53. }
  54. func (s *Server) GetUser(ctx context.Context, email string) *protocol.MemoryUser {
  55. return s.validator.GetByEmail(email)
  56. }
  57. func (s *Server) GetUsers(ctx context.Context) []*protocol.MemoryUser {
  58. return s.validator.GetAll()
  59. }
  60. func (s *Server) GetUsersCount(context.Context) int64 {
  61. return s.validator.GetCount()
  62. }
  63. func (s *Server) Network() []net.Network {
  64. return []net.Network{net.Network_TCP}
  65. }
  66. func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Connection, dispatcher routing.Dispatcher) error {
  67. inbound := session.InboundFromContext(ctx)
  68. inbound.Name = "hysteria"
  69. inbound.CanSpliceCopy = 3
  70. var useremail string
  71. var userlevel uint32
  72. type User interface{ User() *protocol.MemoryUser }
  73. if v, ok := conn.(User); ok {
  74. inbound.User = v.User()
  75. if inbound.User != nil {
  76. useremail = inbound.User.Email
  77. userlevel = inbound.User.Level
  78. }
  79. }
  80. iConn := stat.TryUnwrapStatsConn(conn)
  81. if _, ok := iConn.(*hysteria.InterUdpConn); ok {
  82. r := io.Reader(conn)
  83. b := make([]byte, MaxUDPSize)
  84. df := &Defragger{}
  85. var firstMsg *UDPMessage
  86. var firstDest net.Destination
  87. for {
  88. n, err := r.Read(b)
  89. if err != nil {
  90. return err
  91. }
  92. msg, err := ParseUDPMessage(b[:n])
  93. if err != nil {
  94. continue
  95. }
  96. dfMsg := df.Feed(msg)
  97. if dfMsg == nil {
  98. continue
  99. }
  100. firstMsg = dfMsg
  101. firstDest, err = net.ParseDestination("udp:" + firstMsg.Addr)
  102. if err != nil {
  103. errors.LogDebug(context.Background(), dfMsg.Addr, " ParseDestination err ", err)
  104. continue
  105. }
  106. break
  107. }
  108. reader := &UDPReader{
  109. Reader: r,
  110. buf: b,
  111. df: df,
  112. firstMsg: firstMsg,
  113. firstDest: &firstDest,
  114. }
  115. writer := &UDPWriter{
  116. Writer: conn,
  117. buf: make([]byte, MaxUDPSize),
  118. addr: firstMsg.Addr,
  119. }
  120. return dispatcher.DispatchLink(ctx, firstDest, &transport.Link{
  121. Reader: reader,
  122. Writer: writer,
  123. })
  124. } else {
  125. sessionPolicy := s.policyManager.ForLevel(userlevel)
  126. common.Must(conn.SetReadDeadline(time.Now().Add(sessionPolicy.Timeouts.Handshake)))
  127. addr, err := ReadTCPRequest(conn)
  128. if err != nil {
  129. log.Record(&log.AccessMessage{
  130. From: conn.RemoteAddr(),
  131. To: "",
  132. Status: log.AccessRejected,
  133. Reason: err,
  134. })
  135. return errors.New("failed to create request from: ", conn.RemoteAddr()).Base(err)
  136. }
  137. common.Must(conn.SetReadDeadline(time.Time{}))
  138. dest, err := net.ParseDestination("tcp:" + addr)
  139. if err != nil {
  140. return err
  141. }
  142. ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{
  143. From: conn.RemoteAddr(),
  144. To: dest,
  145. Status: log.AccessAccepted,
  146. Reason: "",
  147. Email: useremail,
  148. })
  149. errors.LogInfo(ctx, "tunnelling request to ", dest)
  150. bufferedWriter := buf.NewBufferedWriter(buf.NewWriter(conn))
  151. err = WriteTCPResponse(bufferedWriter, true, "")
  152. if err != nil {
  153. return errors.New("failed to write response").Base(err)
  154. }
  155. if err := bufferedWriter.SetBuffered(false); err != nil {
  156. return err
  157. }
  158. return dispatcher.DispatchLink(ctx, dest, &transport.Link{
  159. Reader: buf.NewReader(conn),
  160. Writer: bufferedWriter,
  161. })
  162. }
  163. }
  164. func init() {
  165. common.Must(common.RegisterConfig((*ServerConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
  166. return NewServer(ctx, config.(*ServerConfig))
  167. }))
  168. }