1
0

xudp.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package xudp
  2. import (
  3. "context"
  4. "crypto/rand"
  5. "encoding/base64"
  6. "fmt"
  7. "io"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "github.com/xtls/xray-core/common/buf"
  12. "github.com/xtls/xray-core/common/errors"
  13. "github.com/xtls/xray-core/common/net"
  14. "github.com/xtls/xray-core/common/platform"
  15. "github.com/xtls/xray-core/common/protocol"
  16. "github.com/xtls/xray-core/common/session"
  17. "lukechampine.com/blake3"
  18. )
  19. var AddrParser = protocol.NewAddressParser(
  20. protocol.AddressFamilyByte(byte(protocol.AddressTypeIPv4), net.AddressFamilyIPv4),
  21. protocol.AddressFamilyByte(byte(protocol.AddressTypeDomain), net.AddressFamilyDomain),
  22. protocol.AddressFamilyByte(byte(protocol.AddressTypeIPv6), net.AddressFamilyIPv6),
  23. protocol.PortThenAddress(),
  24. )
  25. var (
  26. Show bool
  27. BaseKey []byte
  28. )
  29. func init() {
  30. if strings.ToLower(platform.NewEnvFlag(platform.XUDPLog).GetValue(func() string { return "" })) == "true" {
  31. Show = true
  32. }
  33. rand.Read(BaseKey)
  34. go func() {
  35. time.Sleep(100 * time.Millisecond) // this is not nice, but need to give some time for Android to setup ENV
  36. if raw := platform.NewEnvFlag(platform.XUDPBaseKey).GetValue(func() string { return "" }); raw != "" {
  37. if BaseKey, _ = base64.RawURLEncoding.DecodeString(raw); len(BaseKey) == 32 {
  38. return
  39. }
  40. panic(platform.XUDPBaseKey + ": invalid value (BaseKey must be 32 bytes): " + raw + " len " + strconv.Itoa(len(BaseKey)))
  41. }
  42. }()
  43. }
  44. func GetGlobalID(ctx context.Context) (globalID [8]byte) {
  45. if cone := ctx.Value("cone"); cone == nil || !cone.(bool) { // cone is nil only in some unit tests
  46. return
  47. }
  48. if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.Source.Network == net.Network_UDP &&
  49. (inbound.Name == "dokodemo-door" || inbound.Name == "socks" || inbound.Name == "shadowsocks") {
  50. h := blake3.New(8, BaseKey)
  51. h.Write([]byte(inbound.Source.String()))
  52. copy(globalID[:], h.Sum(nil))
  53. if Show {
  54. errors.LogInfo(ctx, fmt.Sprintf("XUDP inbound.Source.String(): %v\tglobalID: %v\n", inbound.Source.String(), globalID))
  55. }
  56. }
  57. return
  58. }
  59. func NewPacketWriter(writer buf.Writer, dest net.Destination, globalID [8]byte) *PacketWriter {
  60. return &PacketWriter{
  61. Writer: writer,
  62. Dest: dest,
  63. GlobalID: globalID,
  64. }
  65. }
  66. type PacketWriter struct {
  67. Writer buf.Writer
  68. Dest net.Destination
  69. GlobalID [8]byte
  70. }
  71. func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
  72. defer buf.ReleaseMulti(mb)
  73. mb2Write := make(buf.MultiBuffer, 0, len(mb))
  74. for _, b := range mb {
  75. length := b.Len()
  76. if length == 0 || length+666 > buf.Size {
  77. continue
  78. }
  79. eb := buf.New()
  80. eb.Write([]byte{0, 0, 0, 0}) // Meta data length; Mux Session ID
  81. if w.Dest.Network == net.Network_UDP {
  82. eb.WriteByte(1) // New
  83. eb.WriteByte(1) // Opt
  84. eb.WriteByte(2) // UDP
  85. AddrParser.WriteAddressPort(eb, w.Dest.Address, w.Dest.Port)
  86. if b.UDP != nil { // make sure it's user's proxy request
  87. eb.Write(w.GlobalID[:]) // no need to check whether it's empty
  88. }
  89. w.Dest.Network = net.Network_Unknown
  90. } else {
  91. eb.WriteByte(2) // Keep
  92. eb.WriteByte(1) // Opt
  93. if b.UDP != nil {
  94. eb.WriteByte(2) // UDP
  95. AddrParser.WriteAddressPort(eb, b.UDP.Address, b.UDP.Port)
  96. }
  97. }
  98. l := eb.Len() - 2
  99. eb.SetByte(0, byte(l>>8))
  100. eb.SetByte(1, byte(l))
  101. eb.WriteByte(byte(length >> 8))
  102. eb.WriteByte(byte(length))
  103. eb.Write(b.Bytes())
  104. mb2Write = append(mb2Write, eb)
  105. }
  106. if mb2Write.IsEmpty() {
  107. return nil
  108. }
  109. return w.Writer.WriteMultiBuffer(mb2Write)
  110. }
  111. func NewPacketReader(reader io.Reader) *PacketReader {
  112. return &PacketReader{
  113. Reader: reader,
  114. cache: make([]byte, 2),
  115. }
  116. }
  117. type PacketReader struct {
  118. Reader io.Reader
  119. cache []byte
  120. }
  121. func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
  122. for {
  123. if _, err := io.ReadFull(r.Reader, r.cache); err != nil {
  124. return nil, err
  125. }
  126. l := int32(r.cache[0])<<8 | int32(r.cache[1])
  127. if l < 4 {
  128. return nil, io.EOF
  129. }
  130. b := buf.New()
  131. if _, err := b.ReadFullFrom(r.Reader, l); err != nil {
  132. b.Release()
  133. return nil, err
  134. }
  135. discard := false
  136. switch b.Byte(2) {
  137. case 2:
  138. if l > 4 && b.Byte(4) == 2 { // MUST check the flag first
  139. b.Advance(5)
  140. // b.Clear() will be called automatically if all data had been read.
  141. addr, port, err := AddrParser.ReadAddressPort(nil, b)
  142. if err != nil {
  143. b.Release()
  144. return nil, err
  145. }
  146. b.UDP = &net.Destination{
  147. Network: net.Network_UDP,
  148. Address: addr,
  149. Port: port,
  150. }
  151. }
  152. case 4:
  153. discard = true
  154. default:
  155. b.Release()
  156. return nil, io.EOF
  157. }
  158. b.Clear() // in case there is padding (empty bytes) attached
  159. if b.Byte(3) == 1 {
  160. if _, err := io.ReadFull(r.Reader, r.cache); err != nil {
  161. b.Release()
  162. return nil, err
  163. }
  164. length := int32(r.cache[0])<<8 | int32(r.cache[1])
  165. if length > 0 {
  166. if _, err := b.ReadFullFrom(r.Reader, length); err != nil {
  167. b.Release()
  168. return nil, err
  169. }
  170. if !discard {
  171. return buf.MultiBuffer{b}, nil
  172. }
  173. }
  174. }
  175. b.Release()
  176. }
  177. }