service.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. package vless
  2. import (
  3. "context"
  4. "encoding/binary"
  5. "io"
  6. "net"
  7. "github.com/sagernet/sing-vmess"
  8. "github.com/sagernet/sing/common/auth"
  9. "github.com/sagernet/sing/common/buf"
  10. "github.com/sagernet/sing/common/bufio"
  11. E "github.com/sagernet/sing/common/exceptions"
  12. "github.com/sagernet/sing/common/logger"
  13. M "github.com/sagernet/sing/common/metadata"
  14. N "github.com/sagernet/sing/common/network"
  15. "github.com/gofrs/uuid/v5"
  16. )
  17. type Service[T comparable] struct {
  18. userMap map[[16]byte]T
  19. userFlow map[T]string
  20. logger logger.Logger
  21. handler Handler
  22. }
  23. type Handler interface {
  24. N.TCPConnectionHandler
  25. N.UDPConnectionHandler
  26. E.Handler
  27. }
  28. func NewService[T comparable](logger logger.Logger, handler Handler) *Service[T] {
  29. return &Service[T]{
  30. logger: logger,
  31. handler: handler,
  32. }
  33. }
  34. func (s *Service[T]) UpdateUsers(userList []T, userUUIDList []string, userFlowList []string) {
  35. userMap := make(map[[16]byte]T)
  36. userFlowMap := make(map[T]string)
  37. for i, userName := range userList {
  38. userID := uuid.FromStringOrNil(userUUIDList[i])
  39. if userID == uuid.Nil {
  40. userID = uuid.NewV5(uuid.Nil, userUUIDList[i])
  41. }
  42. userMap[userID] = userName
  43. userFlowMap[userName] = userFlowList[i]
  44. }
  45. s.userMap = userMap
  46. s.userFlow = userFlowMap
  47. }
  48. var _ N.TCPConnectionHandler = (*Service[int])(nil)
  49. func (s *Service[T]) NewConnection(ctx context.Context, conn net.Conn, metadata M.Metadata) error {
  50. request, err := ReadRequest(conn)
  51. if err != nil {
  52. return err
  53. }
  54. user, loaded := s.userMap[request.UUID]
  55. if !loaded {
  56. return E.New("unknown UUID: ", uuid.FromBytesOrNil(request.UUID[:]))
  57. }
  58. ctx = auth.ContextWithUser(ctx, user)
  59. metadata.Destination = request.Destination
  60. userFlow := s.userFlow[user]
  61. if request.Flow == FlowVision && request.Command == vmess.NetworkUDP {
  62. return E.New(FlowVision, " flow does not support UDP")
  63. } else if request.Flow != userFlow {
  64. return E.New("flow mismatch: expected ", flowName(userFlow), ", but got ", flowName(request.Flow))
  65. }
  66. if request.Command == vmess.CommandUDP {
  67. return s.handler.NewPacketConnection(ctx, &serverPacketConn{ExtendedConn: bufio.NewExtendedConn(conn), destination: request.Destination}, metadata)
  68. }
  69. responseConn := &serverConn{ExtendedConn: bufio.NewExtendedConn(conn), writer: bufio.NewVectorisedWriter(conn)}
  70. switch userFlow {
  71. case FlowVision:
  72. conn, err = NewVisionConn(responseConn, conn, request.UUID, s.logger)
  73. if err != nil {
  74. return E.Cause(err, "initialize vision")
  75. }
  76. case "":
  77. conn = responseConn
  78. default:
  79. return E.New("unknown flow: ", userFlow)
  80. }
  81. switch request.Command {
  82. case vmess.CommandTCP:
  83. return s.handler.NewConnection(ctx, conn, metadata)
  84. case vmess.CommandMux:
  85. return vmess.HandleMuxConnection(ctx, conn, s.handler)
  86. default:
  87. return E.New("unknown command: ", request.Command)
  88. }
  89. }
  90. func flowName(value string) string {
  91. if value == "" {
  92. return "none"
  93. }
  94. return value
  95. }
  96. var _ N.VectorisedWriter = (*serverConn)(nil)
  97. type serverConn struct {
  98. N.ExtendedConn
  99. writer N.VectorisedWriter
  100. responseWritten bool
  101. }
  102. func (c *serverConn) Read(b []byte) (n int, err error) {
  103. return c.ExtendedConn.Read(b)
  104. }
  105. func (c *serverConn) Write(b []byte) (n int, err error) {
  106. if !c.responseWritten {
  107. _, err = bufio.WriteVectorised(c.writer, [][]byte{{Version, 0}, b})
  108. if err == nil {
  109. n = len(b)
  110. }
  111. c.responseWritten = true
  112. return
  113. }
  114. return c.ExtendedConn.Write(b)
  115. }
  116. func (c *serverConn) WriteBuffer(buffer *buf.Buffer) error {
  117. if !c.responseWritten {
  118. header := buffer.ExtendHeader(2)
  119. header[0] = Version
  120. header[1] = 0
  121. c.responseWritten = true
  122. }
  123. return c.ExtendedConn.WriteBuffer(buffer)
  124. }
  125. func (c *serverConn) WriteVectorised(buffers []*buf.Buffer) error {
  126. if !c.responseWritten {
  127. err := c.writer.WriteVectorised(append([]*buf.Buffer{buf.As([]byte{Version, 0})}, buffers...))
  128. c.responseWritten = true
  129. return err
  130. }
  131. return c.writer.WriteVectorised(buffers)
  132. }
  133. func (c *serverConn) NeedAdditionalReadDeadline() bool {
  134. return true
  135. }
  136. func (c *serverConn) FrontHeadroom() int {
  137. if c.responseWritten {
  138. return 0
  139. }
  140. return 2
  141. }
  142. func (c *serverConn) ReaderReplaceable() bool {
  143. return true
  144. }
  145. func (c *serverConn) WriterReplaceable() bool {
  146. return c.responseWritten
  147. }
  148. func (c *serverConn) Upstream() any {
  149. return c.ExtendedConn
  150. }
  151. type serverPacketConn struct {
  152. N.ExtendedConn
  153. responseWriter io.Writer
  154. responseWritten bool
  155. destination M.Socksaddr
  156. }
  157. func (c *serverPacketConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
  158. n, err = c.ExtendedConn.Read(p)
  159. if err != nil {
  160. return
  161. }
  162. if c.destination.IsFqdn() {
  163. addr = c.destination
  164. } else {
  165. addr = c.destination.UDPAddr()
  166. }
  167. return
  168. }
  169. func (c *serverPacketConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
  170. if !c.responseWritten {
  171. if c.responseWriter == nil {
  172. var packetLen [2]byte
  173. binary.BigEndian.PutUint16(packetLen[:], uint16(len(p)))
  174. _, err = bufio.WriteVectorised(bufio.NewVectorisedWriter(c.ExtendedConn), [][]byte{{Version, 0}, packetLen[:], p})
  175. if err == nil {
  176. n = len(p)
  177. }
  178. c.responseWritten = true
  179. return
  180. } else {
  181. _, err = c.responseWriter.Write([]byte{Version, 0})
  182. if err != nil {
  183. return
  184. }
  185. c.responseWritten = true
  186. }
  187. }
  188. return c.ExtendedConn.Write(p)
  189. }
  190. func (c *serverPacketConn) ReadPacket(buffer *buf.Buffer) (destination M.Socksaddr, err error) {
  191. var packetLen uint16
  192. err = binary.Read(c.ExtendedConn, binary.BigEndian, &packetLen)
  193. if err != nil {
  194. return
  195. }
  196. _, err = buffer.ReadFullFrom(c.ExtendedConn, int(packetLen))
  197. if err != nil {
  198. return
  199. }
  200. destination = c.destination
  201. return
  202. }
  203. func (c *serverPacketConn) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  204. if !c.responseWritten {
  205. if c.responseWriter == nil {
  206. var packetLen [2]byte
  207. binary.BigEndian.PutUint16(packetLen[:], uint16(buffer.Len()))
  208. err := bufio.NewVectorisedWriter(c.ExtendedConn).WriteVectorised([]*buf.Buffer{buf.As([]byte{Version, 0}), buf.As(packetLen[:]), buffer})
  209. c.responseWritten = true
  210. return err
  211. } else {
  212. _, err := c.responseWriter.Write([]byte{Version, 0})
  213. if err != nil {
  214. return err
  215. }
  216. c.responseWritten = true
  217. }
  218. }
  219. packetLen := buffer.Len()
  220. binary.BigEndian.PutUint16(buffer.ExtendHeader(2), uint16(packetLen))
  221. return c.ExtendedConn.WriteBuffer(buffer)
  222. }
  223. func (c *serverPacketConn) FrontHeadroom() int {
  224. return 2
  225. }
  226. func (c *serverPacketConn) Upstream() any {
  227. return c.ExtendedConn
  228. }