server.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. package tuic
  2. import (
  3. "bufio"
  4. "context"
  5. "crypto/tls"
  6. "net"
  7. "time"
  8. "github.com/metacubex/mihomo/adapter/inbound"
  9. N "github.com/metacubex/mihomo/common/net"
  10. "github.com/metacubex/mihomo/common/utils"
  11. C "github.com/metacubex/mihomo/constant"
  12. "github.com/metacubex/mihomo/transport/socks5"
  13. "github.com/metacubex/mihomo/transport/tuic/common"
  14. v4 "github.com/metacubex/mihomo/transport/tuic/v4"
  15. v5 "github.com/metacubex/mihomo/transport/tuic/v5"
  16. "github.com/gofrs/uuid/v5"
  17. "github.com/metacubex/quic-go"
  18. )
  19. type ServerOption struct {
  20. HandleTcpFn func(conn net.Conn, addr socks5.Addr, additions ...inbound.Addition) error
  21. HandleUdpFn func(addr socks5.Addr, packet C.UDPPacket, additions ...inbound.Addition) error
  22. TlsConfig *tls.Config
  23. QuicConfig *quic.Config
  24. Tokens [][32]byte // V4 special
  25. Users map[[16]byte]string // V5 special
  26. CongestionController string
  27. AuthenticationTimeout time.Duration
  28. MaxUdpRelayPacketSize int
  29. CWND int
  30. }
  31. type Server struct {
  32. *ServerOption
  33. optionV4 *v4.ServerOption
  34. optionV5 *v5.ServerOption
  35. listener *quic.EarlyListener
  36. }
  37. func (s *Server) Serve() error {
  38. for {
  39. conn, err := s.listener.Accept(context.Background())
  40. if err != nil {
  41. return err
  42. }
  43. common.SetCongestionController(conn, s.CongestionController, s.CWND)
  44. h := &serverHandler{
  45. Server: s,
  46. quicConn: conn,
  47. uuid: utils.NewUUIDV4(),
  48. }
  49. if h.optionV4 != nil {
  50. h.v4Handler = v4.NewServerHandler(h.optionV4, conn, h.uuid)
  51. }
  52. if h.optionV5 != nil {
  53. h.v5Handler = v5.NewServerHandler(h.optionV5, conn, h.uuid)
  54. }
  55. go h.handle()
  56. }
  57. }
  58. func (s *Server) Close() error {
  59. return s.listener.Close()
  60. }
  61. type serverHandler struct {
  62. *Server
  63. quicConn quic.EarlyConnection
  64. uuid uuid.UUID
  65. v4Handler common.ServerHandler
  66. v5Handler common.ServerHandler
  67. }
  68. func (s *serverHandler) handle() {
  69. go func() {
  70. _ = s.handleUniStream()
  71. }()
  72. go func() {
  73. _ = s.handleStream()
  74. }()
  75. go func() {
  76. _ = s.handleMessage()
  77. }()
  78. <-s.quicConn.HandshakeComplete()
  79. time.AfterFunc(s.AuthenticationTimeout, func() {
  80. if s.v4Handler != nil {
  81. if s.v4Handler.AuthOk() {
  82. return
  83. }
  84. }
  85. if s.v5Handler != nil {
  86. if s.v5Handler.AuthOk() {
  87. return
  88. }
  89. }
  90. if s.v4Handler != nil {
  91. s.v4Handler.HandleTimeout()
  92. }
  93. if s.v5Handler != nil {
  94. s.v5Handler.HandleTimeout()
  95. }
  96. })
  97. }
  98. func (s *serverHandler) handleMessage() (err error) {
  99. for {
  100. var message []byte
  101. message, err = s.quicConn.ReceiveDatagram(context.Background())
  102. if err != nil {
  103. return err
  104. }
  105. go func() (err error) {
  106. if len(message) > 0 {
  107. switch message[0] {
  108. case v4.VER:
  109. if s.v4Handler != nil {
  110. return s.v4Handler.HandleMessage(message)
  111. }
  112. case v5.VER:
  113. if s.v5Handler != nil {
  114. return s.v5Handler.HandleMessage(message)
  115. }
  116. }
  117. }
  118. return
  119. }()
  120. }
  121. }
  122. func (s *serverHandler) handleStream() (err error) {
  123. for {
  124. var quicStream quic.Stream
  125. quicStream, err = s.quicConn.AcceptStream(context.Background())
  126. if err != nil {
  127. return err
  128. }
  129. go func() (err error) {
  130. stream := common.NewQuicStreamConn(
  131. quicStream,
  132. s.quicConn.LocalAddr(),
  133. s.quicConn.RemoteAddr(),
  134. nil,
  135. )
  136. conn := N.NewBufferedConn(stream)
  137. verBytes, err := conn.Peek(1)
  138. if err != nil {
  139. _ = conn.Close()
  140. return err
  141. }
  142. switch verBytes[0] {
  143. case v4.VER:
  144. if s.v4Handler != nil {
  145. return s.v4Handler.HandleStream(conn)
  146. }
  147. case v5.VER:
  148. if s.v5Handler != nil {
  149. return s.v5Handler.HandleStream(conn)
  150. }
  151. }
  152. return
  153. }()
  154. }
  155. }
  156. func (s *serverHandler) handleUniStream() (err error) {
  157. for {
  158. var stream quic.ReceiveStream
  159. stream, err = s.quicConn.AcceptUniStream(context.Background())
  160. if err != nil {
  161. return err
  162. }
  163. go func() (err error) {
  164. defer func() {
  165. stream.CancelRead(0)
  166. }()
  167. reader := bufio.NewReader(stream)
  168. verBytes, err := reader.Peek(1)
  169. if err != nil {
  170. return err
  171. }
  172. switch verBytes[0] {
  173. case v4.VER:
  174. if s.v4Handler != nil {
  175. return s.v4Handler.HandleUniStream(reader)
  176. }
  177. case v5.VER:
  178. if s.v5Handler != nil {
  179. return s.v5Handler.HandleUniStream(reader)
  180. }
  181. }
  182. return
  183. }()
  184. }
  185. }
  186. func NewServer(option *ServerOption, pc net.PacketConn) (*Server, error) {
  187. listener, err := quic.ListenEarly(pc, option.TlsConfig, option.QuicConfig)
  188. if err != nil {
  189. return nil, err
  190. }
  191. server := &Server{
  192. ServerOption: option,
  193. listener: listener,
  194. }
  195. if len(option.Tokens) > 0 {
  196. server.optionV4 = &v4.ServerOption{
  197. HandleTcpFn: option.HandleTcpFn,
  198. HandleUdpFn: option.HandleUdpFn,
  199. Tokens: option.Tokens,
  200. MaxUdpRelayPacketSize: option.MaxUdpRelayPacketSize,
  201. }
  202. }
  203. if len(option.Users) > 0 {
  204. maxUdpRelayPacketSize := option.MaxUdpRelayPacketSize
  205. if maxUdpRelayPacketSize > MaxFragSizeV5 {
  206. maxUdpRelayPacketSize = MaxFragSizeV5
  207. }
  208. server.optionV5 = &v5.ServerOption{
  209. HandleTcpFn: option.HandleTcpFn,
  210. HandleUdpFn: option.HandleUdpFn,
  211. Users: option.Users,
  212. MaxUdpRelayPacketSize: option.MaxUdpRelayPacketSize,
  213. }
  214. }
  215. return server, nil
  216. }