router.go 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168
  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: pause.ManagerFromContext(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) Start() error {
  408. monitor := taskmonitor.New(r.logger, C.DefaultStartTimeout)
  409. if r.needGeoIPDatabase {
  410. monitor.Start("initialize geoip database")
  411. err := r.prepareGeoIPDatabase()
  412. monitor.Finish()
  413. if err != nil {
  414. return err
  415. }
  416. }
  417. if r.needGeositeDatabase {
  418. monitor.Start("initialize geosite database")
  419. err := r.prepareGeositeDatabase()
  420. monitor.Finish()
  421. if err != nil {
  422. return err
  423. }
  424. }
  425. if r.interfaceMonitor != nil {
  426. monitor.Start("initialize interface monitor")
  427. err := r.interfaceMonitor.Start()
  428. monitor.Finish()
  429. if err != nil {
  430. return err
  431. }
  432. }
  433. if r.networkMonitor != nil {
  434. monitor.Start("initialize network monitor")
  435. err := r.networkMonitor.Start()
  436. monitor.Finish()
  437. if err != nil {
  438. return err
  439. }
  440. }
  441. if r.needGeositeDatabase {
  442. for _, rule := range r.rules {
  443. err := rule.UpdateGeosite()
  444. if err != nil {
  445. r.logger.Error("failed to initialize geosite: ", err)
  446. }
  447. }
  448. for _, rule := range r.dnsRules {
  449. err := rule.UpdateGeosite()
  450. if err != nil {
  451. r.logger.Error("failed to initialize geosite: ", err)
  452. }
  453. }
  454. err := common.Close(r.geositeReader)
  455. if err != nil {
  456. return err
  457. }
  458. r.geositeCache = nil
  459. r.geositeReader = nil
  460. }
  461. if r.fakeIPStore != nil {
  462. monitor.Start("initialize fakeip store")
  463. err := r.fakeIPStore.Start()
  464. monitor.Finish()
  465. if err != nil {
  466. return err
  467. }
  468. }
  469. if len(r.ruleSets) > 0 {
  470. monitor.Start("initialize rule-set")
  471. ruleSetStartContext := NewRuleSetStartContext()
  472. var ruleSetStartGroup task.Group
  473. for i, ruleSet := range r.ruleSets {
  474. ruleSetInPlace := ruleSet
  475. ruleSetStartGroup.Append0(func(ctx context.Context) error {
  476. err := ruleSetInPlace.StartContext(ctx, ruleSetStartContext)
  477. if err != nil {
  478. return E.Cause(err, "initialize rule-set[", i, "]")
  479. }
  480. return nil
  481. })
  482. }
  483. ruleSetStartGroup.Concurrency(5)
  484. ruleSetStartGroup.FastFail()
  485. err := ruleSetStartGroup.Run(r.ctx)
  486. monitor.Finish()
  487. if err != nil {
  488. return err
  489. }
  490. ruleSetStartContext.Close()
  491. }
  492. var (
  493. needProcessFromRuleSet bool
  494. needWIFIStateFromRuleSet bool
  495. )
  496. for _, ruleSet := range r.ruleSets {
  497. metadata := ruleSet.Metadata()
  498. if metadata.ContainsProcessRule {
  499. needProcessFromRuleSet = true
  500. }
  501. if metadata.ContainsWIFIRule {
  502. needWIFIStateFromRuleSet = true
  503. }
  504. }
  505. if needProcessFromRuleSet || r.needFindProcess || r.needPackageManager {
  506. if C.IsAndroid && r.platformInterface == nil {
  507. monitor.Start("initialize package manager")
  508. packageManager, err := tun.NewPackageManager(r)
  509. monitor.Finish()
  510. if err != nil {
  511. return E.Cause(err, "create package manager")
  512. }
  513. monitor.Start("start package manager")
  514. err = packageManager.Start()
  515. monitor.Finish()
  516. if err != nil {
  517. return E.Cause(err, "start package manager")
  518. }
  519. r.packageManager = packageManager
  520. }
  521. if r.platformInterface != nil {
  522. r.processSearcher = r.platformInterface
  523. } else {
  524. monitor.Start("initialize process searcher")
  525. searcher, err := process.NewSearcher(process.Config{
  526. Logger: r.logger,
  527. PackageManager: r.packageManager,
  528. })
  529. monitor.Finish()
  530. if err != nil {
  531. if err != os.ErrInvalid {
  532. r.logger.Warn(E.Cause(err, "create process searcher"))
  533. }
  534. } else {
  535. r.processSearcher = searcher
  536. }
  537. }
  538. }
  539. if needWIFIStateFromRuleSet || r.needWIFIState {
  540. monitor.Start("initialize WIFI state")
  541. if r.platformInterface != nil && r.interfaceMonitor != nil {
  542. r.interfaceMonitor.RegisterCallback(func(_ int) {
  543. r.updateWIFIState()
  544. })
  545. }
  546. r.updateWIFIState()
  547. monitor.Finish()
  548. }
  549. for i, rule := range r.rules {
  550. monitor.Start("initialize rule[", i, "]")
  551. err := rule.Start()
  552. monitor.Finish()
  553. if err != nil {
  554. return E.Cause(err, "initialize rule[", i, "]")
  555. }
  556. }
  557. for i, rule := range r.dnsRules {
  558. monitor.Start("initialize DNS rule[", i, "]")
  559. err := rule.Start()
  560. monitor.Finish()
  561. if err != nil {
  562. return E.Cause(err, "initialize DNS rule[", i, "]")
  563. }
  564. }
  565. for i, transport := range r.transports {
  566. monitor.Start("initialize DNS transport[", i, "]")
  567. err := transport.Start()
  568. monitor.Finish()
  569. if err != nil {
  570. return E.Cause(err, "initialize DNS server[", i, "]")
  571. }
  572. }
  573. if r.timeService != nil {
  574. monitor.Start("initialize time service")
  575. err := r.timeService.Start()
  576. monitor.Finish()
  577. if err != nil {
  578. return E.Cause(err, "initialize time service")
  579. }
  580. }
  581. return nil
  582. }
  583. func (r *Router) Close() error {
  584. monitor := taskmonitor.New(r.logger, C.DefaultStopTimeout)
  585. var err error
  586. for i, rule := range r.rules {
  587. monitor.Start("close rule[", i, "]")
  588. err = E.Append(err, rule.Close(), func(err error) error {
  589. return E.Cause(err, "close rule[", i, "]")
  590. })
  591. monitor.Finish()
  592. }
  593. for i, rule := range r.dnsRules {
  594. monitor.Start("close dns rule[", i, "]")
  595. err = E.Append(err, rule.Close(), func(err error) error {
  596. return E.Cause(err, "close dns rule[", i, "]")
  597. })
  598. monitor.Finish()
  599. }
  600. for i, transport := range r.transports {
  601. monitor.Start("close dns transport[", i, "]")
  602. err = E.Append(err, transport.Close(), func(err error) error {
  603. return E.Cause(err, "close dns transport[", i, "]")
  604. })
  605. monitor.Finish()
  606. }
  607. if r.geoIPReader != nil {
  608. monitor.Start("close geoip reader")
  609. err = E.Append(err, r.geoIPReader.Close(), func(err error) error {
  610. return E.Cause(err, "close geoip reader")
  611. })
  612. monitor.Finish()
  613. }
  614. if r.interfaceMonitor != nil {
  615. monitor.Start("close interface monitor")
  616. err = E.Append(err, r.interfaceMonitor.Close(), func(err error) error {
  617. return E.Cause(err, "close interface monitor")
  618. })
  619. monitor.Finish()
  620. }
  621. if r.networkMonitor != nil {
  622. monitor.Start("close network monitor")
  623. err = E.Append(err, r.networkMonitor.Close(), func(err error) error {
  624. return E.Cause(err, "close network monitor")
  625. })
  626. monitor.Finish()
  627. }
  628. if r.packageManager != nil {
  629. monitor.Start("close package manager")
  630. err = E.Append(err, r.packageManager.Close(), func(err error) error {
  631. return E.Cause(err, "close package manager")
  632. })
  633. monitor.Finish()
  634. }
  635. if r.timeService != nil {
  636. monitor.Start("close time service")
  637. err = E.Append(err, r.timeService.Close(), func(err error) error {
  638. return E.Cause(err, "close time service")
  639. })
  640. monitor.Finish()
  641. }
  642. if r.fakeIPStore != nil {
  643. monitor.Start("close fakeip store")
  644. err = E.Append(err, r.fakeIPStore.Close(), func(err error) error {
  645. return E.Cause(err, "close fakeip store")
  646. })
  647. monitor.Finish()
  648. }
  649. return err
  650. }
  651. func (r *Router) PostStart() error {
  652. if len(r.ruleSets) > 0 {
  653. for i, ruleSet := range r.ruleSets {
  654. err := ruleSet.PostStart()
  655. if err != nil {
  656. return E.Cause(err, "post start rule-set[", i, "]")
  657. }
  658. }
  659. }
  660. r.started = true
  661. return nil
  662. }
  663. func (r *Router) Outbound(tag string) (adapter.Outbound, bool) {
  664. outbound, loaded := r.outboundByTag[tag]
  665. return outbound, loaded
  666. }
  667. func (r *Router) DefaultOutbound(network string) (adapter.Outbound, error) {
  668. if network == N.NetworkTCP {
  669. if r.defaultOutboundForConnection == nil {
  670. return nil, E.New("missing default outbound for TCP connections")
  671. }
  672. return r.defaultOutboundForConnection, nil
  673. } else {
  674. if r.defaultOutboundForPacketConnection == nil {
  675. return nil, E.New("missing default outbound for UDP connections")
  676. }
  677. return r.defaultOutboundForPacketConnection, nil
  678. }
  679. }
  680. func (r *Router) FakeIPStore() adapter.FakeIPStore {
  681. return r.fakeIPStore
  682. }
  683. func (r *Router) RuleSet(tag string) (adapter.RuleSet, bool) {
  684. ruleSet, loaded := r.ruleSetMap[tag]
  685. return ruleSet, loaded
  686. }
  687. func (r *Router) RouteConnection(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) error {
  688. if metadata.InboundDetour != "" {
  689. if metadata.LastInbound == metadata.InboundDetour {
  690. return E.New("routing loop on detour: ", metadata.InboundDetour)
  691. }
  692. detour := r.inboundByTag[metadata.InboundDetour]
  693. if detour == nil {
  694. return E.New("inbound detour not found: ", metadata.InboundDetour)
  695. }
  696. injectable, isInjectable := detour.(adapter.InjectableInbound)
  697. if !isInjectable {
  698. return E.New("inbound detour is not injectable: ", metadata.InboundDetour)
  699. }
  700. if !common.Contains(injectable.Network(), N.NetworkTCP) {
  701. return E.New("inject: TCP unsupported")
  702. }
  703. metadata.LastInbound = metadata.Inbound
  704. metadata.Inbound = metadata.InboundDetour
  705. metadata.InboundDetour = ""
  706. err := injectable.NewConnection(ctx, conn, metadata)
  707. if err != nil {
  708. return E.Cause(err, "inject ", detour.Tag())
  709. }
  710. return nil
  711. }
  712. conntrack.KillerCheck()
  713. metadata.Network = N.NetworkTCP
  714. switch metadata.Destination.Fqdn {
  715. case mux.Destination.Fqdn:
  716. return E.New("global multiplex is deprecated since sing-box v1.7.0, enable multiplex in inbound options instead.")
  717. case vmess.MuxDestination.Fqdn:
  718. return E.New("global multiplex (v2ray legacy) not supported since sing-box v1.7.0.")
  719. case uot.MagicAddress:
  720. return E.New("global UoT not supported since sing-box v1.7.0.")
  721. case uot.LegacyMagicAddress:
  722. return E.New("global UoT (legacy) not supported since sing-box v1.7.0.")
  723. }
  724. if r.fakeIPStore != nil && r.fakeIPStore.Contains(metadata.Destination.Addr) {
  725. domain, loaded := r.fakeIPStore.Lookup(metadata.Destination.Addr)
  726. if !loaded {
  727. return E.New("missing fakeip context")
  728. }
  729. metadata.OriginDestination = metadata.Destination
  730. metadata.Destination = M.Socksaddr{
  731. Fqdn: domain,
  732. Port: metadata.Destination.Port,
  733. }
  734. metadata.FakeIP = true
  735. r.logger.DebugContext(ctx, "found fakeip domain: ", domain)
  736. }
  737. if deadline.NeedAdditionalReadDeadline(conn) {
  738. conn = deadline.NewConn(conn)
  739. }
  740. if metadata.InboundOptions.SniffEnabled {
  741. buffer := buf.NewPacket()
  742. sniffMetadata, err := sniff.PeekStream(ctx, conn, buffer, time.Duration(metadata.InboundOptions.SniffTimeout), sniff.StreamDomainNameQuery, sniff.TLSClientHello, sniff.HTTPHost)
  743. if sniffMetadata != nil {
  744. metadata.Protocol = sniffMetadata.Protocol
  745. metadata.Domain = sniffMetadata.Domain
  746. if metadata.InboundOptions.SniffOverrideDestination && M.IsDomainName(metadata.Domain) {
  747. metadata.Destination = M.Socksaddr{
  748. Fqdn: metadata.Domain,
  749. Port: metadata.Destination.Port,
  750. }
  751. }
  752. if metadata.Domain != "" {
  753. r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol, ", domain: ", metadata.Domain)
  754. } else {
  755. r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol)
  756. }
  757. } else if err != nil {
  758. r.logger.TraceContext(ctx, "sniffed no protocol: ", err)
  759. }
  760. if !buffer.IsEmpty() {
  761. conn = bufio.NewCachedConn(conn, buffer)
  762. } else {
  763. buffer.Release()
  764. }
  765. }
  766. if r.dnsReverseMapping != nil && metadata.Domain == "" {
  767. domain, loaded := r.dnsReverseMapping.Query(metadata.Destination.Addr)
  768. if loaded {
  769. metadata.Domain = domain
  770. r.logger.DebugContext(ctx, "found reserve mapped domain: ", metadata.Domain)
  771. }
  772. }
  773. if metadata.Destination.IsFqdn() && dns.DomainStrategy(metadata.InboundOptions.DomainStrategy) != dns.DomainStrategyAsIS {
  774. addresses, err := r.Lookup(adapter.WithContext(ctx, &metadata), metadata.Destination.Fqdn, dns.DomainStrategy(metadata.InboundOptions.DomainStrategy))
  775. if err != nil {
  776. return err
  777. }
  778. metadata.DestinationAddresses = addresses
  779. r.dnsLogger.DebugContext(ctx, "resolved [", strings.Join(F.MapToString(metadata.DestinationAddresses), " "), "]")
  780. }
  781. if metadata.Destination.IsIPv4() {
  782. metadata.IPVersion = 4
  783. } else if metadata.Destination.IsIPv6() {
  784. metadata.IPVersion = 6
  785. }
  786. ctx, matchedRule, detour, err := r.match(ctx, &metadata, r.defaultOutboundForConnection)
  787. if err != nil {
  788. return err
  789. }
  790. if !common.Contains(detour.Network(), N.NetworkTCP) {
  791. return E.New("missing supported outbound, closing connection")
  792. }
  793. if r.clashServer != nil {
  794. trackerConn, tracker := r.clashServer.RoutedConnection(ctx, conn, metadata, matchedRule)
  795. defer tracker.Leave()
  796. conn = trackerConn
  797. }
  798. if r.v2rayServer != nil {
  799. if statsService := r.v2rayServer.StatsService(); statsService != nil {
  800. conn = statsService.RoutedConnection(metadata.Inbound, detour.Tag(), metadata.User, conn)
  801. }
  802. }
  803. return detour.NewConnection(ctx, conn, metadata)
  804. }
  805. func (r *Router) RoutePacketConnection(ctx context.Context, conn N.PacketConn, metadata adapter.InboundContext) error {
  806. if metadata.InboundDetour != "" {
  807. if metadata.LastInbound == metadata.InboundDetour {
  808. return E.New("routing loop on detour: ", metadata.InboundDetour)
  809. }
  810. detour := r.inboundByTag[metadata.InboundDetour]
  811. if detour == nil {
  812. return E.New("inbound detour not found: ", metadata.InboundDetour)
  813. }
  814. injectable, isInjectable := detour.(adapter.InjectableInbound)
  815. if !isInjectable {
  816. return E.New("inbound detour is not injectable: ", metadata.InboundDetour)
  817. }
  818. if !common.Contains(injectable.Network(), N.NetworkUDP) {
  819. return E.New("inject: UDP unsupported")
  820. }
  821. metadata.LastInbound = metadata.Inbound
  822. metadata.Inbound = metadata.InboundDetour
  823. metadata.InboundDetour = ""
  824. err := injectable.NewPacketConnection(ctx, conn, metadata)
  825. if err != nil {
  826. return E.Cause(err, "inject ", detour.Tag())
  827. }
  828. return nil
  829. }
  830. conntrack.KillerCheck()
  831. metadata.Network = N.NetworkUDP
  832. if r.fakeIPStore != nil && r.fakeIPStore.Contains(metadata.Destination.Addr) {
  833. domain, loaded := r.fakeIPStore.Lookup(metadata.Destination.Addr)
  834. if !loaded {
  835. return E.New("missing fakeip context")
  836. }
  837. metadata.OriginDestination = metadata.Destination
  838. metadata.Destination = M.Socksaddr{
  839. Fqdn: domain,
  840. Port: metadata.Destination.Port,
  841. }
  842. metadata.FakeIP = true
  843. r.logger.DebugContext(ctx, "found fakeip domain: ", domain)
  844. }
  845. // Currently we don't have deadline usages for UDP connections
  846. /*if deadline.NeedAdditionalReadDeadline(conn) {
  847. conn = deadline.NewPacketConn(bufio.NewNetPacketConn(conn))
  848. }*/
  849. if metadata.InboundOptions.SniffEnabled || metadata.Destination.Addr.IsUnspecified() {
  850. buffer := buf.NewPacket()
  851. destination, err := conn.ReadPacket(buffer)
  852. if err != nil {
  853. buffer.Release()
  854. return err
  855. }
  856. if metadata.Destination.Addr.IsUnspecified() {
  857. metadata.Destination = destination
  858. }
  859. if metadata.InboundOptions.SniffEnabled {
  860. sniffMetadata, _ := sniff.PeekPacket(ctx, buffer.Bytes(), sniff.DomainNameQuery, sniff.QUICClientHello, sniff.STUNMessage)
  861. if sniffMetadata != nil {
  862. metadata.Protocol = sniffMetadata.Protocol
  863. metadata.Domain = sniffMetadata.Domain
  864. if metadata.InboundOptions.SniffOverrideDestination && M.IsDomainName(metadata.Domain) {
  865. metadata.Destination = M.Socksaddr{
  866. Fqdn: metadata.Domain,
  867. Port: metadata.Destination.Port,
  868. }
  869. }
  870. if metadata.Domain != "" {
  871. r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol, ", domain: ", metadata.Domain)
  872. } else {
  873. r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol)
  874. }
  875. }
  876. }
  877. conn = bufio.NewCachedPacketConn(conn, buffer, destination)
  878. }
  879. if r.dnsReverseMapping != nil && metadata.Domain == "" {
  880. domain, loaded := r.dnsReverseMapping.Query(metadata.Destination.Addr)
  881. if loaded {
  882. metadata.Domain = domain
  883. r.logger.DebugContext(ctx, "found reserve mapped domain: ", metadata.Domain)
  884. }
  885. }
  886. if metadata.Destination.IsFqdn() && dns.DomainStrategy(metadata.InboundOptions.DomainStrategy) != dns.DomainStrategyAsIS {
  887. addresses, err := r.Lookup(adapter.WithContext(ctx, &metadata), metadata.Destination.Fqdn, dns.DomainStrategy(metadata.InboundOptions.DomainStrategy))
  888. if err != nil {
  889. return err
  890. }
  891. metadata.DestinationAddresses = addresses
  892. r.dnsLogger.DebugContext(ctx, "resolved [", strings.Join(F.MapToString(metadata.DestinationAddresses), " "), "]")
  893. }
  894. if metadata.Destination.IsIPv4() {
  895. metadata.IPVersion = 4
  896. } else if metadata.Destination.IsIPv6() {
  897. metadata.IPVersion = 6
  898. }
  899. ctx, matchedRule, detour, err := r.match(ctx, &metadata, r.defaultOutboundForPacketConnection)
  900. if err != nil {
  901. return err
  902. }
  903. if !common.Contains(detour.Network(), N.NetworkUDP) {
  904. return E.New("missing supported outbound, closing packet connection")
  905. }
  906. if r.clashServer != nil {
  907. trackerConn, tracker := r.clashServer.RoutedPacketConnection(ctx, conn, metadata, matchedRule)
  908. defer tracker.Leave()
  909. conn = trackerConn
  910. }
  911. if r.v2rayServer != nil {
  912. if statsService := r.v2rayServer.StatsService(); statsService != nil {
  913. conn = statsService.RoutedPacketConnection(metadata.Inbound, detour.Tag(), metadata.User, conn)
  914. }
  915. }
  916. if metadata.FakeIP {
  917. conn = bufio.NewNATPacketConn(bufio.NewNetPacketConn(conn), metadata.OriginDestination, metadata.Destination)
  918. }
  919. return detour.NewPacketConnection(ctx, conn, metadata)
  920. }
  921. func (r *Router) match(ctx context.Context, metadata *adapter.InboundContext, defaultOutbound adapter.Outbound) (context.Context, adapter.Rule, adapter.Outbound, error) {
  922. matchRule, matchOutbound := r.match0(ctx, metadata, defaultOutbound)
  923. if contextOutbound, loaded := outbound.TagFromContext(ctx); loaded {
  924. if contextOutbound == matchOutbound.Tag() {
  925. return nil, nil, nil, E.New("connection loopback in outbound/", matchOutbound.Type(), "[", matchOutbound.Tag(), "]")
  926. }
  927. }
  928. ctx = outbound.ContextWithTag(ctx, matchOutbound.Tag())
  929. return ctx, matchRule, matchOutbound, nil
  930. }
  931. func (r *Router) match0(ctx context.Context, metadata *adapter.InboundContext, defaultOutbound adapter.Outbound) (adapter.Rule, adapter.Outbound) {
  932. if r.processSearcher != nil {
  933. var originDestination netip.AddrPort
  934. if metadata.OriginDestination.IsValid() {
  935. originDestination = metadata.OriginDestination.AddrPort()
  936. } else if metadata.Destination.IsIP() {
  937. originDestination = metadata.Destination.AddrPort()
  938. }
  939. processInfo, err := process.FindProcessInfo(r.processSearcher, ctx, metadata.Network, metadata.Source.AddrPort(), originDestination)
  940. if err != nil {
  941. r.logger.InfoContext(ctx, "failed to search process: ", err)
  942. } else {
  943. if processInfo.ProcessPath != "" {
  944. r.logger.InfoContext(ctx, "found process path: ", processInfo.ProcessPath)
  945. } else if processInfo.PackageName != "" {
  946. r.logger.InfoContext(ctx, "found package name: ", processInfo.PackageName)
  947. } else if processInfo.UserId != -1 {
  948. if /*needUserName &&*/ true {
  949. osUser, _ := user.LookupId(F.ToString(processInfo.UserId))
  950. if osUser != nil {
  951. processInfo.User = osUser.Username
  952. }
  953. }
  954. if processInfo.User != "" {
  955. r.logger.InfoContext(ctx, "found user: ", processInfo.User)
  956. } else {
  957. r.logger.InfoContext(ctx, "found user id: ", processInfo.UserId)
  958. }
  959. }
  960. metadata.ProcessInfo = processInfo
  961. }
  962. }
  963. for i, rule := range r.rules {
  964. metadata.ResetRuleCache()
  965. if rule.Match(metadata) {
  966. detour := rule.Outbound()
  967. r.logger.DebugContext(ctx, "match[", i, "] ", rule.String(), " => ", detour)
  968. if outbound, loaded := r.Outbound(detour); loaded {
  969. return rule, outbound
  970. }
  971. r.logger.ErrorContext(ctx, "outbound not found: ", detour)
  972. }
  973. }
  974. return nil, defaultOutbound
  975. }
  976. func (r *Router) InterfaceFinder() control.InterfaceFinder {
  977. return &r.interfaceFinder
  978. }
  979. func (r *Router) UpdateInterfaces() error {
  980. if r.platformInterface == nil || !r.platformInterface.UsePlatformInterfaceGetter() {
  981. return r.interfaceFinder.update()
  982. } else {
  983. interfaces, err := r.platformInterface.Interfaces()
  984. if err != nil {
  985. return err
  986. }
  987. r.interfaceFinder.updateInterfaces(common.Map(interfaces, func(it platform.NetworkInterface) net.Interface {
  988. return net.Interface{
  989. Name: it.Name,
  990. Index: it.Index,
  991. MTU: it.MTU,
  992. }
  993. }))
  994. return nil
  995. }
  996. }
  997. func (r *Router) AutoDetectInterface() bool {
  998. return r.autoDetectInterface
  999. }
  1000. func (r *Router) AutoDetectInterfaceFunc() control.Func {
  1001. if r.platformInterface != nil && r.platformInterface.UsePlatformAutoDetectInterfaceControl() {
  1002. return r.platformInterface.AutoDetectInterfaceControl()
  1003. } else {
  1004. return control.BindToInterfaceFunc(r.InterfaceFinder(), func(network string, address string) (interfaceName string, interfaceIndex int, err error) {
  1005. remoteAddr := M.ParseSocksaddr(address).Addr
  1006. if C.IsLinux {
  1007. interfaceName, interfaceIndex = r.InterfaceMonitor().DefaultInterface(remoteAddr)
  1008. if interfaceIndex == -1 {
  1009. err = tun.ErrNoRoute
  1010. }
  1011. } else {
  1012. interfaceIndex = r.InterfaceMonitor().DefaultInterfaceIndex(remoteAddr)
  1013. if interfaceIndex == -1 {
  1014. err = tun.ErrNoRoute
  1015. }
  1016. }
  1017. return
  1018. })
  1019. }
  1020. }
  1021. func (r *Router) DefaultInterface() string {
  1022. return r.defaultInterface
  1023. }
  1024. func (r *Router) DefaultMark() int {
  1025. return r.defaultMark
  1026. }
  1027. func (r *Router) Rules() []adapter.Rule {
  1028. return r.rules
  1029. }
  1030. func (r *Router) WIFIState() adapter.WIFIState {
  1031. return r.wifiState
  1032. }
  1033. func (r *Router) NetworkMonitor() tun.NetworkUpdateMonitor {
  1034. return r.networkMonitor
  1035. }
  1036. func (r *Router) InterfaceMonitor() tun.DefaultInterfaceMonitor {
  1037. return r.interfaceMonitor
  1038. }
  1039. func (r *Router) PackageManager() tun.PackageManager {
  1040. return r.packageManager
  1041. }
  1042. func (r *Router) ClashServer() adapter.ClashServer {
  1043. return r.clashServer
  1044. }
  1045. func (r *Router) SetClashServer(server adapter.ClashServer) {
  1046. r.clashServer = server
  1047. }
  1048. func (r *Router) V2RayServer() adapter.V2RayServer {
  1049. return r.v2rayServer
  1050. }
  1051. func (r *Router) SetV2RayServer(server adapter.V2RayServer) {
  1052. r.v2rayServer = server
  1053. }
  1054. func (r *Router) OnPackagesUpdated(packages int, sharedUsers int) {
  1055. r.logger.Info("updated packages list: ", packages, " packages, ", sharedUsers, " shared users")
  1056. }
  1057. func (r *Router) NewError(ctx context.Context, err error) {
  1058. common.Close(err)
  1059. if E.IsClosedOrCanceled(err) {
  1060. r.logger.DebugContext(ctx, "connection closed: ", err)
  1061. return
  1062. }
  1063. r.logger.ErrorContext(ctx, err)
  1064. }
  1065. func (r *Router) notifyNetworkUpdate(event int) {
  1066. if event == tun.EventNoRoute {
  1067. r.pauseManager.NetworkPause()
  1068. r.logger.Error("missing default interface")
  1069. } else {
  1070. r.pauseManager.NetworkWake()
  1071. if C.IsAndroid && r.platformInterface == nil {
  1072. var vpnStatus string
  1073. if r.interfaceMonitor.AndroidVPNEnabled() {
  1074. vpnStatus = "enabled"
  1075. } else {
  1076. vpnStatus = "disabled"
  1077. }
  1078. r.logger.Info("updated default interface ", r.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", r.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()), ", vpn ", vpnStatus)
  1079. } else {
  1080. r.logger.Info("updated default interface ", r.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", r.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()))
  1081. }
  1082. }
  1083. if !r.started {
  1084. return
  1085. }
  1086. _ = r.ResetNetwork()
  1087. }
  1088. func (r *Router) ResetNetwork() error {
  1089. conntrack.Close()
  1090. for _, outbound := range r.outbounds {
  1091. listener, isListener := outbound.(adapter.InterfaceUpdateListener)
  1092. if isListener {
  1093. listener.InterfaceUpdated()
  1094. }
  1095. }
  1096. for _, transport := range r.transports {
  1097. transport.Reset()
  1098. }
  1099. return nil
  1100. }
  1101. func (r *Router) updateWIFIState() {
  1102. if r.platformInterface == nil {
  1103. return
  1104. }
  1105. state := r.platformInterface.ReadWIFIState()
  1106. if state != r.wifiState {
  1107. r.wifiState = state
  1108. r.logger.Info("updated WIFI state: SSID=", state.SSID, ", BSSID=", state.BSSID)
  1109. }
  1110. }