router.go 38 KB

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