client.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. package vless
  2. import (
  3. "encoding/binary"
  4. "io"
  5. "net"
  6. "github.com/sagernet/sing-vmess"
  7. "github.com/sagernet/sing/common"
  8. "github.com/sagernet/sing/common/buf"
  9. E "github.com/sagernet/sing/common/exceptions"
  10. "github.com/sagernet/sing/common/logger"
  11. M "github.com/sagernet/sing/common/metadata"
  12. N "github.com/sagernet/sing/common/network"
  13. "github.com/gofrs/uuid/v5"
  14. )
  15. type Client struct {
  16. key [16]byte
  17. flow string
  18. logger logger.Logger
  19. }
  20. func NewClient(userId string, flow string, logger logger.Logger) (*Client, error) {
  21. user := uuid.FromStringOrNil(userId)
  22. if user == uuid.Nil {
  23. user = uuid.NewV5(user, userId)
  24. }
  25. switch flow {
  26. case "", "xtls-rprx-vision":
  27. default:
  28. return nil, E.New("unsupported flow: " + flow)
  29. }
  30. return &Client{user, flow, logger}, nil
  31. }
  32. func (c *Client) prepareConn(conn net.Conn) (net.Conn, error) {
  33. if c.flow == FlowVision {
  34. vConn, err := NewVisionConn(conn, c.key, c.logger)
  35. if err != nil {
  36. return nil, E.Cause(err, "initialize vision")
  37. }
  38. conn = vConn
  39. }
  40. return conn, nil
  41. }
  42. func (c *Client) DialConn(conn net.Conn, destination M.Socksaddr) (*Conn, error) {
  43. vConn, err := c.prepareConn(conn)
  44. if err != nil {
  45. return nil, err
  46. }
  47. serverConn := &Conn{Conn: conn, protocolConn: vConn, key: c.key, command: vmess.CommandTCP, destination: destination, flow: c.flow}
  48. return serverConn, common.Error(serverConn.Write(nil))
  49. }
  50. func (c *Client) DialEarlyConn(conn net.Conn, destination M.Socksaddr) (*Conn, error) {
  51. vConn, err := c.prepareConn(conn)
  52. if err != nil {
  53. return nil, err
  54. }
  55. return &Conn{Conn: conn, protocolConn: vConn, key: c.key, command: vmess.CommandTCP, destination: destination, flow: c.flow}, nil
  56. }
  57. func (c *Client) DialPacketConn(conn net.Conn, destination M.Socksaddr) (*PacketConn, error) {
  58. serverConn := &PacketConn{Conn: conn, key: c.key, destination: destination, flow: c.flow}
  59. return serverConn, common.Error(serverConn.Write(nil))
  60. }
  61. func (c *Client) DialEarlyPacketConn(conn net.Conn, destination M.Socksaddr) (*PacketConn, error) {
  62. return &PacketConn{Conn: conn, key: c.key, destination: destination, flow: c.flow}, nil
  63. }
  64. func (c *Client) DialXUDPPacketConn(conn net.Conn, destination M.Socksaddr) (vmess.PacketConn, error) {
  65. serverConn := &Conn{Conn: conn, protocolConn: conn, key: c.key, command: vmess.CommandMux, destination: destination, flow: c.flow}
  66. err := common.Error(serverConn.Write(nil))
  67. if err != nil {
  68. return nil, err
  69. }
  70. return vmess.NewXUDPConn(serverConn, destination), nil
  71. }
  72. func (c *Client) DialEarlyXUDPPacketConn(conn net.Conn, destination M.Socksaddr) (vmess.PacketConn, error) {
  73. return vmess.NewXUDPConn(&Conn{Conn: conn, protocolConn: conn, key: c.key, command: vmess.CommandMux, destination: destination, flow: c.flow}, destination), nil
  74. }
  75. var _ N.EarlyConn = (*Conn)(nil)
  76. type Conn struct {
  77. net.Conn
  78. protocolConn net.Conn
  79. key [16]byte
  80. command byte
  81. destination M.Socksaddr
  82. flow string
  83. requestWritten bool
  84. responseRead bool
  85. }
  86. func (c *Conn) NeedHandshake() bool {
  87. return !c.requestWritten
  88. }
  89. func (c *Conn) Read(b []byte) (n int, err error) {
  90. if !c.responseRead {
  91. err = ReadResponse(c.Conn)
  92. if err != nil {
  93. return
  94. }
  95. c.responseRead = true
  96. }
  97. return c.protocolConn.Read(b)
  98. }
  99. func (c *Conn) Write(b []byte) (n int, err error) {
  100. if !c.requestWritten {
  101. request := Request{c.key, c.command, c.destination, c.flow}
  102. if c.protocolConn != nil {
  103. err = WriteRequest(c.Conn, request, nil)
  104. } else {
  105. err = WriteRequest(c.Conn, request, b)
  106. }
  107. if err == nil {
  108. n = len(b)
  109. }
  110. c.requestWritten = true
  111. if c.protocolConn == nil {
  112. return
  113. }
  114. }
  115. return c.protocolConn.Write(b)
  116. }
  117. func (c *Conn) NeedAdditionalReadDeadline() bool {
  118. return true
  119. }
  120. func (c *Conn) Upstream() any {
  121. return c.Conn
  122. }
  123. type PacketConn struct {
  124. net.Conn
  125. key [16]byte
  126. destination M.Socksaddr
  127. flow string
  128. requestWritten bool
  129. responseRead bool
  130. }
  131. func (c *PacketConn) Read(b []byte) (n int, err error) {
  132. if !c.responseRead {
  133. err = ReadResponse(c.Conn)
  134. if err != nil {
  135. return
  136. }
  137. c.responseRead = true
  138. }
  139. var length uint16
  140. err = binary.Read(c.Conn, binary.BigEndian, &length)
  141. if err != nil {
  142. return
  143. }
  144. if cap(b) < int(length) {
  145. return 0, io.ErrShortBuffer
  146. }
  147. return io.ReadFull(c.Conn, b[:length])
  148. }
  149. func (c *PacketConn) Write(b []byte) (n int, err error) {
  150. if !c.requestWritten {
  151. err = WritePacketRequest(c.Conn, Request{c.key, vmess.CommandUDP, c.destination, c.flow}, nil)
  152. if err == nil {
  153. n = len(b)
  154. }
  155. c.requestWritten = true
  156. }
  157. err = binary.Write(c.Conn, binary.BigEndian, uint16(len(b)))
  158. if err != nil {
  159. return
  160. }
  161. return c.Conn.Write(b)
  162. }
  163. func (c *PacketConn) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  164. defer buffer.Release()
  165. dataLen := buffer.Len()
  166. binary.BigEndian.PutUint16(buffer.ExtendHeader(2), uint16(dataLen))
  167. if !c.requestWritten {
  168. err := WritePacketRequest(c.Conn, Request{c.key, vmess.CommandUDP, c.destination, c.flow}, buffer.Bytes())
  169. c.requestWritten = true
  170. return err
  171. }
  172. return common.Error(c.Conn.Write(buffer.Bytes()))
  173. }
  174. func (c *PacketConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
  175. n, err = c.Read(p)
  176. if err != nil {
  177. return
  178. }
  179. if c.destination.IsFqdn() {
  180. addr = c.destination
  181. } else {
  182. addr = c.destination.UDPAddr()
  183. }
  184. return
  185. }
  186. func (c *PacketConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
  187. return c.Write(p)
  188. }
  189. func (c *PacketConn) FrontHeadroom() int {
  190. return 2
  191. }
  192. func (c *PacketConn) NeedAdditionalReadDeadline() bool {
  193. return true
  194. }
  195. func (c *PacketConn) Upstream() any {
  196. return c.Conn
  197. }