client.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. package vless
  2. import (
  3. "encoding/binary"
  4. "io"
  5. "net"
  6. "sync"
  7. "github.com/sagernet/sing-vmess"
  8. "github.com/sagernet/sing/common"
  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 Client struct {
  18. key [16]byte
  19. flow string
  20. logger logger.Logger
  21. }
  22. func NewClient(userId string, flow string, logger logger.Logger) (*Client, error) {
  23. user := uuid.FromStringOrNil(userId)
  24. if user == uuid.Nil {
  25. user = uuid.NewV5(user, userId)
  26. }
  27. switch flow {
  28. case "", "xtls-rprx-vision":
  29. default:
  30. return nil, E.New("unsupported flow: " + flow)
  31. }
  32. return &Client{user, flow, logger}, nil
  33. }
  34. func (c *Client) prepareConn(conn net.Conn, tlsConn net.Conn) (net.Conn, error) {
  35. if c.flow == FlowVision {
  36. protocolConn, err := NewVisionConn(conn, tlsConn, c.key, c.logger)
  37. if err != nil {
  38. return nil, E.Cause(err, "initialize vision")
  39. }
  40. conn = protocolConn
  41. }
  42. return conn, nil
  43. }
  44. func (c *Client) DialConn(conn net.Conn, destination M.Socksaddr) (net.Conn, error) {
  45. remoteConn := NewConn(conn, c.key, vmess.CommandTCP, destination, c.flow)
  46. protocolConn, err := c.prepareConn(remoteConn, conn)
  47. if err != nil {
  48. return nil, err
  49. }
  50. return protocolConn, common.Error(remoteConn.Write(nil))
  51. }
  52. func (c *Client) DialEarlyConn(conn net.Conn, destination M.Socksaddr) (net.Conn, error) {
  53. return c.prepareConn(NewConn(conn, c.key, vmess.CommandTCP, destination, c.flow), conn)
  54. }
  55. func (c *Client) DialPacketConn(conn net.Conn, destination M.Socksaddr) (*PacketConn, error) {
  56. serverConn := &PacketConn{Conn: conn, key: c.key, destination: destination, flow: c.flow}
  57. return serverConn, common.Error(serverConn.Write(nil))
  58. }
  59. func (c *Client) DialEarlyPacketConn(conn net.Conn, destination M.Socksaddr) (*PacketConn, error) {
  60. return &PacketConn{Conn: conn, key: c.key, destination: destination, flow: c.flow}, nil
  61. }
  62. func (c *Client) DialXUDPPacketConn(conn net.Conn, destination M.Socksaddr) (vmess.PacketConn, error) {
  63. remoteConn := NewConn(conn, c.key, vmess.CommandTCP, destination, c.flow)
  64. protocolConn, err := c.prepareConn(remoteConn, conn)
  65. if err != nil {
  66. return nil, err
  67. }
  68. return vmess.NewXUDPConn(protocolConn, destination), common.Error(remoteConn.Write(nil))
  69. }
  70. func (c *Client) DialEarlyXUDPPacketConn(conn net.Conn, destination M.Socksaddr) (vmess.PacketConn, error) {
  71. remoteConn := NewConn(conn, c.key, vmess.CommandMux, destination, c.flow)
  72. protocolConn, err := c.prepareConn(remoteConn, conn)
  73. if err != nil {
  74. return nil, err
  75. }
  76. return vmess.NewXUDPConn(protocolConn, destination), common.Error(remoteConn.Write(nil))
  77. }
  78. var (
  79. _ N.EarlyConn = (*Conn)(nil)
  80. _ N.VectorisedWriter = (*Conn)(nil)
  81. )
  82. type Conn struct {
  83. N.ExtendedConn
  84. writer N.VectorisedWriter
  85. request Request
  86. requestWritten bool
  87. responseRead bool
  88. }
  89. func NewConn(conn net.Conn, uuid [16]byte, command byte, destination M.Socksaddr, flow string) *Conn {
  90. return &Conn{
  91. ExtendedConn: bufio.NewExtendedConn(conn),
  92. writer: bufio.NewVectorisedWriter(conn),
  93. request: Request{
  94. UUID: uuid,
  95. Command: command,
  96. Destination: destination,
  97. Flow: flow,
  98. },
  99. }
  100. }
  101. func (c *Conn) Read(b []byte) (n int, err error) {
  102. if !c.responseRead {
  103. err = ReadResponse(c.ExtendedConn)
  104. if err != nil {
  105. return
  106. }
  107. c.responseRead = true
  108. }
  109. return c.ExtendedConn.Read(b)
  110. }
  111. func (c *Conn) ReadBuffer(buffer *buf.Buffer) error {
  112. if !c.responseRead {
  113. err := ReadResponse(c.ExtendedConn)
  114. if err != nil {
  115. return err
  116. }
  117. c.responseRead = true
  118. }
  119. return c.ExtendedConn.ReadBuffer(buffer)
  120. }
  121. func (c *Conn) Write(b []byte) (n int, err error) {
  122. if !c.requestWritten {
  123. err = WriteRequest(c.ExtendedConn, c.request, b)
  124. if err == nil {
  125. n = len(b)
  126. }
  127. c.requestWritten = true
  128. return
  129. }
  130. return c.ExtendedConn.Write(b)
  131. }
  132. func (c *Conn) WriteBuffer(buffer *buf.Buffer) error {
  133. if !c.requestWritten {
  134. err := EncodeRequest(c.request, buf.With(buffer.ExtendHeader(RequestLen(c.request))))
  135. if err != nil {
  136. return err
  137. }
  138. c.requestWritten = true
  139. }
  140. return c.ExtendedConn.WriteBuffer(buffer)
  141. }
  142. func (c *Conn) WriteVectorised(buffers []*buf.Buffer) error {
  143. if !c.requestWritten {
  144. buffer := buf.NewSize(RequestLen(c.request))
  145. err := EncodeRequest(c.request, buffer)
  146. if err != nil {
  147. buffer.Release()
  148. return err
  149. }
  150. c.requestWritten = true
  151. return c.writer.WriteVectorised(append([]*buf.Buffer{buffer}, buffers...))
  152. }
  153. return c.writer.WriteVectorised(buffers)
  154. }
  155. func (c *Conn) ReaderReplaceable() bool {
  156. return c.responseRead
  157. }
  158. func (c *Conn) WriterReplaceable() bool {
  159. return c.requestWritten
  160. }
  161. func (c *Conn) NeedHandshake() bool {
  162. return !c.requestWritten
  163. }
  164. func (c *Conn) FrontHeadroom() int {
  165. if c.requestWritten {
  166. return 0
  167. }
  168. return RequestLen(c.request)
  169. }
  170. func (c *Conn) Upstream() any {
  171. return c.ExtendedConn
  172. }
  173. type PacketConn struct {
  174. net.Conn
  175. access sync.Mutex
  176. key [16]byte
  177. destination M.Socksaddr
  178. flow string
  179. requestWritten bool
  180. responseRead bool
  181. }
  182. func (c *PacketConn) Read(b []byte) (n int, err error) {
  183. if !c.responseRead {
  184. err = ReadResponse(c.Conn)
  185. if err != nil {
  186. return
  187. }
  188. c.responseRead = true
  189. }
  190. var length uint16
  191. err = binary.Read(c.Conn, binary.BigEndian, &length)
  192. if err != nil {
  193. return
  194. }
  195. if cap(b) < int(length) {
  196. return 0, io.ErrShortBuffer
  197. }
  198. return io.ReadFull(c.Conn, b[:length])
  199. }
  200. func (c *PacketConn) Write(b []byte) (n int, err error) {
  201. if !c.requestWritten {
  202. c.access.Lock()
  203. if c.requestWritten {
  204. c.access.Unlock()
  205. } else {
  206. err = WritePacketRequest(c.Conn, Request{c.key, vmess.CommandUDP, c.destination, c.flow}, nil)
  207. if err == nil {
  208. n = len(b)
  209. }
  210. c.requestWritten = true
  211. c.access.Unlock()
  212. }
  213. }
  214. err = binary.Write(c.Conn, binary.BigEndian, uint16(len(b)))
  215. if err != nil {
  216. return
  217. }
  218. return c.Conn.Write(b)
  219. }
  220. func (c *PacketConn) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  221. defer buffer.Release()
  222. dataLen := buffer.Len()
  223. binary.BigEndian.PutUint16(buffer.ExtendHeader(2), uint16(dataLen))
  224. if !c.requestWritten {
  225. c.access.Lock()
  226. if c.requestWritten {
  227. c.access.Unlock()
  228. } else {
  229. err := WritePacketRequest(c.Conn, Request{c.key, vmess.CommandUDP, c.destination, c.flow}, buffer.Bytes())
  230. c.requestWritten = true
  231. c.access.Unlock()
  232. return err
  233. }
  234. }
  235. return common.Error(c.Conn.Write(buffer.Bytes()))
  236. }
  237. func (c *PacketConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
  238. n, err = c.Read(p)
  239. if err != nil {
  240. return
  241. }
  242. if c.destination.IsFqdn() {
  243. addr = c.destination
  244. } else {
  245. addr = c.destination.UDPAddr()
  246. }
  247. return
  248. }
  249. func (c *PacketConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
  250. return c.Write(p)
  251. }
  252. func (c *PacketConn) FrontHeadroom() int {
  253. return 2
  254. }
  255. func (c *PacketConn) NeedAdditionalReadDeadline() bool {
  256. return true
  257. }
  258. func (c *PacketConn) Upstream() any {
  259. return c.Conn
  260. }