default_udp.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package inbound
  2. import (
  3. "net"
  4. "net/netip"
  5. "os"
  6. "time"
  7. "github.com/sagernet/sing-box/adapter"
  8. "github.com/sagernet/sing-dns"
  9. "github.com/sagernet/sing/common"
  10. "github.com/sagernet/sing/common/buf"
  11. "github.com/sagernet/sing/common/control"
  12. E "github.com/sagernet/sing/common/exceptions"
  13. M "github.com/sagernet/sing/common/metadata"
  14. N "github.com/sagernet/sing/common/network"
  15. )
  16. func (a *myInboundAdapter) ListenUDP() (net.PacketConn, error) {
  17. bindAddr := M.SocksaddrFrom(netip.Addr(a.listenOptions.Listen), a.listenOptions.ListenPort)
  18. var lc net.ListenConfig
  19. if !a.listenOptions.UDPFragment {
  20. lc.Control = control.Append(lc.Control, control.DisableUDPFragment())
  21. }
  22. udpConn, err := lc.ListenPacket(a.ctx, M.NetworkFromNetAddr(N.NetworkUDP, bindAddr.Addr), bindAddr.String())
  23. if err != nil {
  24. return nil, err
  25. }
  26. a.udpConn = udpConn.(*net.UDPConn)
  27. a.udpAddr = bindAddr
  28. a.logger.Info("udp server started at ", udpConn.LocalAddr())
  29. return udpConn, err
  30. }
  31. func (a *myInboundAdapter) loopUDPIn() {
  32. defer close(a.packetOutboundClosed)
  33. _buffer := buf.StackNewPacket()
  34. defer common.KeepAlive(_buffer)
  35. buffer := common.Dup(_buffer)
  36. defer buffer.Release()
  37. buffer.IncRef()
  38. defer buffer.DecRef()
  39. packetService := (*myInboundPacketAdapter)(a)
  40. for {
  41. buffer.Reset()
  42. n, addr, err := a.udpConn.ReadFromUDPAddrPort(buffer.FreeBytes())
  43. if err != nil {
  44. return
  45. }
  46. buffer.Truncate(n)
  47. var metadata adapter.InboundContext
  48. metadata.Inbound = a.tag
  49. metadata.InboundType = a.protocol
  50. metadata.SniffEnabled = a.listenOptions.SniffEnabled
  51. metadata.SniffOverrideDestination = a.listenOptions.SniffOverrideDestination
  52. metadata.DomainStrategy = dns.DomainStrategy(a.listenOptions.DomainStrategy)
  53. metadata.Source = M.SocksaddrFromNetIP(addr)
  54. metadata.OriginDestination = a.udpAddr
  55. err = a.packetHandler.NewPacket(a.ctx, packetService, buffer, metadata)
  56. if err != nil {
  57. a.newError(E.Cause(err, "process packet from ", metadata.Source))
  58. }
  59. }
  60. }
  61. func (a *myInboundAdapter) loopUDPOOBIn() {
  62. defer close(a.packetOutboundClosed)
  63. _buffer := buf.StackNewPacket()
  64. defer common.KeepAlive(_buffer)
  65. buffer := common.Dup(_buffer)
  66. defer buffer.Release()
  67. buffer.IncRef()
  68. defer buffer.DecRef()
  69. packetService := (*myInboundPacketAdapter)(a)
  70. oob := make([]byte, 1024)
  71. for {
  72. buffer.Reset()
  73. n, oobN, _, addr, err := a.udpConn.ReadMsgUDPAddrPort(buffer.FreeBytes(), oob)
  74. if err != nil {
  75. return
  76. }
  77. buffer.Truncate(n)
  78. var metadata adapter.InboundContext
  79. metadata.Inbound = a.tag
  80. metadata.InboundType = a.protocol
  81. metadata.SniffEnabled = a.listenOptions.SniffEnabled
  82. metadata.SniffOverrideDestination = a.listenOptions.SniffOverrideDestination
  83. metadata.DomainStrategy = dns.DomainStrategy(a.listenOptions.DomainStrategy)
  84. metadata.Source = M.SocksaddrFromNetIP(addr)
  85. metadata.OriginDestination = a.udpAddr
  86. err = a.oobPacketHandler.NewPacket(a.ctx, packetService, buffer, oob[:oobN], metadata)
  87. if err != nil {
  88. a.newError(E.Cause(err, "process packet from ", metadata.Source))
  89. }
  90. }
  91. }
  92. func (a *myInboundAdapter) loopUDPInThreadSafe() {
  93. defer close(a.packetOutboundClosed)
  94. packetService := (*myInboundPacketAdapter)(a)
  95. for {
  96. buffer := buf.NewPacket()
  97. n, addr, err := a.udpConn.ReadFromUDPAddrPort(buffer.FreeBytes())
  98. if err != nil {
  99. buffer.Release()
  100. return
  101. }
  102. buffer.Truncate(n)
  103. var metadata adapter.InboundContext
  104. metadata.Inbound = a.tag
  105. metadata.InboundType = a.protocol
  106. metadata.SniffEnabled = a.listenOptions.SniffEnabled
  107. metadata.SniffOverrideDestination = a.listenOptions.SniffOverrideDestination
  108. metadata.DomainStrategy = dns.DomainStrategy(a.listenOptions.DomainStrategy)
  109. metadata.Source = M.SocksaddrFromNetIP(addr)
  110. metadata.OriginDestination = a.udpAddr
  111. err = a.packetHandler.NewPacket(a.ctx, packetService, buffer, metadata)
  112. if err != nil {
  113. buffer.Release()
  114. a.newError(E.Cause(err, "process packet from ", metadata.Source))
  115. }
  116. }
  117. }
  118. func (a *myInboundAdapter) loopUDPOOBInThreadSafe() {
  119. defer close(a.packetOutboundClosed)
  120. packetService := (*myInboundPacketAdapter)(a)
  121. oob := make([]byte, 1024)
  122. for {
  123. buffer := buf.NewPacket()
  124. n, oobN, _, addr, err := a.udpConn.ReadMsgUDPAddrPort(buffer.FreeBytes(), oob)
  125. if err != nil {
  126. buffer.Release()
  127. return
  128. }
  129. buffer.Truncate(n)
  130. var metadata adapter.InboundContext
  131. metadata.Inbound = a.tag
  132. metadata.InboundType = a.protocol
  133. metadata.SniffEnabled = a.listenOptions.SniffEnabled
  134. metadata.SniffOverrideDestination = a.listenOptions.SniffOverrideDestination
  135. metadata.DomainStrategy = dns.DomainStrategy(a.listenOptions.DomainStrategy)
  136. metadata.Source = M.SocksaddrFromNetIP(addr)
  137. metadata.OriginDestination = a.udpAddr
  138. err = a.oobPacketHandler.NewPacket(a.ctx, packetService, buffer, oob[:oobN], metadata)
  139. if err != nil {
  140. buffer.Release()
  141. a.newError(E.Cause(err, "process packet from ", metadata.Source))
  142. }
  143. }
  144. }
  145. func (a *myInboundAdapter) loopUDPOut() {
  146. for {
  147. select {
  148. case packet := <-a.packetOutbound:
  149. err := a.writePacket(packet.buffer, packet.destination)
  150. if err != nil && !E.IsClosed(err) {
  151. a.newError(E.New("write back udp: ", err))
  152. }
  153. continue
  154. case <-a.packetOutboundClosed:
  155. }
  156. for {
  157. select {
  158. case packet := <-a.packetOutbound:
  159. packet.buffer.Release()
  160. default:
  161. return
  162. }
  163. }
  164. }
  165. }
  166. func (a *myInboundAdapter) writePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  167. defer buffer.Release()
  168. if destination.IsFqdn() {
  169. udpAddr, err := net.ResolveUDPAddr(N.NetworkUDP, destination.String())
  170. if err != nil {
  171. return err
  172. }
  173. return common.Error(a.udpConn.WriteTo(buffer.Bytes(), udpAddr))
  174. }
  175. return common.Error(a.udpConn.WriteToUDPAddrPort(buffer.Bytes(), destination.AddrPort()))
  176. }
  177. type myInboundPacketAdapter myInboundAdapter
  178. func (s *myInboundPacketAdapter) ReadPacket(buffer *buf.Buffer) (M.Socksaddr, error) {
  179. n, addr, err := s.udpConn.ReadFromUDPAddrPort(buffer.FreeBytes())
  180. if err != nil {
  181. return M.Socksaddr{}, err
  182. }
  183. buffer.Truncate(n)
  184. return M.SocksaddrFromNetIP(addr), nil
  185. }
  186. func (s *myInboundPacketAdapter) WriteIsThreadUnsafe() {
  187. }
  188. type myInboundPacket struct {
  189. buffer *buf.Buffer
  190. destination M.Socksaddr
  191. }
  192. func (s *myInboundPacketAdapter) Upstream() any {
  193. return s.udpConn
  194. }
  195. func (s *myInboundPacketAdapter) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  196. select {
  197. case s.packetOutbound <- &myInboundPacket{buffer, destination}:
  198. return nil
  199. case <-s.packetOutboundClosed:
  200. return os.ErrClosed
  201. }
  202. }
  203. func (s *myInboundPacketAdapter) Close() error {
  204. return s.udpConn.Close()
  205. }
  206. func (s *myInboundPacketAdapter) LocalAddr() net.Addr {
  207. return s.udpConn.LocalAddr()
  208. }
  209. func (s *myInboundPacketAdapter) SetDeadline(t time.Time) error {
  210. return s.udpConn.SetDeadline(t)
  211. }
  212. func (s *myInboundPacketAdapter) SetReadDeadline(t time.Time) error {
  213. return s.udpConn.SetReadDeadline(t)
  214. }
  215. func (s *myInboundPacketAdapter) SetWriteDeadline(t time.Time) error {
  216. return s.udpConn.SetWriteDeadline(t)
  217. }