tun.go 7.1 KB

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