tun.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package inbound
  2. import (
  3. "context"
  4. "net"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "github.com/sagernet/sing-box/adapter"
  9. "github.com/sagernet/sing-box/common/canceler"
  10. C "github.com/sagernet/sing-box/constant"
  11. "github.com/sagernet/sing-box/log"
  12. "github.com/sagernet/sing-box/option"
  13. "github.com/sagernet/sing-dns"
  14. "github.com/sagernet/sing-tun"
  15. "github.com/sagernet/sing/common"
  16. E "github.com/sagernet/sing/common/exceptions"
  17. M "github.com/sagernet/sing/common/metadata"
  18. N "github.com/sagernet/sing/common/network"
  19. "github.com/sagernet/sing/common/ranges"
  20. )
  21. var _ adapter.Inbound = (*Tun)(nil)
  22. type Tun struct {
  23. tag string
  24. ctx context.Context
  25. router adapter.Router
  26. logger log.ContextLogger
  27. inboundOptions option.InboundOptions
  28. tunOptions tun.Options
  29. endpointIndependentNat bool
  30. udpTimeout int64
  31. stack string
  32. tunIf tun.Tun
  33. tunStack tun.Stack
  34. }
  35. func NewTun(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.TunInboundOptions) (*Tun, error) {
  36. tunName := options.InterfaceName
  37. if tunName == "" {
  38. tunName = tun.CalculateInterfaceName("")
  39. }
  40. tunMTU := options.MTU
  41. if tunMTU == 0 {
  42. tunMTU = 9000
  43. }
  44. var udpTimeout int64
  45. if options.UDPTimeout != 0 {
  46. udpTimeout = options.UDPTimeout
  47. } else {
  48. udpTimeout = int64(C.UDPTimeout.Seconds())
  49. }
  50. includeUID := uidToRange(options.IncludeUID)
  51. if len(options.IncludeUIDRange) > 0 {
  52. var err error
  53. includeUID, err = parseRange(includeUID, options.IncludeUIDRange)
  54. if err != nil {
  55. return nil, E.Cause(err, "parse include_uid_range")
  56. }
  57. }
  58. excludeUID := uidToRange(options.ExcludeUID)
  59. if len(options.ExcludeUIDRange) > 0 {
  60. var err error
  61. excludeUID, err = parseRange(excludeUID, options.ExcludeUIDRange)
  62. if err != nil {
  63. return nil, E.Cause(err, "parse exclude_uid_range")
  64. }
  65. }
  66. return &Tun{
  67. tag: tag,
  68. ctx: ctx,
  69. router: router,
  70. logger: logger,
  71. inboundOptions: options.InboundOptions,
  72. tunOptions: tun.Options{
  73. Name: tunName,
  74. MTU: tunMTU,
  75. Inet4Address: common.Map(options.Inet4Address, option.ListenPrefix.Build),
  76. Inet6Address: common.Map(options.Inet6Address, option.ListenPrefix.Build),
  77. AutoRoute: options.AutoRoute,
  78. StrictRoute: options.StrictRoute,
  79. IncludeUID: includeUID,
  80. ExcludeUID: excludeUID,
  81. IncludeAndroidUser: options.IncludeAndroidUser,
  82. IncludePackage: options.IncludePackage,
  83. ExcludePackage: options.ExcludePackage,
  84. InterfaceMonitor: router.InterfaceMonitor(),
  85. TableIndex: 2022,
  86. },
  87. endpointIndependentNat: options.EndpointIndependentNat,
  88. udpTimeout: udpTimeout,
  89. stack: options.Stack,
  90. }, nil
  91. }
  92. func uidToRange(uidList option.Listable[uint32]) []ranges.Range[uint32] {
  93. return common.Map(uidList, func(uid uint32) ranges.Range[uint32] {
  94. return ranges.NewSingle(uid)
  95. })
  96. }
  97. func parseRange(uidRanges []ranges.Range[uint32], rangeList []string) ([]ranges.Range[uint32], error) {
  98. for _, uidRange := range rangeList {
  99. if !strings.Contains(uidRange, ":") {
  100. return nil, E.New("missing ':' in range: ", uidRange)
  101. }
  102. subIndex := strings.Index(uidRange, ":")
  103. if subIndex == 0 {
  104. return nil, E.New("missing range start: ", uidRange)
  105. } else if subIndex == len(uidRange)-1 {
  106. return nil, E.New("missing range end: ", uidRange)
  107. }
  108. var start, end uint64
  109. var err error
  110. start, err = strconv.ParseUint(uidRange[:subIndex], 10, 32)
  111. if err != nil {
  112. return nil, E.Cause(err, "parse range start")
  113. }
  114. end, err = strconv.ParseUint(uidRange[subIndex+1:], 10, 32)
  115. if err != nil {
  116. return nil, E.Cause(err, "parse range end")
  117. }
  118. uidRanges = append(uidRanges, ranges.New(uint32(start), uint32(end)))
  119. }
  120. return uidRanges, nil
  121. }
  122. func (t *Tun) Type() string {
  123. return C.TypeTun
  124. }
  125. func (t *Tun) Tag() string {
  126. return t.tag
  127. }
  128. func (t *Tun) Start() error {
  129. if C.IsAndroid {
  130. t.tunOptions.BuildAndroidRules(t.router.PackageManager(), t)
  131. }
  132. tunIf, err := tun.Open(t.tunOptions)
  133. if err != nil {
  134. return E.Cause(err, "configure tun interface")
  135. }
  136. t.tunIf = tunIf
  137. t.tunStack, err = tun.NewStack(t.stack, tun.StackOptions{
  138. Context: t.ctx,
  139. Tun: tunIf,
  140. MTU: t.tunOptions.MTU,
  141. Name: t.tunOptions.Name,
  142. Inet4Address: t.tunOptions.Inet4Address,
  143. Inet6Address: t.tunOptions.Inet6Address,
  144. EndpointIndependentNat: t.endpointIndependentNat,
  145. UDPTimeout: t.udpTimeout,
  146. Handler: t,
  147. Logger: t.logger,
  148. })
  149. if err != nil {
  150. return err
  151. }
  152. err = t.tunStack.Start()
  153. if err != nil {
  154. return err
  155. }
  156. t.logger.Info("started at ", t.tunOptions.Name)
  157. return nil
  158. }
  159. func (t *Tun) Close() error {
  160. return common.Close(
  161. t.tunStack,
  162. t.tunIf,
  163. )
  164. }
  165. func (t *Tun) NewConnection(ctx context.Context, conn net.Conn, upstreamMetadata M.Metadata) error {
  166. ctx = log.ContextWithNewID(ctx)
  167. var metadata adapter.InboundContext
  168. metadata.Inbound = t.tag
  169. metadata.InboundType = C.TypeTun
  170. metadata.Source = upstreamMetadata.Source
  171. metadata.Destination = upstreamMetadata.Destination
  172. metadata.SniffEnabled = t.inboundOptions.SniffEnabled
  173. metadata.SniffOverrideDestination = t.inboundOptions.SniffOverrideDestination
  174. metadata.DomainStrategy = dns.DomainStrategy(t.inboundOptions.DomainStrategy)
  175. t.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
  176. t.logger.InfoContext(ctx, "inbound connection to ", metadata.Destination)
  177. err := t.router.RouteConnection(ctx, conn, metadata)
  178. if err != nil {
  179. t.NewError(ctx, err)
  180. }
  181. return err
  182. }
  183. func (t *Tun) NewPacketConnection(ctx context.Context, conn N.PacketConn, upstreamMetadata M.Metadata) error {
  184. ctx = log.ContextWithNewID(ctx)
  185. if tun.NeedTimeoutFromContext(ctx) {
  186. ctx, conn = canceler.NewPacketConn(ctx, conn, time.Duration(t.udpTimeout)*time.Second)
  187. }
  188. var metadata adapter.InboundContext
  189. metadata.Inbound = t.tag
  190. metadata.InboundType = C.TypeTun
  191. metadata.Source = upstreamMetadata.Source
  192. metadata.Destination = upstreamMetadata.Destination
  193. metadata.SniffEnabled = t.inboundOptions.SniffEnabled
  194. metadata.SniffOverrideDestination = t.inboundOptions.SniffOverrideDestination
  195. metadata.DomainStrategy = dns.DomainStrategy(t.inboundOptions.DomainStrategy)
  196. t.logger.InfoContext(ctx, "inbound packet connection from ", metadata.Source)
  197. t.logger.InfoContext(ctx, "inbound packet connection to ", metadata.Destination)
  198. err := t.router.RoutePacketConnection(ctx, conn, metadata)
  199. if err != nil {
  200. t.NewError(ctx, err)
  201. }
  202. return err
  203. }
  204. func (t *Tun) NewError(ctx context.Context, err error) {
  205. NewError(t.logger, ctx, err)
  206. }