tun.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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. })
  163. if err != nil {
  164. return err
  165. }
  166. err = t.tunStack.Start()
  167. if err != nil {
  168. return err
  169. }
  170. t.logger.Info("started at ", t.tunOptions.Name)
  171. return nil
  172. }
  173. func (t *Tun) Close() error {
  174. return common.Close(
  175. t.tunStack,
  176. t.tunIf,
  177. )
  178. }
  179. func (t *Tun) NewConnection(ctx context.Context, conn net.Conn, upstreamMetadata M.Metadata) error {
  180. ctx = log.ContextWithNewID(ctx)
  181. var metadata adapter.InboundContext
  182. metadata.Inbound = t.tag
  183. metadata.InboundType = C.TypeTun
  184. metadata.Source = upstreamMetadata.Source
  185. metadata.Destination = upstreamMetadata.Destination
  186. metadata.InboundOptions = t.inboundOptions
  187. t.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
  188. t.logger.InfoContext(ctx, "inbound connection to ", metadata.Destination)
  189. err := t.router.RouteConnection(ctx, conn, metadata)
  190. if err != nil {
  191. t.NewError(ctx, err)
  192. }
  193. return nil
  194. }
  195. func (t *Tun) NewPacketConnection(ctx context.Context, conn N.PacketConn, upstreamMetadata M.Metadata) error {
  196. ctx = log.ContextWithNewID(ctx)
  197. if tun.NeedTimeoutFromContext(ctx) {
  198. ctx, conn = canceler.NewPacketConn(ctx, conn, time.Duration(t.udpTimeout)*time.Second)
  199. }
  200. var metadata adapter.InboundContext
  201. metadata.Inbound = t.tag
  202. metadata.InboundType = C.TypeTun
  203. metadata.Source = upstreamMetadata.Source
  204. metadata.Destination = upstreamMetadata.Destination
  205. metadata.InboundOptions = t.inboundOptions
  206. t.logger.InfoContext(ctx, "inbound packet connection from ", metadata.Source)
  207. t.logger.InfoContext(ctx, "inbound packet connection to ", metadata.Destination)
  208. err := t.router.RoutePacketConnection(ctx, conn, metadata)
  209. if err != nil {
  210. t.NewError(ctx, err)
  211. }
  212. return nil
  213. }
  214. func (t *Tun) NewError(ctx context.Context, err error) {
  215. NewError(t.logger, ctx, err)
  216. }