router.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988
  1. package route
  2. import (
  3. "context"
  4. "errors"
  5. "net/netip"
  6. "net/url"
  7. "os"
  8. "runtime"
  9. "strings"
  10. "time"
  11. "github.com/sagernet/sing-box/adapter"
  12. "github.com/sagernet/sing-box/common/conntrack"
  13. "github.com/sagernet/sing-box/common/dialer"
  14. "github.com/sagernet/sing-box/common/geoip"
  15. "github.com/sagernet/sing-box/common/geosite"
  16. "github.com/sagernet/sing-box/common/process"
  17. "github.com/sagernet/sing-box/common/taskmonitor"
  18. C "github.com/sagernet/sing-box/constant"
  19. "github.com/sagernet/sing-box/experimental/libbox/platform"
  20. "github.com/sagernet/sing-box/log"
  21. "github.com/sagernet/sing-box/option"
  22. R "github.com/sagernet/sing-box/route/rule"
  23. "github.com/sagernet/sing-box/transport/fakeip"
  24. "github.com/sagernet/sing-dns"
  25. "github.com/sagernet/sing-tun"
  26. "github.com/sagernet/sing/common"
  27. "github.com/sagernet/sing/common/control"
  28. E "github.com/sagernet/sing/common/exceptions"
  29. F "github.com/sagernet/sing/common/format"
  30. M "github.com/sagernet/sing/common/metadata"
  31. N "github.com/sagernet/sing/common/network"
  32. "github.com/sagernet/sing/common/ntp"
  33. "github.com/sagernet/sing/common/task"
  34. "github.com/sagernet/sing/common/winpowrprof"
  35. "github.com/sagernet/sing/service"
  36. "github.com/sagernet/sing/service/pause"
  37. )
  38. var _ adapter.Router = (*Router)(nil)
  39. type Router struct {
  40. ctx context.Context
  41. logger log.ContextLogger
  42. dnsLogger log.ContextLogger
  43. inboundByTag map[string]adapter.Inbound
  44. outbounds []adapter.Outbound
  45. outboundByTag map[string]adapter.Outbound
  46. rules []adapter.Rule
  47. defaultDetour string
  48. defaultOutboundForConnection adapter.Outbound
  49. defaultOutboundForPacketConnection adapter.Outbound
  50. needGeoIPDatabase bool
  51. needGeositeDatabase bool
  52. geoIPOptions option.GeoIPOptions
  53. geositeOptions option.GeositeOptions
  54. geoIPReader *geoip.Reader
  55. geositeReader *geosite.Reader
  56. geositeCache map[string]adapter.Rule
  57. needFindProcess bool
  58. dnsClient *dns.Client
  59. defaultDomainStrategy dns.DomainStrategy
  60. dnsRules []adapter.DNSRule
  61. ruleSets []adapter.RuleSet
  62. ruleSetMap map[string]adapter.RuleSet
  63. defaultTransport dns.Transport
  64. transports []dns.Transport
  65. transportMap map[string]dns.Transport
  66. transportDomainStrategy map[dns.Transport]dns.DomainStrategy
  67. dnsReverseMapping *DNSReverseMapping
  68. fakeIPStore adapter.FakeIPStore
  69. interfaceFinder *control.DefaultInterfaceFinder
  70. autoDetectInterface bool
  71. defaultInterface string
  72. defaultMark uint32
  73. autoRedirectOutputMark uint32
  74. networkMonitor tun.NetworkUpdateMonitor
  75. interfaceMonitor tun.DefaultInterfaceMonitor
  76. packageManager tun.PackageManager
  77. powerListener winpowrprof.EventListener
  78. processSearcher process.Searcher
  79. timeService *ntp.Service
  80. pauseManager pause.Manager
  81. clashServer adapter.ClashServer
  82. v2rayServer adapter.V2RayServer
  83. platformInterface platform.Interface
  84. needWIFIState bool
  85. needPackageManager bool
  86. wifiState adapter.WIFIState
  87. started bool
  88. }
  89. func NewRouter(
  90. ctx context.Context,
  91. logFactory log.Factory,
  92. options option.RouteOptions,
  93. dnsOptions option.DNSOptions,
  94. ntpOptions option.NTPOptions,
  95. inbounds []option.Inbound,
  96. ) (*Router, error) {
  97. router := &Router{
  98. ctx: ctx,
  99. logger: logFactory.NewLogger("router"),
  100. dnsLogger: logFactory.NewLogger("dns"),
  101. outboundByTag: make(map[string]adapter.Outbound),
  102. rules: make([]adapter.Rule, 0, len(options.Rules)),
  103. dnsRules: make([]adapter.DNSRule, 0, len(dnsOptions.Rules)),
  104. ruleSetMap: make(map[string]adapter.RuleSet),
  105. needGeoIPDatabase: hasRule(options.Rules, isGeoIPRule) || hasDNSRule(dnsOptions.Rules, isGeoIPDNSRule),
  106. needGeositeDatabase: hasRule(options.Rules, isGeositeRule) || hasDNSRule(dnsOptions.Rules, isGeositeDNSRule),
  107. geoIPOptions: common.PtrValueOrDefault(options.GeoIP),
  108. geositeOptions: common.PtrValueOrDefault(options.Geosite),
  109. geositeCache: make(map[string]adapter.Rule),
  110. needFindProcess: hasRule(options.Rules, isProcessRule) || hasDNSRule(dnsOptions.Rules, isProcessDNSRule) || options.FindProcess,
  111. defaultDetour: options.Final,
  112. defaultDomainStrategy: dns.DomainStrategy(dnsOptions.Strategy),
  113. interfaceFinder: control.NewDefaultInterfaceFinder(),
  114. autoDetectInterface: options.AutoDetectInterface,
  115. defaultInterface: options.DefaultInterface,
  116. defaultMark: options.DefaultMark,
  117. pauseManager: service.FromContext[pause.Manager](ctx),
  118. platformInterface: service.FromContext[platform.Interface](ctx),
  119. needWIFIState: hasRule(options.Rules, isWIFIRule) || hasDNSRule(dnsOptions.Rules, isWIFIDNSRule),
  120. needPackageManager: common.Any(inbounds, func(inbound option.Inbound) bool {
  121. if tunOptions, isTUN := inbound.Options.(*option.TunInboundOptions); isTUN && tunOptions.AutoRoute {
  122. return true
  123. }
  124. return false
  125. }),
  126. }
  127. router.dnsClient = dns.NewClient(dns.ClientOptions{
  128. DisableCache: dnsOptions.DNSClientOptions.DisableCache,
  129. DisableExpire: dnsOptions.DNSClientOptions.DisableExpire,
  130. IndependentCache: dnsOptions.DNSClientOptions.IndependentCache,
  131. RDRC: func() dns.RDRCStore {
  132. cacheFile := service.FromContext[adapter.CacheFile](ctx)
  133. if cacheFile == nil {
  134. return nil
  135. }
  136. if !cacheFile.StoreRDRC() {
  137. return nil
  138. }
  139. return cacheFile
  140. },
  141. Logger: router.dnsLogger,
  142. })
  143. for i, ruleOptions := range options.Rules {
  144. routeRule, err := R.NewRule(ctx, router, router.logger, ruleOptions, true)
  145. if err != nil {
  146. return nil, E.Cause(err, "parse rule[", i, "]")
  147. }
  148. router.rules = append(router.rules, routeRule)
  149. }
  150. for i, dnsRuleOptions := range dnsOptions.Rules {
  151. dnsRule, err := R.NewDNSRule(ctx, router, router.logger, dnsRuleOptions, true)
  152. if err != nil {
  153. return nil, E.Cause(err, "parse dns rule[", i, "]")
  154. }
  155. router.dnsRules = append(router.dnsRules, dnsRule)
  156. }
  157. for i, ruleSetOptions := range options.RuleSet {
  158. if _, exists := router.ruleSetMap[ruleSetOptions.Tag]; exists {
  159. return nil, E.New("duplicate rule-set tag: ", ruleSetOptions.Tag)
  160. }
  161. ruleSet, err := R.NewRuleSet(ctx, router, router.logger, ruleSetOptions)
  162. if err != nil {
  163. return nil, E.Cause(err, "parse rule-set[", i, "]")
  164. }
  165. router.ruleSets = append(router.ruleSets, ruleSet)
  166. router.ruleSetMap[ruleSetOptions.Tag] = ruleSet
  167. }
  168. transports := make([]dns.Transport, len(dnsOptions.Servers))
  169. dummyTransportMap := make(map[string]dns.Transport)
  170. transportMap := make(map[string]dns.Transport)
  171. transportTags := make([]string, len(dnsOptions.Servers))
  172. transportTagMap := make(map[string]bool)
  173. transportDomainStrategy := make(map[dns.Transport]dns.DomainStrategy)
  174. for i, server := range dnsOptions.Servers {
  175. var tag string
  176. if server.Tag != "" {
  177. tag = server.Tag
  178. } else {
  179. tag = F.ToString(i)
  180. }
  181. if transportTagMap[tag] {
  182. return nil, E.New("duplicate dns server tag: ", tag)
  183. }
  184. transportTags[i] = tag
  185. transportTagMap[tag] = true
  186. }
  187. ctx = adapter.ContextWithRouter(ctx, router)
  188. for {
  189. lastLen := len(dummyTransportMap)
  190. for i, server := range dnsOptions.Servers {
  191. tag := transportTags[i]
  192. if _, exists := dummyTransportMap[tag]; exists {
  193. continue
  194. }
  195. var detour N.Dialer
  196. if server.Detour == "" {
  197. detour = dialer.NewRouter(router)
  198. } else {
  199. detour = dialer.NewDetour(router, server.Detour)
  200. }
  201. switch server.Address {
  202. case "local":
  203. default:
  204. serverURL, _ := url.Parse(server.Address)
  205. var serverAddress string
  206. if serverURL != nil {
  207. serverAddress = serverURL.Hostname()
  208. }
  209. if serverAddress == "" {
  210. serverAddress = server.Address
  211. }
  212. notIpAddress := !M.ParseSocksaddr(serverAddress).Addr.IsValid()
  213. if server.AddressResolver != "" {
  214. if !transportTagMap[server.AddressResolver] {
  215. return nil, E.New("parse dns server[", tag, "]: address resolver not found: ", server.AddressResolver)
  216. }
  217. if upstream, exists := dummyTransportMap[server.AddressResolver]; exists {
  218. detour = dns.NewDialerWrapper(detour, router.dnsClient, upstream, dns.DomainStrategy(server.AddressStrategy), time.Duration(server.AddressFallbackDelay))
  219. } else {
  220. continue
  221. }
  222. } else if notIpAddress && strings.Contains(server.Address, ".") {
  223. return nil, E.New("parse dns server[", tag, "]: missing address_resolver")
  224. }
  225. }
  226. var clientSubnet netip.Prefix
  227. if server.ClientSubnet != nil {
  228. clientSubnet = server.ClientSubnet.Build()
  229. } else if dnsOptions.ClientSubnet != nil {
  230. clientSubnet = dnsOptions.ClientSubnet.Build()
  231. }
  232. transport, err := dns.CreateTransport(dns.TransportOptions{
  233. Context: ctx,
  234. Logger: logFactory.NewLogger(F.ToString("dns/transport[", tag, "]")),
  235. Name: tag,
  236. Dialer: detour,
  237. Address: server.Address,
  238. ClientSubnet: clientSubnet,
  239. })
  240. if err != nil {
  241. return nil, E.Cause(err, "parse dns server[", tag, "]")
  242. }
  243. transports[i] = transport
  244. dummyTransportMap[tag] = transport
  245. if server.Tag != "" {
  246. transportMap[server.Tag] = transport
  247. }
  248. strategy := dns.DomainStrategy(server.Strategy)
  249. if strategy != dns.DomainStrategyAsIS {
  250. transportDomainStrategy[transport] = strategy
  251. }
  252. }
  253. if len(transports) == len(dummyTransportMap) {
  254. break
  255. }
  256. if lastLen != len(dummyTransportMap) {
  257. continue
  258. }
  259. unresolvedTags := common.MapIndexed(common.FilterIndexed(dnsOptions.Servers, func(index int, server option.DNSServerOptions) bool {
  260. _, exists := dummyTransportMap[transportTags[index]]
  261. return !exists
  262. }), func(index int, server option.DNSServerOptions) string {
  263. return transportTags[index]
  264. })
  265. if len(unresolvedTags) == 0 {
  266. panic(F.ToString("unexpected unresolved dns servers: ", len(transports), " ", len(dummyTransportMap), " ", len(transportMap)))
  267. }
  268. return nil, E.New("found circular reference in dns servers: ", strings.Join(unresolvedTags, " "))
  269. }
  270. var defaultTransport dns.Transport
  271. if dnsOptions.Final != "" {
  272. defaultTransport = dummyTransportMap[dnsOptions.Final]
  273. if defaultTransport == nil {
  274. return nil, E.New("default dns server not found: ", dnsOptions.Final)
  275. }
  276. }
  277. if defaultTransport == nil {
  278. if len(transports) == 0 {
  279. transports = append(transports, common.Must1(dns.CreateTransport(dns.TransportOptions{
  280. Context: ctx,
  281. Name: "local",
  282. Address: "local",
  283. Dialer: common.Must1(dialer.NewDefault(router, option.DialerOptions{})),
  284. })))
  285. }
  286. defaultTransport = transports[0]
  287. }
  288. if _, isFakeIP := defaultTransport.(adapter.FakeIPTransport); isFakeIP {
  289. return nil, E.New("default DNS server cannot be fakeip")
  290. }
  291. router.defaultTransport = defaultTransport
  292. router.transports = transports
  293. router.transportMap = transportMap
  294. router.transportDomainStrategy = transportDomainStrategy
  295. if dnsOptions.ReverseMapping {
  296. router.dnsReverseMapping = NewDNSReverseMapping()
  297. }
  298. if fakeIPOptions := dnsOptions.FakeIP; fakeIPOptions != nil && dnsOptions.FakeIP.Enabled {
  299. var inet4Range netip.Prefix
  300. var inet6Range netip.Prefix
  301. if fakeIPOptions.Inet4Range != nil {
  302. inet4Range = *fakeIPOptions.Inet4Range
  303. }
  304. if fakeIPOptions.Inet6Range != nil {
  305. inet6Range = *fakeIPOptions.Inet6Range
  306. }
  307. router.fakeIPStore = fakeip.NewStore(ctx, router.logger, inet4Range, inet6Range)
  308. }
  309. usePlatformDefaultInterfaceMonitor := router.platformInterface != nil && router.platformInterface.UsePlatformDefaultInterfaceMonitor()
  310. needInterfaceMonitor := options.AutoDetectInterface || common.Any(inbounds, func(inbound option.Inbound) bool {
  311. if httpMixedOptions, isHTTPMixed := inbound.Options.(*option.HTTPMixedInboundOptions); isHTTPMixed && httpMixedOptions.SetSystemProxy {
  312. return true
  313. }
  314. if tunOptions, isTUN := inbound.Options.(*option.TunInboundOptions); isTUN && tunOptions.AutoRoute {
  315. return true
  316. }
  317. return false
  318. })
  319. if !usePlatformDefaultInterfaceMonitor {
  320. networkMonitor, err := tun.NewNetworkUpdateMonitor(router.logger)
  321. if !((err != nil && !needInterfaceMonitor) || errors.Is(err, os.ErrInvalid)) {
  322. if err != nil {
  323. return nil, err
  324. }
  325. router.networkMonitor = networkMonitor
  326. networkMonitor.RegisterCallback(func() {
  327. _ = router.interfaceFinder.Update()
  328. })
  329. interfaceMonitor, err := tun.NewDefaultInterfaceMonitor(router.networkMonitor, router.logger, tun.DefaultInterfaceMonitorOptions{
  330. InterfaceFinder: router.interfaceFinder,
  331. OverrideAndroidVPN: options.OverrideAndroidVPN,
  332. UnderNetworkExtension: router.platformInterface != nil && router.platformInterface.UnderNetworkExtension(),
  333. })
  334. if err != nil {
  335. return nil, E.New("auto_detect_interface unsupported on current platform")
  336. }
  337. interfaceMonitor.RegisterCallback(router.notifyNetworkUpdate)
  338. router.interfaceMonitor = interfaceMonitor
  339. }
  340. } else {
  341. interfaceMonitor := router.platformInterface.CreateDefaultInterfaceMonitor(router.logger)
  342. interfaceMonitor.RegisterCallback(router.notifyNetworkUpdate)
  343. router.interfaceMonitor = interfaceMonitor
  344. }
  345. if ntpOptions.Enabled {
  346. ntpDialer, err := dialer.New(router, ntpOptions.DialerOptions)
  347. if err != nil {
  348. return nil, E.Cause(err, "create NTP service")
  349. }
  350. timeService := ntp.NewService(ntp.Options{
  351. Context: ctx,
  352. Dialer: ntpDialer,
  353. Logger: logFactory.NewLogger("ntp"),
  354. Server: ntpOptions.ServerOptions.Build(),
  355. Interval: time.Duration(ntpOptions.Interval),
  356. WriteToSystem: ntpOptions.WriteToSystem,
  357. })
  358. service.MustRegister[ntp.TimeService](ctx, timeService)
  359. router.timeService = timeService
  360. }
  361. return router, nil
  362. }
  363. func (r *Router) Initialize(inbounds []adapter.Inbound, outbounds []adapter.Outbound, defaultOutbound func() adapter.Outbound) error {
  364. inboundByTag := make(map[string]adapter.Inbound)
  365. for _, inbound := range inbounds {
  366. inboundByTag[inbound.Tag()] = inbound
  367. }
  368. outboundByTag := make(map[string]adapter.Outbound)
  369. for _, detour := range outbounds {
  370. outboundByTag[detour.Tag()] = detour
  371. }
  372. var defaultOutboundForConnection adapter.Outbound
  373. var defaultOutboundForPacketConnection adapter.Outbound
  374. if r.defaultDetour != "" {
  375. detour, loaded := outboundByTag[r.defaultDetour]
  376. if !loaded {
  377. return E.New("default detour not found: ", r.defaultDetour)
  378. }
  379. if common.Contains(detour.Network(), N.NetworkTCP) {
  380. defaultOutboundForConnection = detour
  381. }
  382. if common.Contains(detour.Network(), N.NetworkUDP) {
  383. defaultOutboundForPacketConnection = detour
  384. }
  385. }
  386. if defaultOutboundForConnection == nil {
  387. for _, detour := range outbounds {
  388. if common.Contains(detour.Network(), N.NetworkTCP) {
  389. defaultOutboundForConnection = detour
  390. break
  391. }
  392. }
  393. }
  394. if defaultOutboundForPacketConnection == nil {
  395. for _, detour := range outbounds {
  396. if common.Contains(detour.Network(), N.NetworkUDP) {
  397. defaultOutboundForPacketConnection = detour
  398. break
  399. }
  400. }
  401. }
  402. if defaultOutboundForConnection == nil || defaultOutboundForPacketConnection == nil {
  403. detour := defaultOutbound()
  404. if defaultOutboundForConnection == nil {
  405. defaultOutboundForConnection = detour
  406. }
  407. if defaultOutboundForPacketConnection == nil {
  408. defaultOutboundForPacketConnection = detour
  409. }
  410. outbounds = append(outbounds, detour)
  411. outboundByTag[detour.Tag()] = detour
  412. }
  413. r.inboundByTag = inboundByTag
  414. r.outbounds = outbounds
  415. r.defaultOutboundForConnection = defaultOutboundForConnection
  416. r.defaultOutboundForPacketConnection = defaultOutboundForPacketConnection
  417. r.outboundByTag = outboundByTag
  418. for i, rule := range r.rules {
  419. routeAction, isRoute := rule.Action().(*R.RuleActionRoute)
  420. if !isRoute {
  421. continue
  422. }
  423. if _, loaded := outboundByTag[routeAction.Outbound]; !loaded {
  424. return E.New("outbound not found for rule[", i, "]: ", routeAction.Outbound)
  425. }
  426. }
  427. return nil
  428. }
  429. func (r *Router) Outbounds() []adapter.Outbound {
  430. if !r.started {
  431. return nil
  432. }
  433. return r.outbounds
  434. }
  435. func (r *Router) PreStart() error {
  436. monitor := taskmonitor.New(r.logger, C.StartTimeout)
  437. if r.interfaceMonitor != nil {
  438. monitor.Start("initialize interface monitor")
  439. err := r.interfaceMonitor.Start()
  440. monitor.Finish()
  441. if err != nil {
  442. return err
  443. }
  444. }
  445. if r.networkMonitor != nil {
  446. monitor.Start("initialize network monitor")
  447. err := r.networkMonitor.Start()
  448. monitor.Finish()
  449. if err != nil {
  450. return err
  451. }
  452. }
  453. if r.fakeIPStore != nil {
  454. monitor.Start("initialize fakeip store")
  455. err := r.fakeIPStore.Start()
  456. monitor.Finish()
  457. if err != nil {
  458. return err
  459. }
  460. }
  461. return nil
  462. }
  463. func (r *Router) Start() error {
  464. monitor := taskmonitor.New(r.logger, C.StartTimeout)
  465. if r.needGeoIPDatabase {
  466. monitor.Start("initialize geoip database")
  467. err := r.prepareGeoIPDatabase()
  468. monitor.Finish()
  469. if err != nil {
  470. return err
  471. }
  472. }
  473. if r.needGeositeDatabase {
  474. monitor.Start("initialize geosite database")
  475. err := r.prepareGeositeDatabase()
  476. monitor.Finish()
  477. if err != nil {
  478. return err
  479. }
  480. }
  481. if r.needGeositeDatabase {
  482. for _, rule := range r.rules {
  483. err := rule.UpdateGeosite()
  484. if err != nil {
  485. r.logger.Error("failed to initialize geosite: ", err)
  486. }
  487. }
  488. for _, rule := range r.dnsRules {
  489. err := rule.UpdateGeosite()
  490. if err != nil {
  491. r.logger.Error("failed to initialize geosite: ", err)
  492. }
  493. }
  494. err := common.Close(r.geositeReader)
  495. if err != nil {
  496. return err
  497. }
  498. r.geositeCache = nil
  499. r.geositeReader = nil
  500. }
  501. if runtime.GOOS == "windows" {
  502. powerListener, err := winpowrprof.NewEventListener(r.notifyWindowsPowerEvent)
  503. if err == nil {
  504. r.powerListener = powerListener
  505. } else {
  506. r.logger.Warn("initialize power listener: ", err)
  507. }
  508. }
  509. if r.powerListener != nil {
  510. monitor.Start("start power listener")
  511. err := r.powerListener.Start()
  512. monitor.Finish()
  513. if err != nil {
  514. return E.Cause(err, "start power listener")
  515. }
  516. }
  517. monitor.Start("initialize DNS client")
  518. r.dnsClient.Start()
  519. monitor.Finish()
  520. if C.IsAndroid && r.platformInterface == nil {
  521. monitor.Start("initialize package manager")
  522. packageManager, err := tun.NewPackageManager(tun.PackageManagerOptions{
  523. Callback: r,
  524. Logger: r.logger,
  525. })
  526. monitor.Finish()
  527. if err != nil {
  528. return E.Cause(err, "create package manager")
  529. }
  530. if r.needPackageManager {
  531. monitor.Start("start package manager")
  532. err = packageManager.Start()
  533. monitor.Finish()
  534. if err != nil {
  535. return E.Cause(err, "start package manager")
  536. }
  537. }
  538. r.packageManager = packageManager
  539. }
  540. for i, rule := range r.dnsRules {
  541. monitor.Start("initialize DNS rule[", i, "]")
  542. err := rule.Start()
  543. monitor.Finish()
  544. if err != nil {
  545. return E.Cause(err, "initialize DNS rule[", i, "]")
  546. }
  547. }
  548. for i, transport := range r.transports {
  549. monitor.Start("initialize DNS transport[", i, "]")
  550. err := transport.Start()
  551. monitor.Finish()
  552. if err != nil {
  553. return E.Cause(err, "initialize DNS server[", i, "]")
  554. }
  555. }
  556. if r.timeService != nil {
  557. monitor.Start("initialize time service")
  558. err := r.timeService.Start()
  559. monitor.Finish()
  560. if err != nil {
  561. return E.Cause(err, "initialize time service")
  562. }
  563. }
  564. return nil
  565. }
  566. func (r *Router) Close() error {
  567. monitor := taskmonitor.New(r.logger, C.StopTimeout)
  568. var err error
  569. for i, rule := range r.rules {
  570. monitor.Start("close rule[", i, "]")
  571. err = E.Append(err, rule.Close(), func(err error) error {
  572. return E.Cause(err, "close rule[", i, "]")
  573. })
  574. monitor.Finish()
  575. }
  576. for i, rule := range r.dnsRules {
  577. monitor.Start("close dns rule[", i, "]")
  578. err = E.Append(err, rule.Close(), func(err error) error {
  579. return E.Cause(err, "close dns rule[", i, "]")
  580. })
  581. monitor.Finish()
  582. }
  583. for i, transport := range r.transports {
  584. monitor.Start("close dns transport[", i, "]")
  585. err = E.Append(err, transport.Close(), func(err error) error {
  586. return E.Cause(err, "close dns transport[", i, "]")
  587. })
  588. monitor.Finish()
  589. }
  590. if r.geoIPReader != nil {
  591. monitor.Start("close geoip reader")
  592. err = E.Append(err, r.geoIPReader.Close(), func(err error) error {
  593. return E.Cause(err, "close geoip reader")
  594. })
  595. monitor.Finish()
  596. }
  597. if r.interfaceMonitor != nil {
  598. monitor.Start("close interface monitor")
  599. err = E.Append(err, r.interfaceMonitor.Close(), func(err error) error {
  600. return E.Cause(err, "close interface monitor")
  601. })
  602. monitor.Finish()
  603. }
  604. if r.networkMonitor != nil {
  605. monitor.Start("close network monitor")
  606. err = E.Append(err, r.networkMonitor.Close(), func(err error) error {
  607. return E.Cause(err, "close network monitor")
  608. })
  609. monitor.Finish()
  610. }
  611. if r.packageManager != nil {
  612. monitor.Start("close package manager")
  613. err = E.Append(err, r.packageManager.Close(), func(err error) error {
  614. return E.Cause(err, "close package manager")
  615. })
  616. monitor.Finish()
  617. }
  618. if r.powerListener != nil {
  619. monitor.Start("close power listener")
  620. err = E.Append(err, r.powerListener.Close(), func(err error) error {
  621. return E.Cause(err, "close power listener")
  622. })
  623. monitor.Finish()
  624. }
  625. if r.timeService != nil {
  626. monitor.Start("close time service")
  627. err = E.Append(err, r.timeService.Close(), func(err error) error {
  628. return E.Cause(err, "close time service")
  629. })
  630. monitor.Finish()
  631. }
  632. if r.fakeIPStore != nil {
  633. monitor.Start("close fakeip store")
  634. err = E.Append(err, r.fakeIPStore.Close(), func(err error) error {
  635. return E.Cause(err, "close fakeip store")
  636. })
  637. monitor.Finish()
  638. }
  639. return err
  640. }
  641. func (r *Router) PostStart() error {
  642. monitor := taskmonitor.New(r.logger, C.StopTimeout)
  643. var cacheContext *adapter.HTTPStartContext
  644. if len(r.ruleSets) > 0 {
  645. monitor.Start("initialize rule-set")
  646. cacheContext = adapter.NewHTTPStartContext()
  647. var ruleSetStartGroup task.Group
  648. for i, ruleSet := range r.ruleSets {
  649. ruleSetInPlace := ruleSet
  650. ruleSetStartGroup.Append0(func(ctx context.Context) error {
  651. err := ruleSetInPlace.StartContext(ctx, cacheContext)
  652. if err != nil {
  653. return E.Cause(err, "initialize rule-set[", i, "]")
  654. }
  655. return nil
  656. })
  657. }
  658. ruleSetStartGroup.Concurrency(5)
  659. ruleSetStartGroup.FastFail()
  660. err := ruleSetStartGroup.Run(r.ctx)
  661. monitor.Finish()
  662. if err != nil {
  663. return err
  664. }
  665. }
  666. if cacheContext != nil {
  667. cacheContext.Close()
  668. }
  669. needFindProcess := r.needFindProcess
  670. needWIFIState := r.needWIFIState
  671. for _, ruleSet := range r.ruleSets {
  672. metadata := ruleSet.Metadata()
  673. if metadata.ContainsProcessRule {
  674. needFindProcess = true
  675. }
  676. if metadata.ContainsWIFIRule {
  677. needWIFIState = true
  678. }
  679. }
  680. if C.IsAndroid && r.platformInterface == nil && !r.needPackageManager {
  681. if needFindProcess {
  682. monitor.Start("start package manager")
  683. err := r.packageManager.Start()
  684. monitor.Finish()
  685. if err != nil {
  686. return E.Cause(err, "start package manager")
  687. }
  688. } else {
  689. r.packageManager = nil
  690. }
  691. }
  692. if needFindProcess {
  693. if r.platformInterface != nil {
  694. r.processSearcher = r.platformInterface
  695. } else {
  696. monitor.Start("initialize process searcher")
  697. searcher, err := process.NewSearcher(process.Config{
  698. Logger: r.logger,
  699. PackageManager: r.packageManager,
  700. })
  701. monitor.Finish()
  702. if err != nil {
  703. if err != os.ErrInvalid {
  704. r.logger.Warn(E.Cause(err, "create process searcher"))
  705. }
  706. } else {
  707. r.processSearcher = searcher
  708. }
  709. }
  710. }
  711. if needWIFIState && r.platformInterface != nil {
  712. monitor.Start("initialize WIFI state")
  713. r.needWIFIState = true
  714. r.interfaceMonitor.RegisterCallback(func(_ int) {
  715. r.updateWIFIState()
  716. })
  717. r.updateWIFIState()
  718. monitor.Finish()
  719. }
  720. for i, rule := range r.rules {
  721. monitor.Start("initialize rule[", i, "]")
  722. err := rule.Start()
  723. monitor.Finish()
  724. if err != nil {
  725. return E.Cause(err, "initialize rule[", i, "]")
  726. }
  727. }
  728. for _, ruleSet := range r.ruleSets {
  729. monitor.Start("post start rule_set[", ruleSet.Name(), "]")
  730. err := ruleSet.PostStart()
  731. monitor.Finish()
  732. if err != nil {
  733. return E.Cause(err, "post start rule_set[", ruleSet.Name(), "]")
  734. }
  735. }
  736. r.started = true
  737. return nil
  738. }
  739. func (r *Router) Cleanup() error {
  740. for _, ruleSet := range r.ruleSetMap {
  741. ruleSet.Cleanup()
  742. }
  743. runtime.GC()
  744. return nil
  745. }
  746. func (r *Router) Outbound(tag string) (adapter.Outbound, bool) {
  747. outbound, loaded := r.outboundByTag[tag]
  748. return outbound, loaded
  749. }
  750. func (r *Router) DefaultOutbound(network string) (adapter.Outbound, error) {
  751. if network == N.NetworkTCP {
  752. if r.defaultOutboundForConnection == nil {
  753. return nil, E.New("missing default outbound for TCP connections")
  754. }
  755. return r.defaultOutboundForConnection, nil
  756. } else {
  757. if r.defaultOutboundForPacketConnection == nil {
  758. return nil, E.New("missing default outbound for UDP connections")
  759. }
  760. return r.defaultOutboundForPacketConnection, nil
  761. }
  762. }
  763. func (r *Router) FakeIPStore() adapter.FakeIPStore {
  764. return r.fakeIPStore
  765. }
  766. func (r *Router) RuleSet(tag string) (adapter.RuleSet, bool) {
  767. ruleSet, loaded := r.ruleSetMap[tag]
  768. return ruleSet, loaded
  769. }
  770. func (r *Router) NeedWIFIState() bool {
  771. return r.needWIFIState
  772. }
  773. func (r *Router) InterfaceFinder() control.InterfaceFinder {
  774. return r.interfaceFinder
  775. }
  776. func (r *Router) UpdateInterfaces() error {
  777. if r.platformInterface == nil || !r.platformInterface.UsePlatformInterfaceGetter() {
  778. return r.interfaceFinder.Update()
  779. } else {
  780. interfaces, err := r.platformInterface.Interfaces()
  781. if err != nil {
  782. return err
  783. }
  784. r.interfaceFinder.UpdateInterfaces(interfaces)
  785. return nil
  786. }
  787. }
  788. func (r *Router) AutoDetectInterface() bool {
  789. return r.autoDetectInterface
  790. }
  791. func (r *Router) AutoDetectInterfaceFunc() control.Func {
  792. if r.platformInterface != nil && r.platformInterface.UsePlatformAutoDetectInterfaceControl() {
  793. return r.platformInterface.AutoDetectInterfaceControl()
  794. } else {
  795. if r.interfaceMonitor == nil {
  796. return nil
  797. }
  798. return control.BindToInterfaceFunc(r.InterfaceFinder(), func(network string, address string) (interfaceName string, interfaceIndex int, err error) {
  799. remoteAddr := M.ParseSocksaddr(address).Addr
  800. if C.IsLinux {
  801. interfaceName, interfaceIndex = r.InterfaceMonitor().DefaultInterface(remoteAddr)
  802. if interfaceIndex == -1 {
  803. err = tun.ErrNoRoute
  804. }
  805. } else {
  806. interfaceIndex = r.InterfaceMonitor().DefaultInterfaceIndex(remoteAddr)
  807. if interfaceIndex == -1 {
  808. err = tun.ErrNoRoute
  809. }
  810. }
  811. return
  812. })
  813. }
  814. }
  815. func (r *Router) RegisterAutoRedirectOutputMark(mark uint32) error {
  816. if r.autoRedirectOutputMark > 0 {
  817. return E.New("only one auto-redirect can be configured")
  818. }
  819. r.autoRedirectOutputMark = mark
  820. return nil
  821. }
  822. func (r *Router) AutoRedirectOutputMark() uint32 {
  823. return r.autoRedirectOutputMark
  824. }
  825. func (r *Router) DefaultInterface() string {
  826. return r.defaultInterface
  827. }
  828. func (r *Router) DefaultMark() uint32 {
  829. return r.defaultMark
  830. }
  831. func (r *Router) Rules() []adapter.Rule {
  832. return r.rules
  833. }
  834. func (r *Router) WIFIState() adapter.WIFIState {
  835. return r.wifiState
  836. }
  837. func (r *Router) NetworkMonitor() tun.NetworkUpdateMonitor {
  838. return r.networkMonitor
  839. }
  840. func (r *Router) InterfaceMonitor() tun.DefaultInterfaceMonitor {
  841. return r.interfaceMonitor
  842. }
  843. func (r *Router) PackageManager() tun.PackageManager {
  844. return r.packageManager
  845. }
  846. func (r *Router) ClashServer() adapter.ClashServer {
  847. return r.clashServer
  848. }
  849. func (r *Router) SetClashServer(server adapter.ClashServer) {
  850. r.clashServer = server
  851. }
  852. func (r *Router) V2RayServer() adapter.V2RayServer {
  853. return r.v2rayServer
  854. }
  855. func (r *Router) SetV2RayServer(server adapter.V2RayServer) {
  856. r.v2rayServer = server
  857. }
  858. func (r *Router) OnPackagesUpdated(packages int, sharedUsers int) {
  859. r.logger.Info("updated packages list: ", packages, " packages, ", sharedUsers, " shared users")
  860. }
  861. func (r *Router) NewError(ctx context.Context, err error) {
  862. common.Close(err)
  863. if E.IsClosedOrCanceled(err) {
  864. r.logger.DebugContext(ctx, "connection closed: ", err)
  865. return
  866. }
  867. r.logger.ErrorContext(ctx, err)
  868. }
  869. func (r *Router) notifyNetworkUpdate(event int) {
  870. if event == tun.EventNoRoute {
  871. r.pauseManager.NetworkPause()
  872. r.logger.Error("missing default interface")
  873. } else {
  874. r.pauseManager.NetworkWake()
  875. if C.IsAndroid && r.platformInterface == nil {
  876. var vpnStatus string
  877. if r.interfaceMonitor.AndroidVPNEnabled() {
  878. vpnStatus = "enabled"
  879. } else {
  880. vpnStatus = "disabled"
  881. }
  882. r.logger.Info("updated default interface ", r.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", r.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()), ", vpn ", vpnStatus)
  883. } else {
  884. r.logger.Info("updated default interface ", r.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", r.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()))
  885. }
  886. }
  887. if !r.started {
  888. return
  889. }
  890. _ = r.ResetNetwork()
  891. }
  892. func (r *Router) ResetNetwork() error {
  893. conntrack.Close()
  894. for _, outbound := range r.outbounds {
  895. listener, isListener := outbound.(adapter.InterfaceUpdateListener)
  896. if isListener {
  897. listener.InterfaceUpdated()
  898. }
  899. }
  900. for _, transport := range r.transports {
  901. transport.Reset()
  902. }
  903. return nil
  904. }
  905. func (r *Router) updateWIFIState() {
  906. if r.platformInterface == nil {
  907. return
  908. }
  909. state := r.platformInterface.ReadWIFIState()
  910. if state != r.wifiState {
  911. r.wifiState = state
  912. if state.SSID == "" && state.BSSID == "" {
  913. r.logger.Info("updated WIFI state: disconnected")
  914. } else {
  915. r.logger.Info("updated WIFI state: SSID=", state.SSID, ", BSSID=", state.BSSID)
  916. }
  917. }
  918. }
  919. func (r *Router) notifyWindowsPowerEvent(event int) {
  920. switch event {
  921. case winpowrprof.EVENT_SUSPEND:
  922. r.pauseManager.DevicePause()
  923. _ = r.ResetNetwork()
  924. case winpowrprof.EVENT_RESUME:
  925. if !r.pauseManager.IsDevicePaused() {
  926. return
  927. }
  928. fallthrough
  929. case winpowrprof.EVENT_RESUME_AUTOMATIC:
  930. r.pauseManager.DeviceWake()
  931. _ = r.ResetNetwork()
  932. }
  933. }