router.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992
  1. package route
  2. import (
  3. "context"
  4. "errors"
  5. "net/netip"
  6. "net/url"
  7. "os"
  8. "runtime"
  9. "strings"
  10. "syscall"
  11. "time"
  12. "github.com/sagernet/sing-box/adapter"
  13. "github.com/sagernet/sing-box/common/conntrack"
  14. "github.com/sagernet/sing-box/common/dialer"
  15. "github.com/sagernet/sing-box/common/geoip"
  16. "github.com/sagernet/sing-box/common/geosite"
  17. "github.com/sagernet/sing-box/common/process"
  18. "github.com/sagernet/sing-box/common/taskmonitor"
  19. C "github.com/sagernet/sing-box/constant"
  20. "github.com/sagernet/sing-box/experimental/libbox/platform"
  21. "github.com/sagernet/sing-box/log"
  22. "github.com/sagernet/sing-box/option"
  23. R "github.com/sagernet/sing-box/route/rule"
  24. "github.com/sagernet/sing-box/transport/fakeip"
  25. "github.com/sagernet/sing-dns"
  26. "github.com/sagernet/sing-tun"
  27. "github.com/sagernet/sing/common"
  28. "github.com/sagernet/sing/common/control"
  29. E "github.com/sagernet/sing/common/exceptions"
  30. F "github.com/sagernet/sing/common/format"
  31. M "github.com/sagernet/sing/common/metadata"
  32. N "github.com/sagernet/sing/common/network"
  33. "github.com/sagernet/sing/common/ntp"
  34. "github.com/sagernet/sing/common/task"
  35. "github.com/sagernet/sing/common/winpowrprof"
  36. "github.com/sagernet/sing/service"
  37. "github.com/sagernet/sing/service/pause"
  38. )
  39. var _ adapter.Router = (*Router)(nil)
  40. type Router struct {
  41. ctx context.Context
  42. logger log.ContextLogger
  43. dnsLogger log.ContextLogger
  44. inboundByTag map[string]adapter.Inbound
  45. outbounds []adapter.Outbound
  46. outboundByTag map[string]adapter.Outbound
  47. rules []adapter.Rule
  48. defaultDetour string
  49. defaultOutboundForConnection adapter.Outbound
  50. defaultOutboundForPacketConnection adapter.Outbound
  51. needGeoIPDatabase bool
  52. needGeositeDatabase bool
  53. geoIPOptions option.GeoIPOptions
  54. geositeOptions option.GeositeOptions
  55. geoIPReader *geoip.Reader
  56. geositeReader *geosite.Reader
  57. geositeCache map[string]adapter.Rule
  58. needFindProcess bool
  59. dnsClient *dns.Client
  60. defaultDomainStrategy dns.DomainStrategy
  61. dnsRules []adapter.DNSRule
  62. ruleSets []adapter.RuleSet
  63. ruleSetMap map[string]adapter.RuleSet
  64. defaultTransport dns.Transport
  65. transports []dns.Transport
  66. transportMap map[string]dns.Transport
  67. transportDomainStrategy map[dns.Transport]dns.DomainStrategy
  68. dnsReverseMapping *DNSReverseMapping
  69. fakeIPStore adapter.FakeIPStore
  70. interfaceFinder *control.DefaultInterfaceFinder
  71. autoDetectInterface bool
  72. defaultInterface string
  73. defaultMark uint32
  74. autoRedirectOutputMark uint32
  75. networkMonitor tun.NetworkUpdateMonitor
  76. interfaceMonitor tun.DefaultInterfaceMonitor
  77. packageManager tun.PackageManager
  78. powerListener winpowrprof.EventListener
  79. processSearcher process.Searcher
  80. timeService *ntp.Service
  81. pauseManager pause.Manager
  82. clashServer adapter.ClashServer
  83. v2rayServer adapter.V2RayServer
  84. platformInterface platform.Interface
  85. needWIFIState bool
  86. needPackageManager bool
  87. wifiState adapter.WIFIState
  88. started bool
  89. }
  90. func NewRouter(
  91. ctx context.Context,
  92. logFactory log.Factory,
  93. options option.RouteOptions,
  94. dnsOptions option.DNSOptions,
  95. ntpOptions option.NTPOptions,
  96. inbounds []option.Inbound,
  97. platformInterface platform.Interface,
  98. ) (*Router, error) {
  99. router := &Router{
  100. ctx: ctx,
  101. logger: logFactory.NewLogger("router"),
  102. dnsLogger: logFactory.NewLogger("dns"),
  103. outboundByTag: make(map[string]adapter.Outbound),
  104. rules: make([]adapter.Rule, 0, len(options.Rules)),
  105. dnsRules: make([]adapter.DNSRule, 0, len(dnsOptions.Rules)),
  106. ruleSetMap: make(map[string]adapter.RuleSet),
  107. needGeoIPDatabase: hasRule(options.Rules, isGeoIPRule) || hasDNSRule(dnsOptions.Rules, isGeoIPDNSRule),
  108. needGeositeDatabase: hasRule(options.Rules, isGeositeRule) || hasDNSRule(dnsOptions.Rules, isGeositeDNSRule),
  109. geoIPOptions: common.PtrValueOrDefault(options.GeoIP),
  110. geositeOptions: common.PtrValueOrDefault(options.Geosite),
  111. geositeCache: make(map[string]adapter.Rule),
  112. needFindProcess: hasRule(options.Rules, isProcessRule) || hasDNSRule(dnsOptions.Rules, isProcessDNSRule) || options.FindProcess,
  113. defaultDetour: options.Final,
  114. defaultDomainStrategy: dns.DomainStrategy(dnsOptions.Strategy),
  115. interfaceFinder: control.NewDefaultInterfaceFinder(),
  116. autoDetectInterface: options.AutoDetectInterface,
  117. defaultInterface: options.DefaultInterface,
  118. defaultMark: options.DefaultMark,
  119. pauseManager: service.FromContext[pause.Manager](ctx),
  120. platformInterface: platformInterface,
  121. needWIFIState: hasRule(options.Rules, isWIFIRule) || hasDNSRule(dnsOptions.Rules, isWIFIDNSRule),
  122. needPackageManager: common.Any(inbounds, func(inbound option.Inbound) bool {
  123. return len(inbound.TunOptions.IncludePackage) > 0 || len(inbound.TunOptions.ExcludePackage) > 0
  124. }),
  125. }
  126. router.dnsClient = dns.NewClient(dns.ClientOptions{
  127. DisableCache: dnsOptions.DNSClientOptions.DisableCache,
  128. DisableExpire: dnsOptions.DNSClientOptions.DisableExpire,
  129. IndependentCache: dnsOptions.DNSClientOptions.IndependentCache,
  130. RDRC: func() dns.RDRCStore {
  131. cacheFile := service.FromContext[adapter.CacheFile](ctx)
  132. if cacheFile == nil {
  133. return nil
  134. }
  135. if !cacheFile.StoreRDRC() {
  136. return nil
  137. }
  138. return cacheFile
  139. },
  140. Logger: router.dnsLogger,
  141. })
  142. for i, ruleOptions := range options.Rules {
  143. routeRule, err := R.NewRule(ctx, router, router.logger, ruleOptions, true)
  144. if err != nil {
  145. return nil, E.Cause(err, "parse rule[", i, "]")
  146. }
  147. router.rules = append(router.rules, routeRule)
  148. }
  149. for i, dnsRuleOptions := range dnsOptions.Rules {
  150. dnsRule, err := R.NewDNSRule(ctx, router, router.logger, dnsRuleOptions, true)
  151. if err != nil {
  152. return nil, E.Cause(err, "parse dns rule[", i, "]")
  153. }
  154. router.dnsRules = append(router.dnsRules, dnsRule)
  155. }
  156. for i, ruleSetOptions := range options.RuleSet {
  157. if _, exists := router.ruleSetMap[ruleSetOptions.Tag]; exists {
  158. return nil, E.New("duplicate rule-set tag: ", ruleSetOptions.Tag)
  159. }
  160. ruleSet, err := R.NewRuleSet(ctx, router, router.logger, ruleSetOptions)
  161. if err != nil {
  162. return nil, E.Cause(err, "parse rule-set[", i, "]")
  163. }
  164. router.ruleSets = append(router.ruleSets, ruleSet)
  165. router.ruleSetMap[ruleSetOptions.Tag] = ruleSet
  166. }
  167. transports := make([]dns.Transport, len(dnsOptions.Servers))
  168. dummyTransportMap := make(map[string]dns.Transport)
  169. transportMap := make(map[string]dns.Transport)
  170. transportTags := make([]string, len(dnsOptions.Servers))
  171. transportTagMap := make(map[string]bool)
  172. transportDomainStrategy := make(map[dns.Transport]dns.DomainStrategy)
  173. for i, server := range dnsOptions.Servers {
  174. var tag string
  175. if server.Tag != "" {
  176. tag = server.Tag
  177. } else {
  178. tag = F.ToString(i)
  179. }
  180. if transportTagMap[tag] {
  181. return nil, E.New("duplicate dns server tag: ", tag)
  182. }
  183. transportTags[i] = tag
  184. transportTagMap[tag] = true
  185. }
  186. ctx = adapter.ContextWithRouter(ctx, router)
  187. for {
  188. lastLen := len(dummyTransportMap)
  189. for i, server := range dnsOptions.Servers {
  190. tag := transportTags[i]
  191. if _, exists := dummyTransportMap[tag]; exists {
  192. continue
  193. }
  194. var detour N.Dialer
  195. if server.Detour == "" {
  196. detour = dialer.NewRouter(router)
  197. } else {
  198. detour = dialer.NewDetour(router, server.Detour)
  199. }
  200. var serverProtocol string
  201. switch server.Address {
  202. case "local":
  203. serverProtocol = "local"
  204. default:
  205. serverURL, _ := url.Parse(server.Address)
  206. var serverAddress string
  207. if serverURL != nil {
  208. if serverURL.Scheme == "" {
  209. serverProtocol = "udp"
  210. } else {
  211. serverProtocol = serverURL.Scheme
  212. }
  213. serverAddress = serverURL.Hostname()
  214. }
  215. if serverAddress == "" {
  216. serverAddress = server.Address
  217. }
  218. notIpAddress := !M.ParseSocksaddr(serverAddress).Addr.IsValid()
  219. if server.AddressResolver != "" {
  220. if !transportTagMap[server.AddressResolver] {
  221. return nil, E.New("parse dns server[", tag, "]: address resolver not found: ", server.AddressResolver)
  222. }
  223. if upstream, exists := dummyTransportMap[server.AddressResolver]; exists {
  224. detour = dns.NewDialerWrapper(detour, router.dnsClient, upstream, dns.DomainStrategy(server.AddressStrategy), time.Duration(server.AddressFallbackDelay))
  225. } else {
  226. continue
  227. }
  228. } else if notIpAddress && strings.Contains(server.Address, ".") {
  229. return nil, E.New("parse dns server[", tag, "]: missing address_resolver")
  230. }
  231. }
  232. var clientSubnet netip.Prefix
  233. if server.ClientSubnet != nil {
  234. clientSubnet = server.ClientSubnet.Build()
  235. } else if dnsOptions.ClientSubnet != nil {
  236. clientSubnet = dnsOptions.ClientSubnet.Build()
  237. }
  238. if serverProtocol == "" {
  239. serverProtocol = "transport"
  240. }
  241. transport, err := dns.CreateTransport(dns.TransportOptions{
  242. Context: ctx,
  243. Logger: logFactory.NewLogger(F.ToString("dns/", serverProtocol, "[", tag, "]")),
  244. Name: tag,
  245. Dialer: detour,
  246. Address: server.Address,
  247. ClientSubnet: clientSubnet,
  248. })
  249. if err != nil {
  250. return nil, E.Cause(err, "parse dns server[", tag, "]")
  251. }
  252. transports[i] = transport
  253. dummyTransportMap[tag] = transport
  254. if server.Tag != "" {
  255. transportMap[server.Tag] = transport
  256. }
  257. strategy := dns.DomainStrategy(server.Strategy)
  258. if strategy != dns.DomainStrategyAsIS {
  259. transportDomainStrategy[transport] = strategy
  260. }
  261. }
  262. if len(transports) == len(dummyTransportMap) {
  263. break
  264. }
  265. if lastLen != len(dummyTransportMap) {
  266. continue
  267. }
  268. unresolvedTags := common.MapIndexed(common.FilterIndexed(dnsOptions.Servers, func(index int, server option.DNSServerOptions) bool {
  269. _, exists := dummyTransportMap[transportTags[index]]
  270. return !exists
  271. }), func(index int, server option.DNSServerOptions) string {
  272. return transportTags[index]
  273. })
  274. if len(unresolvedTags) == 0 {
  275. panic(F.ToString("unexpected unresolved dns servers: ", len(transports), " ", len(dummyTransportMap), " ", len(transportMap)))
  276. }
  277. return nil, E.New("found circular reference in dns servers: ", strings.Join(unresolvedTags, " "))
  278. }
  279. var defaultTransport dns.Transport
  280. if dnsOptions.Final != "" {
  281. defaultTransport = dummyTransportMap[dnsOptions.Final]
  282. if defaultTransport == nil {
  283. return nil, E.New("default dns server not found: ", dnsOptions.Final)
  284. }
  285. }
  286. if defaultTransport == nil {
  287. if len(transports) == 0 {
  288. transports = append(transports, common.Must1(dns.CreateTransport(dns.TransportOptions{
  289. Context: ctx,
  290. Name: "local",
  291. Address: "local",
  292. Dialer: common.Must1(dialer.NewDefault(router, option.DialerOptions{})),
  293. })))
  294. }
  295. defaultTransport = transports[0]
  296. }
  297. if _, isFakeIP := defaultTransport.(adapter.FakeIPTransport); isFakeIP {
  298. return nil, E.New("default DNS server cannot be fakeip")
  299. }
  300. router.defaultTransport = defaultTransport
  301. router.transports = transports
  302. router.transportMap = transportMap
  303. router.transportDomainStrategy = transportDomainStrategy
  304. if dnsOptions.ReverseMapping {
  305. router.dnsReverseMapping = NewDNSReverseMapping()
  306. }
  307. if fakeIPOptions := dnsOptions.FakeIP; fakeIPOptions != nil && dnsOptions.FakeIP.Enabled {
  308. var inet4Range netip.Prefix
  309. var inet6Range netip.Prefix
  310. if fakeIPOptions.Inet4Range != nil {
  311. inet4Range = *fakeIPOptions.Inet4Range
  312. }
  313. if fakeIPOptions.Inet6Range != nil {
  314. inet6Range = *fakeIPOptions.Inet6Range
  315. }
  316. router.fakeIPStore = fakeip.NewStore(ctx, router.logger, inet4Range, inet6Range)
  317. }
  318. usePlatformDefaultInterfaceMonitor := platformInterface != nil && platformInterface.UsePlatformDefaultInterfaceMonitor()
  319. needInterfaceMonitor := options.AutoDetectInterface || common.Any(inbounds, func(inbound option.Inbound) bool {
  320. return inbound.HTTPOptions.SetSystemProxy || inbound.MixedOptions.SetSystemProxy || inbound.TunOptions.AutoRoute
  321. })
  322. if !usePlatformDefaultInterfaceMonitor {
  323. networkMonitor, err := tun.NewNetworkUpdateMonitor(router.logger)
  324. if !((err != nil && !needInterfaceMonitor) || errors.Is(err, os.ErrInvalid)) {
  325. if err != nil {
  326. return nil, err
  327. }
  328. router.networkMonitor = networkMonitor
  329. interfaceMonitor, err := tun.NewDefaultInterfaceMonitor(router.networkMonitor, router.logger, tun.DefaultInterfaceMonitorOptions{
  330. InterfaceFinder: router.interfaceFinder,
  331. OverrideAndroidVPN: options.OverrideAndroidVPN,
  332. UnderNetworkExtension: platformInterface != nil && 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 := 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 func(network, address string, conn syscall.RawConn) error {
  794. return control.Raw(conn, func(fd uintptr) error {
  795. return r.platformInterface.AutoDetectInterfaceControl(int(fd))
  796. })
  797. }
  798. } else {
  799. if r.interfaceMonitor == nil {
  800. return nil
  801. }
  802. return control.BindToInterfaceFunc(r.InterfaceFinder(), func(network string, address string) (interfaceName string, interfaceIndex int, err error) {
  803. remoteAddr := M.ParseSocksaddr(address).Addr
  804. if C.IsLinux {
  805. interfaceName, interfaceIndex = r.InterfaceMonitor().DefaultInterface(remoteAddr)
  806. if interfaceIndex == -1 {
  807. err = tun.ErrNoRoute
  808. }
  809. } else {
  810. interfaceIndex = r.InterfaceMonitor().DefaultInterfaceIndex(remoteAddr)
  811. if interfaceIndex == -1 {
  812. err = tun.ErrNoRoute
  813. }
  814. }
  815. return
  816. })
  817. }
  818. }
  819. func (r *Router) RegisterAutoRedirectOutputMark(mark uint32) error {
  820. if r.autoRedirectOutputMark > 0 {
  821. return E.New("only one auto-redirect can be configured")
  822. }
  823. r.autoRedirectOutputMark = mark
  824. return nil
  825. }
  826. func (r *Router) AutoRedirectOutputMark() uint32 {
  827. return r.autoRedirectOutputMark
  828. }
  829. func (r *Router) DefaultInterface() string {
  830. return r.defaultInterface
  831. }
  832. func (r *Router) DefaultMark() uint32 {
  833. return r.defaultMark
  834. }
  835. func (r *Router) Rules() []adapter.Rule {
  836. return r.rules
  837. }
  838. func (r *Router) WIFIState() adapter.WIFIState {
  839. return r.wifiState
  840. }
  841. func (r *Router) NetworkMonitor() tun.NetworkUpdateMonitor {
  842. return r.networkMonitor
  843. }
  844. func (r *Router) InterfaceMonitor() tun.DefaultInterfaceMonitor {
  845. return r.interfaceMonitor
  846. }
  847. func (r *Router) PackageManager() tun.PackageManager {
  848. return r.packageManager
  849. }
  850. func (r *Router) ClashServer() adapter.ClashServer {
  851. return r.clashServer
  852. }
  853. func (r *Router) SetClashServer(server adapter.ClashServer) {
  854. r.clashServer = server
  855. }
  856. func (r *Router) V2RayServer() adapter.V2RayServer {
  857. return r.v2rayServer
  858. }
  859. func (r *Router) SetV2RayServer(server adapter.V2RayServer) {
  860. r.v2rayServer = server
  861. }
  862. func (r *Router) OnPackagesUpdated(packages int, sharedUsers int) {
  863. r.logger.Info("updated packages list: ", packages, " packages, ", sharedUsers, " shared users")
  864. }
  865. func (r *Router) NewError(ctx context.Context, err error) {
  866. common.Close(err)
  867. if E.IsClosedOrCanceled(err) {
  868. r.logger.DebugContext(ctx, "connection closed: ", err)
  869. return
  870. }
  871. r.logger.ErrorContext(ctx, err)
  872. }
  873. func (r *Router) notifyNetworkUpdate(event int) {
  874. if event == tun.EventNoRoute {
  875. r.pauseManager.NetworkPause()
  876. r.logger.Error("missing default interface")
  877. } else {
  878. r.pauseManager.NetworkWake()
  879. if C.IsAndroid && r.platformInterface == nil {
  880. var vpnStatus string
  881. if r.interfaceMonitor.AndroidVPNEnabled() {
  882. vpnStatus = "enabled"
  883. } else {
  884. vpnStatus = "disabled"
  885. }
  886. r.logger.Info("updated default interface ", r.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", r.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()), ", vpn ", vpnStatus)
  887. } else {
  888. r.logger.Info("updated default interface ", r.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", r.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()))
  889. }
  890. }
  891. if !r.started {
  892. return
  893. }
  894. _ = r.ResetNetwork()
  895. }
  896. func (r *Router) ResetNetwork() error {
  897. conntrack.Close()
  898. for _, outbound := range r.outbounds {
  899. listener, isListener := outbound.(adapter.InterfaceUpdateListener)
  900. if isListener {
  901. listener.InterfaceUpdated()
  902. }
  903. }
  904. for _, transport := range r.transports {
  905. transport.Reset()
  906. }
  907. return nil
  908. }
  909. func (r *Router) updateWIFIState() {
  910. if r.platformInterface == nil {
  911. return
  912. }
  913. state := r.platformInterface.ReadWIFIState()
  914. if state != r.wifiState {
  915. r.wifiState = state
  916. if state.SSID == "" && state.BSSID == "" {
  917. r.logger.Info("updated WIFI state: disconnected")
  918. } else {
  919. r.logger.Info("updated WIFI state: SSID=", state.SSID, ", BSSID=", state.BSSID)
  920. }
  921. }
  922. }
  923. func (r *Router) notifyWindowsPowerEvent(event int) {
  924. switch event {
  925. case winpowrprof.EVENT_SUSPEND:
  926. r.pauseManager.DevicePause()
  927. _ = r.ResetNetwork()
  928. case winpowrprof.EVENT_RESUME:
  929. if !r.pauseManager.IsDevicePaused() {
  930. return
  931. }
  932. fallthrough
  933. case winpowrprof.EVENT_RESUME_AUTOMATIC:
  934. r.pauseManager.DeviceWake()
  935. _ = r.ResetNetwork()
  936. }
  937. }