tun.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. package inbound
  2. import (
  3. "context"
  4. "net"
  5. "strconv"
  6. "strings"
  7. "github.com/sagernet/sing-box/adapter"
  8. C "github.com/sagernet/sing-box/constant"
  9. "github.com/sagernet/sing-box/experimental/libbox/platform"
  10. "github.com/sagernet/sing-box/log"
  11. "github.com/sagernet/sing-box/option"
  12. "github.com/sagernet/sing-tun"
  13. "github.com/sagernet/sing/common"
  14. E "github.com/sagernet/sing/common/exceptions"
  15. M "github.com/sagernet/sing/common/metadata"
  16. N "github.com/sagernet/sing/common/network"
  17. "github.com/sagernet/sing/common/ranges"
  18. )
  19. var _ adapter.Inbound = (*Tun)(nil)
  20. type Tun struct {
  21. tag string
  22. ctx context.Context
  23. router adapter.Router
  24. logger log.ContextLogger
  25. inboundOptions option.InboundOptions
  26. tunOptions tun.Options
  27. endpointIndependentNat bool
  28. udpTimeout int64
  29. stack string
  30. tunIf tun.Tun
  31. tunStack tun.Stack
  32. platformInterface platform.Interface
  33. platformOptions option.TunPlatformOptions
  34. }
  35. func NewTun(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.TunInboundOptions, platformInterface platform.Interface) (*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. Inet4RouteAddress: common.Map(options.Inet4RouteAddress, option.ListenPrefix.Build),
  80. Inet6RouteAddress: common.Map(options.Inet6RouteAddress, option.ListenPrefix.Build),
  81. IncludeUID: includeUID,
  82. ExcludeUID: excludeUID,
  83. IncludeAndroidUser: options.IncludeAndroidUser,
  84. IncludePackage: options.IncludePackage,
  85. ExcludePackage: options.ExcludePackage,
  86. InterfaceMonitor: router.InterfaceMonitor(),
  87. TableIndex: 2022,
  88. },
  89. endpointIndependentNat: options.EndpointIndependentNat,
  90. udpTimeout: udpTimeout,
  91. stack: options.Stack,
  92. platformInterface: platformInterface,
  93. platformOptions: common.PtrValueOrDefault(options.Platform),
  94. }, nil
  95. }
  96. func uidToRange(uidList option.Listable[uint32]) []ranges.Range[uint32] {
  97. return common.Map(uidList, func(uid uint32) ranges.Range[uint32] {
  98. return ranges.NewSingle(uid)
  99. })
  100. }
  101. func parseRange(uidRanges []ranges.Range[uint32], rangeList []string) ([]ranges.Range[uint32], error) {
  102. for _, uidRange := range rangeList {
  103. if !strings.Contains(uidRange, ":") {
  104. return nil, E.New("missing ':' in range: ", uidRange)
  105. }
  106. subIndex := strings.Index(uidRange, ":")
  107. if subIndex == 0 {
  108. return nil, E.New("missing range start: ", uidRange)
  109. } else if subIndex == len(uidRange)-1 {
  110. return nil, E.New("missing range end: ", uidRange)
  111. }
  112. var start, end uint64
  113. var err error
  114. start, err = strconv.ParseUint(uidRange[:subIndex], 10, 32)
  115. if err != nil {
  116. return nil, E.Cause(err, "parse range start")
  117. }
  118. end, err = strconv.ParseUint(uidRange[subIndex+1:], 10, 32)
  119. if err != nil {
  120. return nil, E.Cause(err, "parse range end")
  121. }
  122. uidRanges = append(uidRanges, ranges.New(uint32(start), uint32(end)))
  123. }
  124. return uidRanges, nil
  125. }
  126. func (t *Tun) Type() string {
  127. return C.TypeTun
  128. }
  129. func (t *Tun) Tag() string {
  130. return t.tag
  131. }
  132. func (t *Tun) Start() error {
  133. if C.IsAndroid && t.platformInterface == nil {
  134. t.tunOptions.BuildAndroidRules(t.router.PackageManager(), t)
  135. }
  136. var (
  137. tunInterface tun.Tun
  138. err error
  139. )
  140. if t.platformInterface != nil {
  141. tunInterface, err = t.platformInterface.OpenTun(t.tunOptions, t.platformOptions)
  142. } else {
  143. tunInterface, err = tun.New(t.tunOptions)
  144. }
  145. if err != nil {
  146. return E.Cause(err, "configure tun interface")
  147. }
  148. t.tunIf = tunInterface
  149. t.tunStack, err = tun.NewStack(t.stack, tun.StackOptions{
  150. Context: t.ctx,
  151. Tun: tunInterface,
  152. MTU: t.tunOptions.MTU,
  153. Name: t.tunOptions.Name,
  154. Inet4Address: t.tunOptions.Inet4Address,
  155. Inet6Address: t.tunOptions.Inet6Address,
  156. EndpointIndependentNat: t.endpointIndependentNat,
  157. UDPTimeout: t.udpTimeout,
  158. Handler: t,
  159. Logger: t.logger,
  160. UnderPlatform: t.platformInterface != nil,
  161. })
  162. if err != nil {
  163. return err
  164. }
  165. err = t.tunStack.Start()
  166. if err != nil {
  167. return err
  168. }
  169. t.logger.Info("started at ", t.tunOptions.Name)
  170. return nil
  171. }
  172. func (t *Tun) Close() error {
  173. return common.Close(
  174. t.tunStack,
  175. t.tunIf,
  176. )
  177. }
  178. func (t *Tun) NewConnection(ctx context.Context, conn net.Conn, upstreamMetadata M.Metadata) error {
  179. ctx = log.ContextWithNewID(ctx)
  180. var metadata adapter.InboundContext
  181. metadata.Inbound = t.tag
  182. metadata.InboundType = C.TypeTun
  183. metadata.Source = upstreamMetadata.Source
  184. metadata.Destination = upstreamMetadata.Destination
  185. metadata.InboundOptions = t.inboundOptions
  186. t.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
  187. t.logger.InfoContext(ctx, "inbound connection to ", metadata.Destination)
  188. err := t.router.RouteConnection(ctx, conn, metadata)
  189. if err != nil {
  190. t.NewError(ctx, err)
  191. }
  192. return nil
  193. }
  194. func (t *Tun) NewPacketConnection(ctx context.Context, conn N.PacketConn, upstreamMetadata M.Metadata) error {
  195. ctx = log.ContextWithNewID(ctx)
  196. var metadata adapter.InboundContext
  197. metadata.Inbound = t.tag
  198. metadata.InboundType = C.TypeTun
  199. metadata.Source = upstreamMetadata.Source
  200. metadata.Destination = upstreamMetadata.Destination
  201. metadata.InboundOptions = t.inboundOptions
  202. t.logger.InfoContext(ctx, "inbound packet connection from ", metadata.Source)
  203. t.logger.InfoContext(ctx, "inbound packet connection to ", metadata.Destination)
  204. err := t.router.RoutePacketConnection(ctx, conn, metadata)
  205. if err != nil {
  206. t.NewError(ctx, err)
  207. }
  208. return nil
  209. }
  210. func (t *Tun) NewError(ctx context.Context, err error) {
  211. NewError(t.logger, ctx, err)
  212. }