router.go 39 KB

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