router.go 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298
  1. package route
  2. import (
  3. "context"
  4. "errors"
  5. "net"
  6. "net/netip"
  7. "net/url"
  8. "os"
  9. "os/user"
  10. "runtime"
  11. "strings"
  12. "time"
  13. "github.com/sagernet/sing-box/adapter"
  14. "github.com/sagernet/sing-box/common/conntrack"
  15. "github.com/sagernet/sing-box/common/dialer"
  16. "github.com/sagernet/sing-box/common/geoip"
  17. "github.com/sagernet/sing-box/common/geosite"
  18. "github.com/sagernet/sing-box/common/process"
  19. "github.com/sagernet/sing-box/common/sniff"
  20. "github.com/sagernet/sing-box/common/taskmonitor"
  21. C "github.com/sagernet/sing-box/constant"
  22. "github.com/sagernet/sing-box/experimental/libbox/platform"
  23. "github.com/sagernet/sing-box/log"
  24. "github.com/sagernet/sing-box/option"
  25. "github.com/sagernet/sing-box/outbound"
  26. "github.com/sagernet/sing-box/transport/fakeip"
  27. "github.com/sagernet/sing-dns"
  28. "github.com/sagernet/sing-mux"
  29. "github.com/sagernet/sing-tun"
  30. "github.com/sagernet/sing-vmess"
  31. "github.com/sagernet/sing/common"
  32. "github.com/sagernet/sing/common/buf"
  33. "github.com/sagernet/sing/common/bufio"
  34. "github.com/sagernet/sing/common/bufio/deadline"
  35. "github.com/sagernet/sing/common/control"
  36. E "github.com/sagernet/sing/common/exceptions"
  37. F "github.com/sagernet/sing/common/format"
  38. M "github.com/sagernet/sing/common/metadata"
  39. N "github.com/sagernet/sing/common/network"
  40. "github.com/sagernet/sing/common/ntp"
  41. "github.com/sagernet/sing/common/task"
  42. "github.com/sagernet/sing/common/uot"
  43. "github.com/sagernet/sing/common/winpowrprof"
  44. "github.com/sagernet/sing/service"
  45. "github.com/sagernet/sing/service/pause"
  46. )
  47. var _ adapter.Router = (*Router)(nil)
  48. type Router struct {
  49. ctx context.Context
  50. logger log.ContextLogger
  51. dnsLogger log.ContextLogger
  52. inboundByTag map[string]adapter.Inbound
  53. outbounds []adapter.Outbound
  54. outboundByTag map[string]adapter.Outbound
  55. rules []adapter.Rule
  56. defaultDetour string
  57. defaultOutboundForConnection adapter.Outbound
  58. defaultOutboundForPacketConnection adapter.Outbound
  59. needGeoIPDatabase bool
  60. needGeositeDatabase bool
  61. geoIPOptions option.GeoIPOptions
  62. geositeOptions option.GeositeOptions
  63. geoIPReader *geoip.Reader
  64. geositeReader *geosite.Reader
  65. geositeCache map[string]adapter.Rule
  66. needFindProcess bool
  67. dnsClient *dns.Client
  68. defaultDomainStrategy dns.DomainStrategy
  69. dnsRules []adapter.DNSRule
  70. ruleSets []adapter.RuleSet
  71. ruleSetMap map[string]adapter.RuleSet
  72. defaultTransport dns.Transport
  73. transports []dns.Transport
  74. transportMap map[string]dns.Transport
  75. transportDomainStrategy map[dns.Transport]dns.DomainStrategy
  76. dnsReverseMapping *DNSReverseMapping
  77. fakeIPStore adapter.FakeIPStore
  78. interfaceFinder *control.DefaultInterfaceFinder
  79. autoDetectInterface bool
  80. defaultInterface string
  81. defaultMark int
  82. networkMonitor tun.NetworkUpdateMonitor
  83. interfaceMonitor tun.DefaultInterfaceMonitor
  84. packageManager tun.PackageManager
  85. powerListener winpowrprof.EventListener
  86. processSearcher process.Searcher
  87. timeService *ntp.Service
  88. pauseManager pause.Manager
  89. clashServer adapter.ClashServer
  90. v2rayServer adapter.V2RayServer
  91. platformInterface platform.Interface
  92. needWIFIState bool
  93. needPackageManager bool
  94. wifiState adapter.WIFIState
  95. started bool
  96. }
  97. func NewRouter(
  98. ctx context.Context,
  99. logFactory log.Factory,
  100. options option.RouteOptions,
  101. dnsOptions option.DNSOptions,
  102. ntpOptions option.NTPOptions,
  103. inbounds []option.Inbound,
  104. platformInterface platform.Interface,
  105. ) (*Router, error) {
  106. router := &Router{
  107. ctx: ctx,
  108. logger: logFactory.NewLogger("router"),
  109. dnsLogger: logFactory.NewLogger("dns"),
  110. outboundByTag: make(map[string]adapter.Outbound),
  111. rules: make([]adapter.Rule, 0, len(options.Rules)),
  112. dnsRules: make([]adapter.DNSRule, 0, len(dnsOptions.Rules)),
  113. ruleSetMap: make(map[string]adapter.RuleSet),
  114. needGeoIPDatabase: hasRule(options.Rules, isGeoIPRule) || hasDNSRule(dnsOptions.Rules, isGeoIPDNSRule),
  115. needGeositeDatabase: hasRule(options.Rules, isGeositeRule) || hasDNSRule(dnsOptions.Rules, isGeositeDNSRule),
  116. geoIPOptions: common.PtrValueOrDefault(options.GeoIP),
  117. geositeOptions: common.PtrValueOrDefault(options.Geosite),
  118. geositeCache: make(map[string]adapter.Rule),
  119. needFindProcess: hasRule(options.Rules, isProcessRule) || hasDNSRule(dnsOptions.Rules, isProcessDNSRule) || options.FindProcess,
  120. defaultDetour: options.Final,
  121. defaultDomainStrategy: dns.DomainStrategy(dnsOptions.Strategy),
  122. interfaceFinder: control.NewDefaultInterfaceFinder(),
  123. autoDetectInterface: options.AutoDetectInterface,
  124. defaultInterface: options.DefaultInterface,
  125. defaultMark: options.DefaultMark,
  126. pauseManager: service.FromContext[pause.Manager](ctx),
  127. platformInterface: platformInterface,
  128. needWIFIState: hasRule(options.Rules, isWIFIRule) || hasDNSRule(dnsOptions.Rules, isWIFIDNSRule),
  129. needPackageManager: common.Any(inbounds, func(inbound option.Inbound) bool {
  130. return len(inbound.TunOptions.IncludePackage) > 0 || len(inbound.TunOptions.ExcludePackage) > 0
  131. }),
  132. }
  133. router.dnsClient = dns.NewClient(dns.ClientOptions{
  134. DisableCache: dnsOptions.DNSClientOptions.DisableCache,
  135. DisableExpire: dnsOptions.DNSClientOptions.DisableExpire,
  136. IndependentCache: dnsOptions.DNSClientOptions.IndependentCache,
  137. RDRC: func() dns.RDRCStore {
  138. cacheFile := service.FromContext[adapter.CacheFile](ctx)
  139. if cacheFile == nil {
  140. return nil
  141. }
  142. if !cacheFile.StoreRDRC() {
  143. return nil
  144. }
  145. return cacheFile
  146. },
  147. Logger: router.dnsLogger,
  148. })
  149. for i, ruleOptions := range options.Rules {
  150. routeRule, err := NewRule(router, router.logger, ruleOptions, true)
  151. if err != nil {
  152. return nil, E.Cause(err, "parse rule[", i, "]")
  153. }
  154. router.rules = append(router.rules, routeRule)
  155. }
  156. for i, dnsRuleOptions := range dnsOptions.Rules {
  157. dnsRule, err := NewDNSRule(router, router.logger, dnsRuleOptions, true)
  158. if err != nil {
  159. return nil, E.Cause(err, "parse dns rule[", i, "]")
  160. }
  161. router.dnsRules = append(router.dnsRules, dnsRule)
  162. }
  163. for i, ruleSetOptions := range options.RuleSet {
  164. if _, exists := router.ruleSetMap[ruleSetOptions.Tag]; exists {
  165. return nil, E.New("duplicate rule-set tag: ", ruleSetOptions.Tag)
  166. }
  167. ruleSet, err := NewRuleSet(ctx, router, router.logger, ruleSetOptions)
  168. if err != nil {
  169. return nil, E.Cause(err, "parse rule-set[", i, "]")
  170. }
  171. router.ruleSets = append(router.ruleSets, ruleSet)
  172. router.ruleSetMap[ruleSetOptions.Tag] = ruleSet
  173. }
  174. transports := make([]dns.Transport, len(dnsOptions.Servers))
  175. dummyTransportMap := make(map[string]dns.Transport)
  176. transportMap := make(map[string]dns.Transport)
  177. transportTags := make([]string, len(dnsOptions.Servers))
  178. transportTagMap := make(map[string]bool)
  179. transportDomainStrategy := make(map[dns.Transport]dns.DomainStrategy)
  180. for i, server := range dnsOptions.Servers {
  181. var tag string
  182. if server.Tag != "" {
  183. tag = server.Tag
  184. } else {
  185. tag = F.ToString(i)
  186. }
  187. if transportTagMap[tag] {
  188. return nil, E.New("duplicate dns server tag: ", tag)
  189. }
  190. transportTags[i] = tag
  191. transportTagMap[tag] = true
  192. }
  193. ctx = adapter.ContextWithRouter(ctx, router)
  194. for {
  195. lastLen := len(dummyTransportMap)
  196. for i, server := range dnsOptions.Servers {
  197. tag := transportTags[i]
  198. if _, exists := dummyTransportMap[tag]; exists {
  199. continue
  200. }
  201. var detour N.Dialer
  202. if server.Detour == "" {
  203. detour = dialer.NewRouter(router)
  204. } else {
  205. detour = dialer.NewDetour(router, server.Detour)
  206. }
  207. switch server.Address {
  208. case "local":
  209. default:
  210. serverURL, _ := url.Parse(server.Address)
  211. var serverAddress string
  212. if serverURL != nil {
  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. transport, err := dns.CreateTransport(dns.TransportOptions{
  239. Context: ctx,
  240. Logger: logFactory.NewLogger(F.ToString("dns/transport[", tag, "]")),
  241. Name: tag,
  242. Dialer: detour,
  243. Address: server.Address,
  244. ClientSubnet: clientSubnet,
  245. })
  246. if err != nil {
  247. return nil, E.Cause(err, "parse dns server[", tag, "]")
  248. }
  249. transports[i] = transport
  250. dummyTransportMap[tag] = transport
  251. if server.Tag != "" {
  252. transportMap[server.Tag] = transport
  253. }
  254. strategy := dns.DomainStrategy(server.Strategy)
  255. if strategy != dns.DomainStrategyAsIS {
  256. transportDomainStrategy[transport] = strategy
  257. }
  258. }
  259. if len(transports) == len(dummyTransportMap) {
  260. break
  261. }
  262. if lastLen != len(dummyTransportMap) {
  263. continue
  264. }
  265. unresolvedTags := common.MapIndexed(common.FilterIndexed(dnsOptions.Servers, func(index int, server option.DNSServerOptions) bool {
  266. _, exists := dummyTransportMap[transportTags[index]]
  267. return !exists
  268. }), func(index int, server option.DNSServerOptions) string {
  269. return transportTags[index]
  270. })
  271. if len(unresolvedTags) == 0 {
  272. panic(F.ToString("unexpected unresolved dns servers: ", len(transports), " ", len(dummyTransportMap), " ", len(transportMap)))
  273. }
  274. return nil, E.New("found circular reference in dns servers: ", strings.Join(unresolvedTags, " "))
  275. }
  276. var defaultTransport dns.Transport
  277. if dnsOptions.Final != "" {
  278. defaultTransport = dummyTransportMap[dnsOptions.Final]
  279. if defaultTransport == nil {
  280. return nil, E.New("default dns server not found: ", dnsOptions.Final)
  281. }
  282. }
  283. if defaultTransport == nil {
  284. if len(transports) == 0 {
  285. transports = append(transports, common.Must1(dns.CreateTransport(dns.TransportOptions{
  286. Context: ctx,
  287. Name: "local",
  288. Address: "local",
  289. Dialer: common.Must1(dialer.NewDefault(router, option.DialerOptions{})),
  290. })))
  291. }
  292. defaultTransport = transports[0]
  293. }
  294. if _, isFakeIP := defaultTransport.(adapter.FakeIPTransport); isFakeIP {
  295. return nil, E.New("default DNS server cannot be fakeip")
  296. }
  297. router.defaultTransport = defaultTransport
  298. router.transports = transports
  299. router.transportMap = transportMap
  300. router.transportDomainStrategy = transportDomainStrategy
  301. if dnsOptions.ReverseMapping {
  302. router.dnsReverseMapping = NewDNSReverseMapping()
  303. }
  304. if fakeIPOptions := dnsOptions.FakeIP; fakeIPOptions != nil && dnsOptions.FakeIP.Enabled {
  305. var inet4Range netip.Prefix
  306. var inet6Range netip.Prefix
  307. if fakeIPOptions.Inet4Range != nil {
  308. inet4Range = *fakeIPOptions.Inet4Range
  309. }
  310. if fakeIPOptions.Inet6Range != nil {
  311. inet6Range = *fakeIPOptions.Inet6Range
  312. }
  313. router.fakeIPStore = fakeip.NewStore(ctx, router.logger, inet4Range, inet6Range)
  314. }
  315. usePlatformDefaultInterfaceMonitor := platformInterface != nil && platformInterface.UsePlatformDefaultInterfaceMonitor()
  316. needInterfaceMonitor := options.AutoDetectInterface || common.Any(inbounds, func(inbound option.Inbound) bool {
  317. return inbound.HTTPOptions.SetSystemProxy || inbound.MixedOptions.SetSystemProxy || inbound.TunOptions.AutoRoute
  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. OverrideAndroidVPN: options.OverrideAndroidVPN,
  331. UnderNetworkExtension: platformInterface != nil && platformInterface.UnderNetworkExtension(),
  332. })
  333. if err != nil {
  334. return nil, E.New("auto_detect_interface unsupported on current platform")
  335. }
  336. interfaceMonitor.RegisterCallback(router.notifyNetworkUpdate)
  337. router.interfaceMonitor = interfaceMonitor
  338. }
  339. } else {
  340. interfaceMonitor := platformInterface.CreateDefaultInterfaceMonitor(router.logger)
  341. interfaceMonitor.RegisterCallback(router.notifyNetworkUpdate)
  342. router.interfaceMonitor = interfaceMonitor
  343. }
  344. if ntpOptions.Enabled {
  345. ntpDialer, err := dialer.New(router, ntpOptions.DialerOptions)
  346. if err != nil {
  347. return nil, E.Cause(err, "create NTP service")
  348. }
  349. timeService := ntp.NewService(ntp.Options{
  350. Context: ctx,
  351. Dialer: ntpDialer,
  352. Logger: logFactory.NewLogger("ntp"),
  353. Server: ntpOptions.ServerOptions.Build(),
  354. Interval: time.Duration(ntpOptions.Interval),
  355. WriteToSystem: ntpOptions.WriteToSystem,
  356. })
  357. service.MustRegister[ntp.TimeService](ctx, timeService)
  358. router.timeService = timeService
  359. }
  360. return router, nil
  361. }
  362. func (r *Router) Initialize(inbounds []adapter.Inbound, outbounds []adapter.Outbound, defaultOutbound func() adapter.Outbound) error {
  363. inboundByTag := make(map[string]adapter.Inbound)
  364. for _, inbound := range inbounds {
  365. inboundByTag[inbound.Tag()] = inbound
  366. }
  367. outboundByTag := make(map[string]adapter.Outbound)
  368. for _, detour := range outbounds {
  369. outboundByTag[detour.Tag()] = detour
  370. }
  371. var defaultOutboundForConnection adapter.Outbound
  372. var defaultOutboundForPacketConnection adapter.Outbound
  373. if r.defaultDetour != "" {
  374. detour, loaded := outboundByTag[r.defaultDetour]
  375. if !loaded {
  376. return E.New("default detour not found: ", r.defaultDetour)
  377. }
  378. if common.Contains(detour.Network(), N.NetworkTCP) {
  379. defaultOutboundForConnection = detour
  380. }
  381. if common.Contains(detour.Network(), N.NetworkUDP) {
  382. defaultOutboundForPacketConnection = detour
  383. }
  384. }
  385. if defaultOutboundForConnection == nil {
  386. for _, detour := range outbounds {
  387. if common.Contains(detour.Network(), N.NetworkTCP) {
  388. defaultOutboundForConnection = detour
  389. break
  390. }
  391. }
  392. }
  393. if defaultOutboundForPacketConnection == nil {
  394. for _, detour := range outbounds {
  395. if common.Contains(detour.Network(), N.NetworkUDP) {
  396. defaultOutboundForPacketConnection = detour
  397. break
  398. }
  399. }
  400. }
  401. if defaultOutboundForConnection == nil || defaultOutboundForPacketConnection == nil {
  402. detour := defaultOutbound()
  403. if defaultOutboundForConnection == nil {
  404. defaultOutboundForConnection = detour
  405. }
  406. if defaultOutboundForPacketConnection == nil {
  407. defaultOutboundForPacketConnection = detour
  408. }
  409. outbounds = append(outbounds, detour)
  410. outboundByTag[detour.Tag()] = detour
  411. }
  412. r.inboundByTag = inboundByTag
  413. r.outbounds = outbounds
  414. r.defaultOutboundForConnection = defaultOutboundForConnection
  415. r.defaultOutboundForPacketConnection = defaultOutboundForPacketConnection
  416. r.outboundByTag = outboundByTag
  417. for i, rule := range r.rules {
  418. if _, loaded := outboundByTag[rule.Outbound()]; !loaded {
  419. return E.New("outbound not found for rule[", i, "]: ", rule.Outbound())
  420. }
  421. }
  422. return nil
  423. }
  424. func (r *Router) Outbounds() []adapter.Outbound {
  425. if !r.started {
  426. return nil
  427. }
  428. return r.outbounds
  429. }
  430. func (r *Router) PreStart() error {
  431. monitor := taskmonitor.New(r.logger, C.StartTimeout)
  432. if r.interfaceMonitor != nil {
  433. monitor.Start("initialize interface monitor")
  434. err := r.interfaceMonitor.Start()
  435. monitor.Finish()
  436. if err != nil {
  437. return err
  438. }
  439. }
  440. if r.networkMonitor != nil {
  441. monitor.Start("initialize network monitor")
  442. err := r.networkMonitor.Start()
  443. monitor.Finish()
  444. if err != nil {
  445. return err
  446. }
  447. }
  448. if r.fakeIPStore != nil {
  449. monitor.Start("initialize fakeip store")
  450. err := r.fakeIPStore.Start()
  451. monitor.Finish()
  452. if err != nil {
  453. return err
  454. }
  455. }
  456. return nil
  457. }
  458. func (r *Router) Start() error {
  459. monitor := taskmonitor.New(r.logger, C.StartTimeout)
  460. if r.needGeoIPDatabase {
  461. monitor.Start("initialize geoip database")
  462. err := r.prepareGeoIPDatabase()
  463. monitor.Finish()
  464. if err != nil {
  465. return err
  466. }
  467. }
  468. if r.needGeositeDatabase {
  469. monitor.Start("initialize geosite database")
  470. err := r.prepareGeositeDatabase()
  471. monitor.Finish()
  472. if err != nil {
  473. return err
  474. }
  475. }
  476. if r.needGeositeDatabase {
  477. for _, rule := range r.rules {
  478. err := rule.UpdateGeosite()
  479. if err != nil {
  480. r.logger.Error("failed to initialize geosite: ", err)
  481. }
  482. }
  483. for _, rule := range r.dnsRules {
  484. err := rule.UpdateGeosite()
  485. if err != nil {
  486. r.logger.Error("failed to initialize geosite: ", err)
  487. }
  488. }
  489. err := common.Close(r.geositeReader)
  490. if err != nil {
  491. return err
  492. }
  493. r.geositeCache = nil
  494. r.geositeReader = nil
  495. }
  496. if runtime.GOOS == "windows" {
  497. powerListener, err := winpowrprof.NewEventListener(r.notifyWindowsPowerEvent)
  498. if err == nil {
  499. r.powerListener = powerListener
  500. } else {
  501. r.logger.Warn("initialize power listener: ", err)
  502. }
  503. }
  504. if r.powerListener != nil {
  505. monitor.Start("start power listener")
  506. err := r.powerListener.Start()
  507. monitor.Finish()
  508. if err != nil {
  509. return E.Cause(err, "start power listener")
  510. }
  511. }
  512. monitor.Start("initialize DNS client")
  513. r.dnsClient.Start()
  514. monitor.Finish()
  515. if C.IsAndroid && r.platformInterface == nil {
  516. monitor.Start("initialize package manager")
  517. packageManager, err := tun.NewPackageManager(r)
  518. monitor.Finish()
  519. if err != nil {
  520. return E.Cause(err, "create package manager")
  521. }
  522. if r.needPackageManager {
  523. monitor.Start("start package manager")
  524. err = packageManager.Start()
  525. monitor.Finish()
  526. if err != nil {
  527. return E.Cause(err, "start package manager")
  528. }
  529. }
  530. r.packageManager = packageManager
  531. }
  532. for i, rule := range r.dnsRules {
  533. monitor.Start("initialize DNS rule[", i, "]")
  534. err := rule.Start()
  535. monitor.Finish()
  536. if err != nil {
  537. return E.Cause(err, "initialize DNS rule[", i, "]")
  538. }
  539. }
  540. for i, transport := range r.transports {
  541. monitor.Start("initialize DNS transport[", i, "]")
  542. err := transport.Start()
  543. monitor.Finish()
  544. if err != nil {
  545. return E.Cause(err, "initialize DNS server[", i, "]")
  546. }
  547. }
  548. if r.timeService != nil {
  549. monitor.Start("initialize time service")
  550. err := r.timeService.Start()
  551. monitor.Finish()
  552. if err != nil {
  553. return E.Cause(err, "initialize time service")
  554. }
  555. }
  556. return nil
  557. }
  558. func (r *Router) Close() error {
  559. monitor := taskmonitor.New(r.logger, C.StopTimeout)
  560. var err error
  561. for i, rule := range r.rules {
  562. monitor.Start("close rule[", i, "]")
  563. err = E.Append(err, rule.Close(), func(err error) error {
  564. return E.Cause(err, "close rule[", i, "]")
  565. })
  566. monitor.Finish()
  567. }
  568. for i, rule := range r.dnsRules {
  569. monitor.Start("close dns rule[", i, "]")
  570. err = E.Append(err, rule.Close(), func(err error) error {
  571. return E.Cause(err, "close dns rule[", i, "]")
  572. })
  573. monitor.Finish()
  574. }
  575. for i, transport := range r.transports {
  576. monitor.Start("close dns transport[", i, "]")
  577. err = E.Append(err, transport.Close(), func(err error) error {
  578. return E.Cause(err, "close dns transport[", i, "]")
  579. })
  580. monitor.Finish()
  581. }
  582. if r.geoIPReader != nil {
  583. monitor.Start("close geoip reader")
  584. err = E.Append(err, r.geoIPReader.Close(), func(err error) error {
  585. return E.Cause(err, "close geoip reader")
  586. })
  587. monitor.Finish()
  588. }
  589. if r.interfaceMonitor != nil {
  590. monitor.Start("close interface monitor")
  591. err = E.Append(err, r.interfaceMonitor.Close(), func(err error) error {
  592. return E.Cause(err, "close interface monitor")
  593. })
  594. monitor.Finish()
  595. }
  596. if r.networkMonitor != nil {
  597. monitor.Start("close network monitor")
  598. err = E.Append(err, r.networkMonitor.Close(), func(err error) error {
  599. return E.Cause(err, "close network monitor")
  600. })
  601. monitor.Finish()
  602. }
  603. if r.packageManager != nil {
  604. monitor.Start("close package manager")
  605. err = E.Append(err, r.packageManager.Close(), func(err error) error {
  606. return E.Cause(err, "close package manager")
  607. })
  608. monitor.Finish()
  609. }
  610. if r.powerListener != nil {
  611. monitor.Start("close power listener")
  612. err = E.Append(err, r.powerListener.Close(), func(err error) error {
  613. return E.Cause(err, "close power listener")
  614. })
  615. monitor.Finish()
  616. }
  617. if r.timeService != nil {
  618. monitor.Start("close time service")
  619. err = E.Append(err, r.timeService.Close(), func(err error) error {
  620. return E.Cause(err, "close time service")
  621. })
  622. monitor.Finish()
  623. }
  624. if r.fakeIPStore != nil {
  625. monitor.Start("close fakeip store")
  626. err = E.Append(err, r.fakeIPStore.Close(), func(err error) error {
  627. return E.Cause(err, "close fakeip store")
  628. })
  629. monitor.Finish()
  630. }
  631. return err
  632. }
  633. func (r *Router) PostStart() error {
  634. monitor := taskmonitor.New(r.logger, C.StopTimeout)
  635. if len(r.ruleSets) > 0 {
  636. monitor.Start("initialize rule-set")
  637. ruleSetStartContext := NewRuleSetStartContext()
  638. var ruleSetStartGroup task.Group
  639. for i, ruleSet := range r.ruleSets {
  640. ruleSetInPlace := ruleSet
  641. ruleSetStartGroup.Append0(func(ctx context.Context) error {
  642. err := ruleSetInPlace.StartContext(ctx, ruleSetStartContext)
  643. if err != nil {
  644. return E.Cause(err, "initialize rule-set[", i, "]")
  645. }
  646. return nil
  647. })
  648. }
  649. ruleSetStartGroup.Concurrency(5)
  650. ruleSetStartGroup.FastFail()
  651. err := ruleSetStartGroup.Run(r.ctx)
  652. monitor.Finish()
  653. if err != nil {
  654. return err
  655. }
  656. ruleSetStartContext.Close()
  657. }
  658. needFindProcess := r.needFindProcess
  659. needWIFIState := r.needWIFIState
  660. for _, ruleSet := range r.ruleSets {
  661. metadata := ruleSet.Metadata()
  662. if metadata.ContainsProcessRule {
  663. needFindProcess = true
  664. }
  665. if metadata.ContainsWIFIRule {
  666. needWIFIState = true
  667. }
  668. }
  669. if C.IsAndroid && r.platformInterface == nil && !r.needPackageManager {
  670. if needFindProcess {
  671. monitor.Start("start package manager")
  672. err := r.packageManager.Start()
  673. monitor.Finish()
  674. if err != nil {
  675. return E.Cause(err, "start package manager")
  676. }
  677. } else {
  678. r.packageManager = nil
  679. }
  680. }
  681. if needFindProcess {
  682. if r.platformInterface != nil {
  683. r.processSearcher = r.platformInterface
  684. } else {
  685. monitor.Start("initialize process searcher")
  686. searcher, err := process.NewSearcher(process.Config{
  687. Logger: r.logger,
  688. PackageManager: r.packageManager,
  689. })
  690. monitor.Finish()
  691. if err != nil {
  692. if err != os.ErrInvalid {
  693. r.logger.Warn(E.Cause(err, "create process searcher"))
  694. }
  695. } else {
  696. r.processSearcher = searcher
  697. }
  698. }
  699. }
  700. if needWIFIState && r.platformInterface != nil {
  701. monitor.Start("initialize WIFI state")
  702. r.needWIFIState = true
  703. r.interfaceMonitor.RegisterCallback(func(_ int) {
  704. r.updateWIFIState()
  705. })
  706. r.updateWIFIState()
  707. monitor.Finish()
  708. }
  709. for i, rule := range r.rules {
  710. monitor.Start("initialize rule[", i, "]")
  711. err := rule.Start()
  712. monitor.Finish()
  713. if err != nil {
  714. return E.Cause(err, "initialize rule[", i, "]")
  715. }
  716. }
  717. r.started = true
  718. return nil
  719. }
  720. func (r *Router) Outbound(tag string) (adapter.Outbound, bool) {
  721. outbound, loaded := r.outboundByTag[tag]
  722. return outbound, loaded
  723. }
  724. func (r *Router) DefaultOutbound(network string) (adapter.Outbound, error) {
  725. if network == N.NetworkTCP {
  726. if r.defaultOutboundForConnection == nil {
  727. return nil, E.New("missing default outbound for TCP connections")
  728. }
  729. return r.defaultOutboundForConnection, nil
  730. } else {
  731. if r.defaultOutboundForPacketConnection == nil {
  732. return nil, E.New("missing default outbound for UDP connections")
  733. }
  734. return r.defaultOutboundForPacketConnection, nil
  735. }
  736. }
  737. func (r *Router) FakeIPStore() adapter.FakeIPStore {
  738. return r.fakeIPStore
  739. }
  740. func (r *Router) RuleSet(tag string) (adapter.RuleSet, bool) {
  741. ruleSet, loaded := r.ruleSetMap[tag]
  742. return ruleSet, loaded
  743. }
  744. func (r *Router) NeedWIFIState() bool {
  745. return r.needWIFIState
  746. }
  747. func (r *Router) RouteConnection(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) error {
  748. if r.pauseManager.IsDevicePaused() {
  749. return E.New("reject connection to ", metadata.Destination, " while device paused")
  750. }
  751. if metadata.InboundDetour != "" {
  752. if metadata.LastInbound == metadata.InboundDetour {
  753. return E.New("routing loop on detour: ", metadata.InboundDetour)
  754. }
  755. detour := r.inboundByTag[metadata.InboundDetour]
  756. if detour == nil {
  757. return E.New("inbound detour not found: ", metadata.InboundDetour)
  758. }
  759. injectable, isInjectable := detour.(adapter.InjectableInbound)
  760. if !isInjectable {
  761. return E.New("inbound detour is not injectable: ", metadata.InboundDetour)
  762. }
  763. if !common.Contains(injectable.Network(), N.NetworkTCP) {
  764. return E.New("inject: TCP unsupported")
  765. }
  766. metadata.LastInbound = metadata.Inbound
  767. metadata.Inbound = metadata.InboundDetour
  768. metadata.InboundDetour = ""
  769. err := injectable.NewConnection(ctx, conn, metadata)
  770. if err != nil {
  771. return E.Cause(err, "inject ", detour.Tag())
  772. }
  773. return nil
  774. }
  775. conntrack.KillerCheck()
  776. metadata.Network = N.NetworkTCP
  777. switch metadata.Destination.Fqdn {
  778. case mux.Destination.Fqdn:
  779. return E.New("global multiplex is deprecated since sing-box v1.7.0, enable multiplex in inbound options instead.")
  780. case vmess.MuxDestination.Fqdn:
  781. return E.New("global multiplex (v2ray legacy) not supported since sing-box v1.7.0.")
  782. case uot.MagicAddress:
  783. return E.New("global UoT not supported since sing-box v1.7.0.")
  784. case uot.LegacyMagicAddress:
  785. return E.New("global UoT (legacy) not supported since sing-box v1.7.0.")
  786. }
  787. if r.fakeIPStore != nil && r.fakeIPStore.Contains(metadata.Destination.Addr) {
  788. domain, loaded := r.fakeIPStore.Lookup(metadata.Destination.Addr)
  789. if !loaded {
  790. return E.New("missing fakeip context")
  791. }
  792. metadata.OriginDestination = metadata.Destination
  793. metadata.Destination = M.Socksaddr{
  794. Fqdn: domain,
  795. Port: metadata.Destination.Port,
  796. }
  797. metadata.FakeIP = true
  798. r.logger.DebugContext(ctx, "found fakeip domain: ", domain)
  799. }
  800. if deadline.NeedAdditionalReadDeadline(conn) {
  801. conn = deadline.NewConn(conn)
  802. }
  803. if metadata.InboundOptions.SniffEnabled && !sniff.Skip(metadata) {
  804. buffer := buf.NewPacket()
  805. sniffMetadata, err := sniff.PeekStream(
  806. ctx,
  807. conn,
  808. buffer,
  809. time.Duration(metadata.InboundOptions.SniffTimeout),
  810. sniff.StreamDomainNameQuery,
  811. sniff.TLSClientHello,
  812. sniff.HTTPHost,
  813. sniff.BitTorrent,
  814. )
  815. if sniffMetadata != nil {
  816. metadata.Protocol = sniffMetadata.Protocol
  817. metadata.Domain = sniffMetadata.Domain
  818. if metadata.InboundOptions.SniffOverrideDestination && M.IsDomainName(metadata.Domain) {
  819. metadata.Destination = M.Socksaddr{
  820. Fqdn: metadata.Domain,
  821. Port: metadata.Destination.Port,
  822. }
  823. }
  824. if metadata.Domain != "" {
  825. r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol, ", domain: ", metadata.Domain)
  826. } else {
  827. r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol)
  828. }
  829. } else if err != nil {
  830. r.logger.TraceContext(ctx, "sniffed no protocol: ", err)
  831. }
  832. if !buffer.IsEmpty() {
  833. conn = bufio.NewCachedConn(conn, buffer)
  834. } else {
  835. buffer.Release()
  836. }
  837. }
  838. if r.dnsReverseMapping != nil && metadata.Domain == "" {
  839. domain, loaded := r.dnsReverseMapping.Query(metadata.Destination.Addr)
  840. if loaded {
  841. metadata.Domain = domain
  842. r.logger.DebugContext(ctx, "found reserve mapped domain: ", metadata.Domain)
  843. }
  844. }
  845. if metadata.Destination.IsFqdn() && dns.DomainStrategy(metadata.InboundOptions.DomainStrategy) != dns.DomainStrategyAsIS {
  846. addresses, err := r.Lookup(adapter.WithContext(ctx, &metadata), metadata.Destination.Fqdn, dns.DomainStrategy(metadata.InboundOptions.DomainStrategy))
  847. if err != nil {
  848. return err
  849. }
  850. metadata.DestinationAddresses = addresses
  851. r.dnsLogger.DebugContext(ctx, "resolved [", strings.Join(F.MapToString(metadata.DestinationAddresses), " "), "]")
  852. }
  853. if metadata.Destination.IsIPv4() {
  854. metadata.IPVersion = 4
  855. } else if metadata.Destination.IsIPv6() {
  856. metadata.IPVersion = 6
  857. }
  858. ctx, matchedRule, detour, err := r.match(ctx, &metadata, r.defaultOutboundForConnection)
  859. if err != nil {
  860. return err
  861. }
  862. if !common.Contains(detour.Network(), N.NetworkTCP) {
  863. return E.New("missing supported outbound, closing connection")
  864. }
  865. if r.clashServer != nil {
  866. trackerConn, tracker := r.clashServer.RoutedConnection(ctx, conn, metadata, matchedRule)
  867. defer tracker.Leave()
  868. conn = trackerConn
  869. }
  870. if r.v2rayServer != nil {
  871. if statsService := r.v2rayServer.StatsService(); statsService != nil {
  872. conn = statsService.RoutedConnection(metadata.Inbound, detour.Tag(), metadata.User, conn)
  873. }
  874. }
  875. return detour.NewConnection(ctx, conn, metadata)
  876. }
  877. func (r *Router) RoutePacketConnection(ctx context.Context, conn N.PacketConn, metadata adapter.InboundContext) error {
  878. if r.pauseManager.IsDevicePaused() {
  879. return E.New("reject packet connection to ", metadata.Destination, " while device paused")
  880. }
  881. if metadata.InboundDetour != "" {
  882. if metadata.LastInbound == metadata.InboundDetour {
  883. return E.New("routing loop on detour: ", metadata.InboundDetour)
  884. }
  885. detour := r.inboundByTag[metadata.InboundDetour]
  886. if detour == nil {
  887. return E.New("inbound detour not found: ", metadata.InboundDetour)
  888. }
  889. injectable, isInjectable := detour.(adapter.InjectableInbound)
  890. if !isInjectable {
  891. return E.New("inbound detour is not injectable: ", metadata.InboundDetour)
  892. }
  893. if !common.Contains(injectable.Network(), N.NetworkUDP) {
  894. return E.New("inject: UDP unsupported")
  895. }
  896. metadata.LastInbound = metadata.Inbound
  897. metadata.Inbound = metadata.InboundDetour
  898. metadata.InboundDetour = ""
  899. err := injectable.NewPacketConnection(ctx, conn, metadata)
  900. if err != nil {
  901. return E.Cause(err, "inject ", detour.Tag())
  902. }
  903. return nil
  904. }
  905. conntrack.KillerCheck()
  906. metadata.Network = N.NetworkUDP
  907. if r.fakeIPStore != nil && r.fakeIPStore.Contains(metadata.Destination.Addr) {
  908. domain, loaded := r.fakeIPStore.Lookup(metadata.Destination.Addr)
  909. if !loaded {
  910. return E.New("missing fakeip context")
  911. }
  912. metadata.OriginDestination = metadata.Destination
  913. metadata.Destination = M.Socksaddr{
  914. Fqdn: domain,
  915. Port: metadata.Destination.Port,
  916. }
  917. metadata.FakeIP = true
  918. r.logger.DebugContext(ctx, "found fakeip domain: ", domain)
  919. }
  920. // Currently we don't have deadline usages for UDP connections
  921. /*if deadline.NeedAdditionalReadDeadline(conn) {
  922. conn = deadline.NewPacketConn(bufio.NewNetPacketConn(conn))
  923. }*/
  924. if metadata.InboundOptions.SniffEnabled || metadata.Destination.Addr.IsUnspecified() {
  925. var (
  926. buffer = buf.NewPacket()
  927. destination M.Socksaddr
  928. done = make(chan struct{})
  929. err error
  930. )
  931. go func() {
  932. sniffTimeout := C.ReadPayloadTimeout
  933. if metadata.InboundOptions.SniffTimeout > 0 {
  934. sniffTimeout = time.Duration(metadata.InboundOptions.SniffTimeout)
  935. }
  936. conn.SetReadDeadline(time.Now().Add(sniffTimeout))
  937. destination, err = conn.ReadPacket(buffer)
  938. conn.SetReadDeadline(time.Time{})
  939. close(done)
  940. }()
  941. select {
  942. case <-done:
  943. case <-ctx.Done():
  944. conn.Close()
  945. return ctx.Err()
  946. }
  947. if err != nil {
  948. buffer.Release()
  949. if !errors.Is(err, os.ErrDeadlineExceeded) {
  950. return err
  951. }
  952. } else {
  953. if metadata.Destination.Addr.IsUnspecified() {
  954. metadata.Destination = destination
  955. }
  956. if metadata.InboundOptions.SniffEnabled {
  957. sniffMetadata, _ := sniff.PeekPacket(
  958. ctx,
  959. buffer.Bytes(),
  960. sniff.DomainNameQuery,
  961. sniff.QUICClientHello,
  962. sniff.STUNMessage,
  963. sniff.UTP,
  964. sniff.UDPTracker,
  965. sniff.DTLSRecord,
  966. )
  967. if sniffMetadata != nil {
  968. metadata.Protocol = sniffMetadata.Protocol
  969. metadata.Domain = sniffMetadata.Domain
  970. if metadata.InboundOptions.SniffOverrideDestination && M.IsDomainName(metadata.Domain) {
  971. metadata.Destination = M.Socksaddr{
  972. Fqdn: metadata.Domain,
  973. Port: metadata.Destination.Port,
  974. }
  975. }
  976. if metadata.Domain != "" {
  977. r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol, ", domain: ", metadata.Domain)
  978. } else {
  979. r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol)
  980. }
  981. }
  982. }
  983. conn = bufio.NewCachedPacketConn(conn, buffer, destination)
  984. }
  985. }
  986. if r.dnsReverseMapping != nil && metadata.Domain == "" {
  987. domain, loaded := r.dnsReverseMapping.Query(metadata.Destination.Addr)
  988. if loaded {
  989. metadata.Domain = domain
  990. r.logger.DebugContext(ctx, "found reserve mapped domain: ", metadata.Domain)
  991. }
  992. }
  993. if metadata.Destination.IsFqdn() && dns.DomainStrategy(metadata.InboundOptions.DomainStrategy) != dns.DomainStrategyAsIS {
  994. addresses, err := r.Lookup(adapter.WithContext(ctx, &metadata), metadata.Destination.Fqdn, dns.DomainStrategy(metadata.InboundOptions.DomainStrategy))
  995. if err != nil {
  996. return err
  997. }
  998. metadata.DestinationAddresses = addresses
  999. r.dnsLogger.DebugContext(ctx, "resolved [", strings.Join(F.MapToString(metadata.DestinationAddresses), " "), "]")
  1000. }
  1001. if metadata.Destination.IsIPv4() {
  1002. metadata.IPVersion = 4
  1003. } else if metadata.Destination.IsIPv6() {
  1004. metadata.IPVersion = 6
  1005. }
  1006. ctx, matchedRule, detour, err := r.match(ctx, &metadata, r.defaultOutboundForPacketConnection)
  1007. if err != nil {
  1008. return err
  1009. }
  1010. if !common.Contains(detour.Network(), N.NetworkUDP) {
  1011. return E.New("missing supported outbound, closing packet connection")
  1012. }
  1013. if r.clashServer != nil {
  1014. trackerConn, tracker := r.clashServer.RoutedPacketConnection(ctx, conn, metadata, matchedRule)
  1015. defer tracker.Leave()
  1016. conn = trackerConn
  1017. }
  1018. if r.v2rayServer != nil {
  1019. if statsService := r.v2rayServer.StatsService(); statsService != nil {
  1020. conn = statsService.RoutedPacketConnection(metadata.Inbound, detour.Tag(), metadata.User, conn)
  1021. }
  1022. }
  1023. if metadata.FakeIP {
  1024. conn = bufio.NewNATPacketConn(bufio.NewNetPacketConn(conn), metadata.OriginDestination, metadata.Destination)
  1025. }
  1026. return detour.NewPacketConnection(ctx, conn, metadata)
  1027. }
  1028. func (r *Router) match(ctx context.Context, metadata *adapter.InboundContext, defaultOutbound adapter.Outbound) (context.Context, adapter.Rule, adapter.Outbound, error) {
  1029. matchRule, matchOutbound := r.match0(ctx, metadata, defaultOutbound)
  1030. if contextOutbound, loaded := outbound.TagFromContext(ctx); loaded {
  1031. if contextOutbound == matchOutbound.Tag() {
  1032. return nil, nil, nil, E.New("connection loopback in outbound/", matchOutbound.Type(), "[", matchOutbound.Tag(), "]")
  1033. }
  1034. }
  1035. ctx = outbound.ContextWithTag(ctx, matchOutbound.Tag())
  1036. return ctx, matchRule, matchOutbound, nil
  1037. }
  1038. func (r *Router) match0(ctx context.Context, metadata *adapter.InboundContext, defaultOutbound adapter.Outbound) (adapter.Rule, adapter.Outbound) {
  1039. if r.processSearcher != nil {
  1040. var originDestination netip.AddrPort
  1041. if metadata.OriginDestination.IsValid() {
  1042. originDestination = metadata.OriginDestination.AddrPort()
  1043. } else if metadata.Destination.IsIP() {
  1044. originDestination = metadata.Destination.AddrPort()
  1045. }
  1046. processInfo, err := process.FindProcessInfo(r.processSearcher, ctx, metadata.Network, metadata.Source.AddrPort(), originDestination)
  1047. if err != nil {
  1048. r.logger.InfoContext(ctx, "failed to search process: ", err)
  1049. } else {
  1050. if processInfo.ProcessPath != "" {
  1051. r.logger.InfoContext(ctx, "found process path: ", processInfo.ProcessPath)
  1052. } else if processInfo.PackageName != "" {
  1053. r.logger.InfoContext(ctx, "found package name: ", processInfo.PackageName)
  1054. } else if processInfo.UserId != -1 {
  1055. if /*needUserName &&*/ true {
  1056. osUser, _ := user.LookupId(F.ToString(processInfo.UserId))
  1057. if osUser != nil {
  1058. processInfo.User = osUser.Username
  1059. }
  1060. }
  1061. if processInfo.User != "" {
  1062. r.logger.InfoContext(ctx, "found user: ", processInfo.User)
  1063. } else {
  1064. r.logger.InfoContext(ctx, "found user id: ", processInfo.UserId)
  1065. }
  1066. }
  1067. metadata.ProcessInfo = processInfo
  1068. }
  1069. }
  1070. for i, rule := range r.rules {
  1071. metadata.ResetRuleCache()
  1072. if rule.Match(metadata) {
  1073. detour := rule.Outbound()
  1074. r.logger.DebugContext(ctx, "match[", i, "] ", rule.String(), " => ", detour)
  1075. if outbound, loaded := r.Outbound(detour); loaded {
  1076. return rule, outbound
  1077. }
  1078. r.logger.ErrorContext(ctx, "outbound not found: ", detour)
  1079. }
  1080. }
  1081. return nil, defaultOutbound
  1082. }
  1083. func (r *Router) InterfaceFinder() control.InterfaceFinder {
  1084. return r.interfaceFinder
  1085. }
  1086. func (r *Router) UpdateInterfaces() error {
  1087. if r.platformInterface == nil || !r.platformInterface.UsePlatformInterfaceGetter() {
  1088. return r.interfaceFinder.Update()
  1089. } else {
  1090. interfaces, err := r.platformInterface.Interfaces()
  1091. if err != nil {
  1092. return err
  1093. }
  1094. r.interfaceFinder.UpdateInterfaces(interfaces)
  1095. return nil
  1096. }
  1097. }
  1098. func (r *Router) AutoDetectInterface() bool {
  1099. return r.autoDetectInterface
  1100. }
  1101. func (r *Router) AutoDetectInterfaceFunc() control.Func {
  1102. if r.platformInterface != nil && r.platformInterface.UsePlatformAutoDetectInterfaceControl() {
  1103. return r.platformInterface.AutoDetectInterfaceControl()
  1104. } else {
  1105. if r.interfaceMonitor == nil {
  1106. return nil
  1107. }
  1108. return control.BindToInterfaceFunc(r.InterfaceFinder(), func(network string, address string) (interfaceName string, interfaceIndex int, err error) {
  1109. remoteAddr := M.ParseSocksaddr(address).Addr
  1110. if C.IsLinux {
  1111. interfaceName, interfaceIndex = r.InterfaceMonitor().DefaultInterface(remoteAddr)
  1112. if interfaceIndex == -1 {
  1113. err = tun.ErrNoRoute
  1114. }
  1115. } else {
  1116. interfaceIndex = r.InterfaceMonitor().DefaultInterfaceIndex(remoteAddr)
  1117. if interfaceIndex == -1 {
  1118. err = tun.ErrNoRoute
  1119. }
  1120. }
  1121. return
  1122. })
  1123. }
  1124. }
  1125. func (r *Router) DefaultInterface() string {
  1126. return r.defaultInterface
  1127. }
  1128. func (r *Router) DefaultMark() int {
  1129. return r.defaultMark
  1130. }
  1131. func (r *Router) Rules() []adapter.Rule {
  1132. return r.rules
  1133. }
  1134. func (r *Router) WIFIState() adapter.WIFIState {
  1135. return r.wifiState
  1136. }
  1137. func (r *Router) NetworkMonitor() tun.NetworkUpdateMonitor {
  1138. return r.networkMonitor
  1139. }
  1140. func (r *Router) InterfaceMonitor() tun.DefaultInterfaceMonitor {
  1141. return r.interfaceMonitor
  1142. }
  1143. func (r *Router) PackageManager() tun.PackageManager {
  1144. return r.packageManager
  1145. }
  1146. func (r *Router) ClashServer() adapter.ClashServer {
  1147. return r.clashServer
  1148. }
  1149. func (r *Router) SetClashServer(server adapter.ClashServer) {
  1150. r.clashServer = server
  1151. }
  1152. func (r *Router) V2RayServer() adapter.V2RayServer {
  1153. return r.v2rayServer
  1154. }
  1155. func (r *Router) SetV2RayServer(server adapter.V2RayServer) {
  1156. r.v2rayServer = server
  1157. }
  1158. func (r *Router) OnPackagesUpdated(packages int, sharedUsers int) {
  1159. r.logger.Info("updated packages list: ", packages, " packages, ", sharedUsers, " shared users")
  1160. }
  1161. func (r *Router) NewError(ctx context.Context, err error) {
  1162. common.Close(err)
  1163. if E.IsClosedOrCanceled(err) {
  1164. r.logger.DebugContext(ctx, "connection closed: ", err)
  1165. return
  1166. }
  1167. r.logger.ErrorContext(ctx, err)
  1168. }
  1169. func (r *Router) notifyNetworkUpdate(event int) {
  1170. if event == tun.EventNoRoute {
  1171. r.pauseManager.NetworkPause()
  1172. r.logger.Error("missing default interface")
  1173. } else {
  1174. r.pauseManager.NetworkWake()
  1175. if C.IsAndroid && r.platformInterface == nil {
  1176. var vpnStatus string
  1177. if r.interfaceMonitor.AndroidVPNEnabled() {
  1178. vpnStatus = "enabled"
  1179. } else {
  1180. vpnStatus = "disabled"
  1181. }
  1182. r.logger.Info("updated default interface ", r.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", r.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()), ", vpn ", vpnStatus)
  1183. } else {
  1184. r.logger.Info("updated default interface ", r.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", r.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()))
  1185. }
  1186. }
  1187. if !r.started {
  1188. return
  1189. }
  1190. _ = r.ResetNetwork()
  1191. }
  1192. func (r *Router) ResetNetwork() error {
  1193. conntrack.Close()
  1194. for _, outbound := range r.outbounds {
  1195. listener, isListener := outbound.(adapter.InterfaceUpdateListener)
  1196. if isListener {
  1197. listener.InterfaceUpdated()
  1198. }
  1199. }
  1200. for _, transport := range r.transports {
  1201. transport.Reset()
  1202. }
  1203. return nil
  1204. }
  1205. func (r *Router) updateWIFIState() {
  1206. if r.platformInterface == nil {
  1207. return
  1208. }
  1209. state := r.platformInterface.ReadWIFIState()
  1210. if state != r.wifiState {
  1211. r.wifiState = state
  1212. if state.SSID == "" && state.BSSID == "" {
  1213. r.logger.Info("updated WIFI state: disconnected")
  1214. } else {
  1215. r.logger.Info("updated WIFI state: SSID=", state.SSID, ", BSSID=", state.BSSID)
  1216. }
  1217. }
  1218. }
  1219. func (r *Router) notifyWindowsPowerEvent(event int) {
  1220. switch event {
  1221. case winpowrprof.EVENT_SUSPEND:
  1222. r.pauseManager.DevicePause()
  1223. _ = r.ResetNetwork()
  1224. case winpowrprof.EVENT_RESUME:
  1225. if !r.pauseManager.IsDevicePaused() {
  1226. return
  1227. }
  1228. fallthrough
  1229. case winpowrprof.EVENT_RESUME_AUTOMATIC:
  1230. r.pauseManager.DeviceWake()
  1231. _ = r.ResetNetwork()
  1232. }
  1233. }