1
0

tun.go 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package tun
  2. import (
  3. "context"
  4. "net/netip"
  5. "runtime"
  6. "strconv"
  7. "strings"
  8. "time"
  9. "github.com/sagernet/sing-tun"
  10. sing_common "github.com/sagernet/sing/common"
  11. "github.com/sagernet/sing/common/control"
  12. E "github.com/sagernet/sing/common/exceptions"
  13. "github.com/sagernet/sing/common/logger"
  14. M "github.com/sagernet/sing/common/metadata"
  15. N "github.com/sagernet/sing/common/network"
  16. "github.com/sagernet/sing/common/ranges"
  17. "github.com/xtls/xray-core/common"
  18. "github.com/xtls/xray-core/common/net"
  19. "github.com/xtls/xray-core/common/session"
  20. "github.com/xtls/xray-core/common/singbridge"
  21. "github.com/xtls/xray-core/core"
  22. "github.com/xtls/xray-core/features/routing"
  23. features_tun "github.com/xtls/xray-core/features/tun"
  24. "github.com/xtls/xray-core/transport"
  25. "github.com/xtls/xray-core/transport/internet"
  26. )
  27. //go:generate go run github.com/xtls/xray-core/common/errors/errorgen
  28. func init() {
  29. common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, cfg interface{}) (interface{}, error) {
  30. return New(ctx, cfg.(*Config))
  31. }))
  32. }
  33. var TunInitializer features_tun.Interface = (*Tun)(nil)
  34. type Tun struct {
  35. ctx context.Context
  36. dispatcher routing.Dispatcher
  37. logger logger.ContextLogger
  38. tunOptions tun.Options
  39. stack string
  40. endpointIndependentNat bool
  41. udpTimeout int64
  42. tunIf tun.Tun
  43. tunStack tun.Stack
  44. networkMonitor tun.NetworkUpdateMonitor
  45. interfaceMonitor tun.DefaultInterfaceMonitor
  46. packageManager tun.PackageManager
  47. interfaceFinder *myInterfaceFinder
  48. }
  49. func New(ctx context.Context, config *Config) (*Tun, error) {
  50. instance := core.MustFromContext(ctx)
  51. tunInterface := &Tun{
  52. ctx: ctx,
  53. dispatcher: instance.GetFeature(routing.DispatcherType()).(routing.Dispatcher),
  54. logger: singbridge.NewLogger(newError),
  55. stack: config.Stack,
  56. endpointIndependentNat: config.EndpointIndependentNat,
  57. udpTimeout: int64(5 * time.Minute.Seconds()),
  58. interfaceFinder: new(myInterfaceFinder),
  59. }
  60. networkUpdateMonitor, err := tun.NewNetworkUpdateMonitor(tunInterface)
  61. if err != nil {
  62. return nil, err
  63. }
  64. defaultInterfaceMonitor, err := tun.NewDefaultInterfaceMonitor(networkUpdateMonitor, tun.DefaultInterfaceMonitorOptions{
  65. OverrideAndroidVPN: config.OverrideAndroidVpn,
  66. })
  67. if err != nil {
  68. return nil, err
  69. }
  70. defaultInterfaceMonitor.RegisterCallback(tunInterface.notifyNetworkUpdate)
  71. if config.AutoDetectInterface {
  72. networkUpdateMonitor.RegisterCallback(tunInterface.interfaceFinder.update)
  73. const useInterfaceName = runtime.GOOS == "linux" || runtime.GOOS == "android"
  74. bindFunc := control.BindToInterfaceFunc(tunInterface.interfaceFinder, func(network string, address string) (interfaceName string, interfaceIndex int) {
  75. remoteAddr := M.ParseSocksaddr(address).Addr
  76. if useInterfaceName {
  77. return defaultInterfaceMonitor.DefaultInterfaceName(remoteAddr), -1
  78. } else {
  79. return "", defaultInterfaceMonitor.DefaultInterfaceIndex(remoteAddr)
  80. }
  81. })
  82. internet.UseAlternativeSystemDialer(nil)
  83. internet.RegisterDialerController(bindFunc)
  84. internet.RegisterListenerController(bindFunc)
  85. }
  86. if runtime.GOOS == "android" {
  87. packageManage, err := tun.NewPackageManager(tunInterface)
  88. if err != nil {
  89. return nil, err
  90. }
  91. tunInterface.packageManager = packageManage
  92. }
  93. tunInterface.networkMonitor = networkUpdateMonitor
  94. tunInterface.interfaceMonitor = defaultInterfaceMonitor
  95. tunName := config.InterfaceName
  96. if tunName == "" {
  97. tunName = tun.CalculateInterfaceName("")
  98. }
  99. tunMTU := config.Mtu
  100. if tunMTU == 0 {
  101. tunMTU = 9000
  102. }
  103. includeUID := uidToRange(config.IncludeUid)
  104. if len(config.IncludeUidRange) > 0 {
  105. var err error
  106. includeUID, err = parseRange(includeUID, config.IncludeUidRange)
  107. if err != nil {
  108. return nil, E.Cause(err, "parse include_uid_range")
  109. }
  110. }
  111. excludeUID := uidToRange(config.ExcludeUid)
  112. if len(config.ExcludeUidRange) > 0 {
  113. var err error
  114. excludeUID, err = parseRange(excludeUID, config.ExcludeUidRange)
  115. if err != nil {
  116. return nil, E.Cause(err, "parse exclude_uid_range")
  117. }
  118. }
  119. if config.UdpTimeout != 0 {
  120. tunInterface.udpTimeout = config.UdpTimeout
  121. }
  122. tunInterface.tunOptions = tun.Options{
  123. Name: tunName,
  124. Inet4Address: sing_common.Map(config.Inet4Address, netip.MustParsePrefix),
  125. Inet6Address: sing_common.Map(config.Inet6Address, netip.MustParsePrefix),
  126. MTU: tunMTU,
  127. AutoRoute: config.AutoRoute,
  128. StrictRoute: config.StrictRoute,
  129. Inet4RouteAddress: sing_common.Map(config.Inet4RouteAddress, netip.MustParsePrefix),
  130. Inet6RouteAddress: sing_common.Map(config.Inet6RouteAddress, netip.MustParsePrefix),
  131. IncludeUID: includeUID,
  132. ExcludeUID: excludeUID,
  133. IncludeAndroidUser: sing_common.Map(config.IncludeAndroidUser, func(it int32) int {
  134. return int(it)
  135. }),
  136. IncludePackage: config.IncludePackage,
  137. ExcludePackage: config.ExcludePackage,
  138. InterfaceMonitor: defaultInterfaceMonitor,
  139. TableIndex: 2022,
  140. }
  141. return tunInterface, nil
  142. }
  143. func (t *Tun) Type() interface{} {
  144. return features_tun.InterfaceType()
  145. }
  146. func (t *Tun) Start() error {
  147. err := t.interfaceMonitor.Start()
  148. if err != nil {
  149. return err
  150. }
  151. err = t.networkMonitor.Start()
  152. if err != nil {
  153. return err
  154. }
  155. if runtime.GOOS == "android" {
  156. err = t.packageManager.Start()
  157. if err != nil {
  158. return err
  159. }
  160. t.tunOptions.BuildAndroidRules(t.packageManager, t)
  161. }
  162. tunIf, err := tun.New(t.tunOptions)
  163. if err != nil {
  164. return E.Cause(err, "configure tun interface")
  165. }
  166. t.tunIf = tunIf
  167. t.tunStack, err = tun.NewStack(t.stack, tun.StackOptions{
  168. Context: t.ctx,
  169. Tun: tunIf,
  170. MTU: t.tunOptions.MTU,
  171. Name: t.tunOptions.Name,
  172. Inet4Address: t.tunOptions.Inet4Address,
  173. Inet6Address: t.tunOptions.Inet6Address,
  174. EndpointIndependentNat: t.endpointIndependentNat,
  175. UDPTimeout: t.udpTimeout,
  176. Handler: t,
  177. Logger: t.logger,
  178. })
  179. if err != nil {
  180. return err
  181. }
  182. err = t.tunStack.Start()
  183. if err != nil {
  184. return err
  185. }
  186. t.logger.Info("tun started at ", t.tunOptions.Name)
  187. return nil
  188. }
  189. func (t *Tun) NewConnection(ctx context.Context, conn net.Conn, metadata M.Metadata) error {
  190. sid := session.NewID()
  191. ctx = session.ContextWithID(ctx, sid)
  192. t.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
  193. t.logger.InfoContext(ctx, "inbound connection to ", metadata.Destination)
  194. ctx = session.ContextWithInbound(ctx, &session.Inbound{
  195. Source: net.DestinationFromAddr(metadata.Source.TCPAddr()),
  196. Conn: conn,
  197. })
  198. wConn := singbridge.NewConn(conn)
  199. _ = t.dispatcher.DispatchLink(ctx, singbridge.ToDestination(metadata.Destination, net.Network_TCP), &transport.Link{
  200. Reader: wConn,
  201. Writer: wConn,
  202. })
  203. conn.Close()
  204. return nil
  205. }
  206. func (t *Tun) NewPacketConnection(ctx context.Context, conn N.PacketConn, metadata M.Metadata) error {
  207. sid := session.NewID()
  208. ctx = session.ContextWithID(ctx, sid)
  209. t.logger.InfoContext(ctx, "inbound packet connection from ", metadata.Source)
  210. t.logger.InfoContext(ctx, "inbound packet connection to ", metadata.Destination)
  211. ctx = session.ContextWithInbound(ctx, &session.Inbound{
  212. Source: net.DestinationFromAddr(metadata.Source.UDPAddr()),
  213. })
  214. pc := &PacketConn{conn}
  215. _ = t.dispatcher.DispatchLink(ctx, singbridge.ToDestination(metadata.Destination, net.Network_UDP), &transport.Link{
  216. Reader: pc,
  217. Writer: pc,
  218. })
  219. conn.Close()
  220. return nil
  221. }
  222. func (t *Tun) Close() error {
  223. return sing_common.Close(
  224. t.packageManager,
  225. t.interfaceMonitor,
  226. t.networkMonitor,
  227. t.tunStack,
  228. t.tunIf,
  229. )
  230. }
  231. func (t *Tun) OnPackagesUpdated(packages int, sharedUsers int) {
  232. t.logger.Info("updated packages list: ", packages, " packages, ", sharedUsers, " shared users")
  233. }
  234. func (t *Tun) NewError(ctx context.Context, err error) {
  235. }
  236. func (t *Tun) notifyNetworkUpdate(int) error {
  237. if runtime.GOOS == "android" {
  238. var vpnStatus string
  239. if t.interfaceMonitor.AndroidVPNEnabled() {
  240. vpnStatus = "enabled"
  241. } else {
  242. vpnStatus = "disabled"
  243. }
  244. t.logger.Info("updated default interface ", t.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", t.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()), ", vpn ", vpnStatus)
  245. } else {
  246. t.logger.Info("updated default interface ", t.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", t.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()))
  247. }
  248. return nil
  249. }
  250. func uidToRange(uidList []uint32) []ranges.Range[uint32] {
  251. return sing_common.Map(uidList, func(uid uint32) ranges.Range[uint32] {
  252. return ranges.NewSingle(uint32(uid))
  253. })
  254. }
  255. func parseRange(uidRanges []ranges.Range[uint32], rangeList []string) ([]ranges.Range[uint32], error) {
  256. for _, uidRange := range rangeList {
  257. if !strings.Contains(uidRange, ":") {
  258. return nil, E.New("missing ':' in range: ", uidRange)
  259. }
  260. subIndex := strings.Index(uidRange, ":")
  261. if subIndex == 0 {
  262. return nil, E.New("missing range start: ", uidRange)
  263. } else if subIndex == len(uidRange)-1 {
  264. return nil, E.New("missing range end: ", uidRange)
  265. }
  266. var start, end uint64
  267. var err error
  268. start, err = strconv.ParseUint(uidRange[:subIndex], 10, 32)
  269. if err != nil {
  270. return nil, E.Cause(err, "parse range start")
  271. }
  272. end, err = strconv.ParseUint(uidRange[subIndex+1:], 10, 32)
  273. if err != nil {
  274. return nil, E.Cause(err, "parse range end")
  275. }
  276. uidRanges = append(uidRanges, ranges.New(uint32(start), uint32(end)))
  277. }
  278. return uidRanges, nil
  279. }