inbound_conn.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. package naive
  2. import (
  3. "encoding/binary"
  4. "io"
  5. "math/rand"
  6. "net"
  7. "net/http"
  8. "os"
  9. "time"
  10. "github.com/sagernet/sing/common"
  11. "github.com/sagernet/sing/common/baderror"
  12. "github.com/sagernet/sing/common/buf"
  13. M "github.com/sagernet/sing/common/metadata"
  14. "github.com/sagernet/sing/common/rw"
  15. )
  16. const paddingCount = 8
  17. func generatePaddingHeader() string {
  18. paddingLen := rand.Intn(32) + 30
  19. padding := make([]byte, paddingLen)
  20. bits := rand.Uint64()
  21. for i := 0; i < 16; i++ {
  22. padding[i] = "!#$()+<>?@[]^`{}"[bits&15]
  23. bits >>= 4
  24. }
  25. for i := 16; i < paddingLen; i++ {
  26. padding[i] = '~'
  27. }
  28. return string(padding)
  29. }
  30. type paddingConn struct {
  31. readPadding int
  32. writePadding int
  33. readRemaining int
  34. paddingRemaining int
  35. }
  36. func (p *paddingConn) readWithPadding(reader io.Reader, buffer []byte) (n int, err error) {
  37. if p.readRemaining > 0 {
  38. if len(buffer) > p.readRemaining {
  39. buffer = buffer[:p.readRemaining]
  40. }
  41. n, err = reader.Read(buffer)
  42. if err != nil {
  43. return
  44. }
  45. p.readRemaining -= n
  46. return
  47. }
  48. if p.paddingRemaining > 0 {
  49. err = rw.SkipN(reader, p.paddingRemaining)
  50. if err != nil {
  51. return
  52. }
  53. p.paddingRemaining = 0
  54. }
  55. if p.readPadding < paddingCount {
  56. var paddingHeader []byte
  57. if len(buffer) >= 3 {
  58. paddingHeader = buffer[:3]
  59. } else {
  60. paddingHeader = make([]byte, 3)
  61. }
  62. _, err = io.ReadFull(reader, paddingHeader)
  63. if err != nil {
  64. return
  65. }
  66. originalDataSize := int(binary.BigEndian.Uint16(paddingHeader[:2]))
  67. paddingSize := int(paddingHeader[2])
  68. if len(buffer) > originalDataSize {
  69. buffer = buffer[:originalDataSize]
  70. }
  71. n, err = reader.Read(buffer)
  72. if err != nil {
  73. return
  74. }
  75. p.readPadding++
  76. p.readRemaining = originalDataSize - n
  77. p.paddingRemaining = paddingSize
  78. return
  79. }
  80. return reader.Read(buffer)
  81. }
  82. func (p *paddingConn) writeWithPadding(writer io.Writer, data []byte) (n int, err error) {
  83. if p.writePadding < paddingCount {
  84. paddingSize := rand.Intn(256)
  85. buffer := buf.NewSize(3 + len(data) + paddingSize)
  86. defer buffer.Release()
  87. header := buffer.Extend(3)
  88. binary.BigEndian.PutUint16(header, uint16(len(data)))
  89. header[2] = byte(paddingSize)
  90. common.Must1(buffer.Write(data))
  91. _, err = writer.Write(buffer.Bytes())
  92. if err == nil {
  93. n = len(data)
  94. }
  95. p.writePadding++
  96. return
  97. }
  98. return writer.Write(data)
  99. }
  100. func (p *paddingConn) writeBufferWithPadding(writer io.Writer, buffer *buf.Buffer) error {
  101. if p.writePadding < paddingCount {
  102. bufferLen := buffer.Len()
  103. if bufferLen > 65535 {
  104. _, err := p.writeChunked(writer, buffer.Bytes())
  105. return err
  106. }
  107. paddingSize := rand.Intn(256)
  108. header := buffer.ExtendHeader(3)
  109. binary.BigEndian.PutUint16(header, uint16(bufferLen))
  110. header[2] = byte(paddingSize)
  111. buffer.Extend(paddingSize)
  112. p.writePadding++
  113. }
  114. return common.Error(writer.Write(buffer.Bytes()))
  115. }
  116. func (p *paddingConn) writeChunked(writer io.Writer, data []byte) (n int, err error) {
  117. for len(data) > 0 {
  118. var chunk []byte
  119. if len(data) > 65535 {
  120. chunk = data[:65535]
  121. data = data[65535:]
  122. } else {
  123. chunk = data
  124. data = nil
  125. }
  126. var written int
  127. written, err = p.writeWithPadding(writer, chunk)
  128. n += written
  129. if err != nil {
  130. return
  131. }
  132. }
  133. return
  134. }
  135. func (p *paddingConn) frontHeadroom() int {
  136. if p.writePadding < paddingCount {
  137. return 3
  138. }
  139. return 0
  140. }
  141. func (p *paddingConn) rearHeadroom() int {
  142. if p.writePadding < paddingCount {
  143. return 255
  144. }
  145. return 0
  146. }
  147. func (p *paddingConn) writerMTU() int {
  148. if p.writePadding < paddingCount {
  149. return 65535
  150. }
  151. return 0
  152. }
  153. func (p *paddingConn) readerReplaceable() bool {
  154. return p.readPadding == paddingCount
  155. }
  156. func (p *paddingConn) writerReplaceable() bool {
  157. return p.writePadding == paddingCount
  158. }
  159. type naiveConn struct {
  160. net.Conn
  161. paddingConn
  162. }
  163. func (c *naiveConn) Read(p []byte) (n int, err error) {
  164. n, err = c.readWithPadding(c.Conn, p)
  165. return n, baderror.WrapH2(err)
  166. }
  167. func (c *naiveConn) Write(p []byte) (n int, err error) {
  168. n, err = c.writeChunked(c.Conn, p)
  169. return n, baderror.WrapH2(err)
  170. }
  171. func (c *naiveConn) WriteBuffer(buffer *buf.Buffer) error {
  172. defer buffer.Release()
  173. err := c.writeBufferWithPadding(c.Conn, buffer)
  174. return baderror.WrapH2(err)
  175. }
  176. func (c *naiveConn) FrontHeadroom() int { return c.frontHeadroom() }
  177. func (c *naiveConn) RearHeadroom() int { return c.rearHeadroom() }
  178. func (c *naiveConn) WriterMTU() int { return c.writerMTU() }
  179. func (c *naiveConn) Upstream() any { return c.Conn }
  180. func (c *naiveConn) ReaderReplaceable() bool { return c.readerReplaceable() }
  181. func (c *naiveConn) WriterReplaceable() bool { return c.writerReplaceable() }
  182. type naiveH2Conn struct {
  183. reader io.Reader
  184. writer io.Writer
  185. flusher http.Flusher
  186. remoteAddress net.Addr
  187. paddingConn
  188. }
  189. func (c *naiveH2Conn) Read(p []byte) (n int, err error) {
  190. n, err = c.readWithPadding(c.reader, p)
  191. return n, baderror.WrapH2(err)
  192. }
  193. func (c *naiveH2Conn) Write(p []byte) (n int, err error) {
  194. n, err = c.writeChunked(c.writer, p)
  195. if err == nil {
  196. c.flusher.Flush()
  197. }
  198. return n, baderror.WrapH2(err)
  199. }
  200. func (c *naiveH2Conn) WriteBuffer(buffer *buf.Buffer) error {
  201. defer buffer.Release()
  202. err := c.writeBufferWithPadding(c.writer, buffer)
  203. if err == nil {
  204. c.flusher.Flush()
  205. }
  206. return baderror.WrapH2(err)
  207. }
  208. func (c *naiveH2Conn) Close() error {
  209. return common.Close(c.reader, c.writer)
  210. }
  211. func (c *naiveH2Conn) LocalAddr() net.Addr { return M.Socksaddr{} }
  212. func (c *naiveH2Conn) RemoteAddr() net.Addr { return c.remoteAddress }
  213. func (c *naiveH2Conn) SetDeadline(t time.Time) error { return os.ErrInvalid }
  214. func (c *naiveH2Conn) SetReadDeadline(t time.Time) error { return os.ErrInvalid }
  215. func (c *naiveH2Conn) SetWriteDeadline(t time.Time) error { return os.ErrInvalid }
  216. func (c *naiveH2Conn) NeedAdditionalReadDeadline() bool { return true }
  217. func (c *naiveH2Conn) UpstreamReader() any { return c.reader }
  218. func (c *naiveH2Conn) UpstreamWriter() any { return c.writer }
  219. func (c *naiveH2Conn) FrontHeadroom() int { return c.frontHeadroom() }
  220. func (c *naiveH2Conn) RearHeadroom() int { return c.rearHeadroom() }
  221. func (c *naiveH2Conn) WriterMTU() int { return c.writerMTU() }
  222. func (c *naiveH2Conn) ReaderReplaceable() bool { return c.readerReplaceable() }
  223. func (c *naiveH2Conn) WriterReplaceable() bool { return c.writerReplaceable() }