router.go 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192
  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 != os.ErrInvalid {
  270. if err != nil {
  271. return nil, err
  272. }
  273. router.networkMonitor = networkMonitor
  274. networkMonitor.RegisterCallback(router.interfaceFinder.update)
  275. interfaceMonitor, err := tun.NewDefaultInterfaceMonitor(router.networkMonitor, tun.DefaultInterfaceMonitorOptions{
  276. OverrideAndroidVPN: options.OverrideAndroidVPN,
  277. })
  278. if err != nil {
  279. return nil, E.New("auto_detect_interface unsupported on current platform")
  280. }
  281. interfaceMonitor.RegisterCallback(router.notifyNetworkUpdate)
  282. router.interfaceMonitor = interfaceMonitor
  283. }
  284. } else {
  285. interfaceMonitor := platformInterface.CreateDefaultInterfaceMonitor(router)
  286. interfaceMonitor.RegisterCallback(router.notifyNetworkUpdate)
  287. router.interfaceMonitor = interfaceMonitor
  288. }
  289. }
  290. needFindProcess := hasRule(options.Rules, isProcessRule) || hasDNSRule(dnsOptions.Rules, isProcessDNSRule) || options.FindProcess
  291. needPackageManager := C.IsAndroid && platformInterface == nil && (needFindProcess || common.Any(inbounds, func(inbound option.Inbound) bool {
  292. return len(inbound.TunOptions.IncludePackage) > 0 || len(inbound.TunOptions.ExcludePackage) > 0
  293. }))
  294. if needPackageManager {
  295. packageManager, err := tun.NewPackageManager(router)
  296. if err != nil {
  297. return nil, E.Cause(err, "create package manager")
  298. }
  299. router.packageManager = packageManager
  300. }
  301. if needFindProcess {
  302. if platformInterface != nil {
  303. router.processSearcher = platformInterface
  304. } else {
  305. searcher, err := process.NewSearcher(process.Config{
  306. Logger: logFactory.NewLogger("router/process"),
  307. PackageManager: router.packageManager,
  308. })
  309. if err != nil {
  310. if err != os.ErrInvalid {
  311. router.logger.Warn(E.Cause(err, "create process searcher"))
  312. }
  313. } else {
  314. router.processSearcher = searcher
  315. }
  316. }
  317. }
  318. if ntpOptions.Enabled {
  319. router.timeService = ntp.NewService(ctx, router, logFactory.NewLogger("ntp"), ntpOptions)
  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. if r.needGeoIPDatabase {
  409. err := r.prepareGeoIPDatabase()
  410. if err != nil {
  411. return err
  412. }
  413. }
  414. if r.needGeositeDatabase {
  415. err := r.prepareGeositeDatabase()
  416. if err != nil {
  417. return err
  418. }
  419. }
  420. if r.interfaceMonitor != nil {
  421. err := r.interfaceMonitor.Start()
  422. if err != nil {
  423. return err
  424. }
  425. }
  426. if r.networkMonitor != nil {
  427. err := r.networkMonitor.Start()
  428. if err != nil {
  429. return err
  430. }
  431. }
  432. if r.packageManager != nil {
  433. err := r.packageManager.Start()
  434. if err != nil {
  435. return err
  436. }
  437. }
  438. if r.needGeositeDatabase {
  439. for _, rule := range r.rules {
  440. err := rule.UpdateGeosite()
  441. if err != nil {
  442. r.logger.Error("failed to initialize geosite: ", err)
  443. }
  444. }
  445. for _, rule := range r.dnsRules {
  446. err := rule.UpdateGeosite()
  447. if err != nil {
  448. r.logger.Error("failed to initialize geosite: ", err)
  449. }
  450. }
  451. err := common.Close(r.geositeReader)
  452. if err != nil {
  453. return err
  454. }
  455. r.geositeCache = nil
  456. r.geositeReader = nil
  457. }
  458. for i, rule := range r.rules {
  459. err := rule.Start()
  460. if err != nil {
  461. return E.Cause(err, "initialize rule[", i, "]")
  462. }
  463. }
  464. for i, rule := range r.dnsRules {
  465. err := rule.Start()
  466. if err != nil {
  467. return E.Cause(err, "initialize DNS rule[", i, "]")
  468. }
  469. }
  470. for i, transport := range r.transports {
  471. err := transport.Start()
  472. if err != nil {
  473. return E.Cause(err, "initialize DNS server[", i, "]")
  474. }
  475. }
  476. if r.timeService != nil {
  477. err := r.timeService.Start()
  478. if err != nil {
  479. return E.Cause(err, "initialize time service")
  480. }
  481. }
  482. return nil
  483. }
  484. func (r *Router) Close() error {
  485. var err error
  486. for i, rule := range r.rules {
  487. r.logger.Trace("closing rule[", i, "]")
  488. err = E.Append(err, rule.Close(), func(err error) error {
  489. return E.Cause(err, "close rule[", i, "]")
  490. })
  491. }
  492. for i, rule := range r.dnsRules {
  493. r.logger.Trace("closing dns rule[", i, "]")
  494. err = E.Append(err, rule.Close(), func(err error) error {
  495. return E.Cause(err, "close dns rule[", i, "]")
  496. })
  497. }
  498. for i, transport := range r.transports {
  499. r.logger.Trace("closing transport[", i, "] ")
  500. err = E.Append(err, transport.Close(), func(err error) error {
  501. return E.Cause(err, "close dns transport[", i, "]")
  502. })
  503. }
  504. if r.geositeReader != nil {
  505. r.logger.Trace("closing geoip reader")
  506. err = E.Append(err, common.Close(r.geoIPReader), func(err error) error {
  507. return E.Cause(err, "close geoip reader")
  508. })
  509. }
  510. if r.interfaceMonitor != nil {
  511. r.logger.Trace("closing interface monitor")
  512. err = E.Append(err, r.interfaceMonitor.Close(), func(err error) error {
  513. return E.Cause(err, "close interface monitor")
  514. })
  515. }
  516. if r.networkMonitor != nil {
  517. r.logger.Trace("closing network monitor")
  518. err = E.Append(err, r.networkMonitor.Close(), func(err error) error {
  519. return E.Cause(err, "close network monitor")
  520. })
  521. }
  522. if r.packageManager != nil {
  523. r.logger.Trace("closing package manager")
  524. err = E.Append(err, r.packageManager.Close(), func(err error) error {
  525. return E.Cause(err, "close package manager")
  526. })
  527. }
  528. if r.timeService != nil {
  529. r.logger.Trace("closing time service")
  530. err = E.Append(err, r.timeService.Close(), func(err error) error {
  531. return E.Cause(err, "close time service")
  532. })
  533. }
  534. return err
  535. }
  536. func (r *Router) GeoIPReader() *geoip.Reader {
  537. return r.geoIPReader
  538. }
  539. func (r *Router) LoadGeosite(code string) (adapter.Rule, error) {
  540. rule, cached := r.geositeCache[code]
  541. if cached {
  542. return rule, nil
  543. }
  544. items, err := r.geositeReader.Read(code)
  545. if err != nil {
  546. return nil, err
  547. }
  548. rule, err = NewDefaultRule(r, nil, geosite.Compile(items))
  549. if err != nil {
  550. return nil, err
  551. }
  552. r.geositeCache[code] = rule
  553. return rule, nil
  554. }
  555. func (r *Router) Outbound(tag string) (adapter.Outbound, bool) {
  556. outbound, loaded := r.outboundByTag[tag]
  557. return outbound, loaded
  558. }
  559. func (r *Router) DefaultOutbound(network string) adapter.Outbound {
  560. if network == N.NetworkTCP {
  561. return r.defaultOutboundForConnection
  562. } else {
  563. return r.defaultOutboundForPacketConnection
  564. }
  565. }
  566. func (r *Router) RouteConnection(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) error {
  567. if metadata.InboundDetour != "" {
  568. if metadata.LastInbound == metadata.InboundDetour {
  569. return E.New("routing loop on detour: ", metadata.InboundDetour)
  570. }
  571. detour := r.inboundByTag[metadata.InboundDetour]
  572. if detour == nil {
  573. return E.New("inbound detour not found: ", metadata.InboundDetour)
  574. }
  575. injectable, isInjectable := detour.(adapter.InjectableInbound)
  576. if !isInjectable {
  577. return E.New("inbound detour is not injectable: ", metadata.InboundDetour)
  578. }
  579. if !common.Contains(injectable.Network(), N.NetworkTCP) {
  580. return E.New("inject: TCP unsupported")
  581. }
  582. metadata.LastInbound = metadata.Inbound
  583. metadata.Inbound = metadata.InboundDetour
  584. metadata.InboundDetour = ""
  585. err := injectable.NewConnection(ctx, conn, metadata)
  586. if err != nil {
  587. return E.Cause(err, "inject ", detour.Tag())
  588. }
  589. return nil
  590. }
  591. metadata.Network = N.NetworkTCP
  592. switch metadata.Destination.Fqdn {
  593. case mux.Destination.Fqdn:
  594. r.logger.InfoContext(ctx, "inbound multiplex connection")
  595. return mux.NewConnection(ctx, r, r, r.logger, conn, metadata)
  596. case vmess.MuxDestination.Fqdn:
  597. r.logger.InfoContext(ctx, "inbound legacy multiplex connection")
  598. return vmess.HandleMuxConnection(ctx, conn, adapter.NewUpstreamHandler(metadata, r.RouteConnection, r.RoutePacketConnection, r))
  599. case uot.MagicAddress:
  600. request, err := uot.ReadRequest(conn)
  601. if err != nil {
  602. return E.Cause(err, "read UoT request")
  603. }
  604. if request.IsConnect {
  605. r.logger.InfoContext(ctx, "inbound UoT connect connection to ", request.Destination)
  606. } else {
  607. r.logger.InfoContext(ctx, "inbound UoT connection to ", request.Destination)
  608. }
  609. metadata.Domain = metadata.Destination.Fqdn
  610. metadata.Destination = request.Destination
  611. return r.RoutePacketConnection(ctx, uot.NewConn(conn, *request), metadata)
  612. case uot.LegacyMagicAddress:
  613. r.logger.InfoContext(ctx, "inbound legacy UoT connection")
  614. metadata.Domain = metadata.Destination.Fqdn
  615. metadata.Destination = M.Socksaddr{Addr: netip.IPv4Unspecified()}
  616. return r.RoutePacketConnection(ctx, uot.NewConn(conn, uot.Request{}), metadata)
  617. }
  618. if metadata.InboundOptions.SniffEnabled {
  619. buffer := buf.NewPacket()
  620. buffer.FullReset()
  621. sniffMetadata, err := sniff.PeekStream(ctx, conn, buffer, time.Duration(metadata.InboundOptions.SniffTimeout), sniff.StreamDomainNameQuery, sniff.TLSClientHello, sniff.HTTPHost)
  622. if sniffMetadata != nil {
  623. metadata.Protocol = sniffMetadata.Protocol
  624. metadata.Domain = sniffMetadata.Domain
  625. if metadata.InboundOptions.SniffOverrideDestination && M.IsDomainName(metadata.Domain) {
  626. metadata.Destination = M.Socksaddr{
  627. Fqdn: metadata.Domain,
  628. Port: metadata.Destination.Port,
  629. }
  630. }
  631. if metadata.Domain != "" {
  632. r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol, ", domain: ", metadata.Domain)
  633. } else {
  634. r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol)
  635. }
  636. } else if err != nil {
  637. r.logger.TraceContext(ctx, "sniffed no protocol: ", err)
  638. }
  639. if !buffer.IsEmpty() {
  640. conn = bufio.NewCachedConn(conn, buffer)
  641. } else {
  642. buffer.Release()
  643. }
  644. }
  645. if metadata.Destination.IsFqdn() && dns.DomainStrategy(metadata.InboundOptions.DomainStrategy) != dns.DomainStrategyAsIS {
  646. addresses, err := r.Lookup(adapter.WithContext(ctx, &metadata), metadata.Destination.Fqdn, dns.DomainStrategy(metadata.InboundOptions.DomainStrategy))
  647. if err != nil {
  648. return err
  649. }
  650. metadata.DestinationAddresses = addresses
  651. r.dnsLogger.DebugContext(ctx, "resolved [", strings.Join(F.MapToString(metadata.DestinationAddresses), " "), "]")
  652. }
  653. ctx, matchedRule, detour, err := r.match(ctx, &metadata, r.defaultOutboundForConnection)
  654. if err != nil {
  655. return err
  656. }
  657. if !common.Contains(detour.Network(), N.NetworkTCP) {
  658. return E.New("missing supported outbound, closing connection")
  659. }
  660. if r.clashServer != nil {
  661. trackerConn, tracker := r.clashServer.RoutedConnection(ctx, conn, metadata, matchedRule)
  662. defer tracker.Leave()
  663. conn = trackerConn
  664. }
  665. if r.v2rayServer != nil {
  666. if statsService := r.v2rayServer.StatsService(); statsService != nil {
  667. conn = statsService.RoutedConnection(metadata.Inbound, detour.Tag(), metadata.User, conn)
  668. }
  669. }
  670. return detour.NewConnection(ctx, conn, metadata)
  671. }
  672. func (r *Router) RoutePacketConnection(ctx context.Context, conn N.PacketConn, metadata adapter.InboundContext) error {
  673. if metadata.InboundDetour != "" {
  674. if metadata.LastInbound == metadata.InboundDetour {
  675. return E.New("routing loop on detour: ", metadata.InboundDetour)
  676. }
  677. detour := r.inboundByTag[metadata.InboundDetour]
  678. if detour == nil {
  679. return E.New("inbound detour not found: ", metadata.InboundDetour)
  680. }
  681. injectable, isInjectable := detour.(adapter.InjectableInbound)
  682. if !isInjectable {
  683. return E.New("inbound detour is not injectable: ", metadata.InboundDetour)
  684. }
  685. if !common.Contains(injectable.Network(), N.NetworkUDP) {
  686. return E.New("inject: UDP unsupported")
  687. }
  688. metadata.LastInbound = metadata.Inbound
  689. metadata.Inbound = metadata.InboundDetour
  690. metadata.InboundDetour = ""
  691. err := injectable.NewPacketConnection(ctx, conn, metadata)
  692. if err != nil {
  693. return E.Cause(err, "inject ", detour.Tag())
  694. }
  695. return nil
  696. }
  697. metadata.Network = N.NetworkUDP
  698. if metadata.InboundOptions.SniffEnabled {
  699. buffer := buf.NewPacket()
  700. buffer.FullReset()
  701. destination, err := conn.ReadPacket(buffer)
  702. if err != nil {
  703. buffer.Release()
  704. return err
  705. }
  706. sniffMetadata, _ := sniff.PeekPacket(ctx, buffer.Bytes(), sniff.DomainNameQuery, sniff.QUICClientHello, sniff.STUNMessage)
  707. if sniffMetadata != nil {
  708. metadata.Protocol = sniffMetadata.Protocol
  709. metadata.Domain = sniffMetadata.Domain
  710. if metadata.InboundOptions.SniffOverrideDestination && M.IsDomainName(metadata.Domain) {
  711. metadata.Destination = M.Socksaddr{
  712. Fqdn: metadata.Domain,
  713. Port: metadata.Destination.Port,
  714. }
  715. }
  716. if metadata.Domain != "" {
  717. r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol, ", domain: ", metadata.Domain)
  718. } else {
  719. r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol)
  720. }
  721. }
  722. conn = bufio.NewCachedPacketConn(conn, buffer, destination)
  723. }
  724. if metadata.Destination.IsFqdn() && dns.DomainStrategy(metadata.InboundOptions.DomainStrategy) != dns.DomainStrategyAsIS {
  725. addresses, err := r.Lookup(adapter.WithContext(ctx, &metadata), metadata.Destination.Fqdn, dns.DomainStrategy(metadata.InboundOptions.DomainStrategy))
  726. if err != nil {
  727. return err
  728. }
  729. metadata.DestinationAddresses = addresses
  730. r.dnsLogger.DebugContext(ctx, "resolved [", strings.Join(F.MapToString(metadata.DestinationAddresses), " "), "]")
  731. }
  732. ctx, matchedRule, detour, err := r.match(ctx, &metadata, r.defaultOutboundForPacketConnection)
  733. if err != nil {
  734. return err
  735. }
  736. if !common.Contains(detour.Network(), N.NetworkUDP) {
  737. return E.New("missing supported outbound, closing packet connection")
  738. }
  739. if r.clashServer != nil {
  740. trackerConn, tracker := r.clashServer.RoutedPacketConnection(ctx, conn, metadata, matchedRule)
  741. defer tracker.Leave()
  742. conn = trackerConn
  743. }
  744. if r.v2rayServer != nil {
  745. if statsService := r.v2rayServer.StatsService(); statsService != nil {
  746. conn = statsService.RoutedPacketConnection(metadata.Inbound, detour.Tag(), metadata.User, conn)
  747. }
  748. }
  749. return detour.NewPacketConnection(ctx, conn, metadata)
  750. }
  751. func (r *Router) match(ctx context.Context, metadata *adapter.InboundContext, defaultOutbound adapter.Outbound) (context.Context, adapter.Rule, adapter.Outbound, error) {
  752. matchRule, matchOutbound := r.match0(ctx, metadata, defaultOutbound)
  753. if contextOutbound, loaded := outbound.TagFromContext(ctx); loaded {
  754. if contextOutbound == matchOutbound.Tag() {
  755. return nil, nil, nil, E.New("connection loopback in outbound/", matchOutbound.Type(), "[", matchOutbound.Tag(), "]")
  756. }
  757. }
  758. ctx = outbound.ContextWithTag(ctx, matchOutbound.Tag())
  759. return ctx, matchRule, matchOutbound, nil
  760. }
  761. func (r *Router) match0(ctx context.Context, metadata *adapter.InboundContext, defaultOutbound adapter.Outbound) (adapter.Rule, adapter.Outbound) {
  762. if r.processSearcher != nil {
  763. var originDestination netip.AddrPort
  764. if metadata.OriginDestination.IsValid() {
  765. originDestination = metadata.OriginDestination.AddrPort()
  766. } else if metadata.Destination.IsIP() {
  767. originDestination = metadata.Destination.AddrPort()
  768. }
  769. processInfo, err := process.FindProcessInfo(r.processSearcher, ctx, metadata.Network, metadata.Source.AddrPort(), originDestination)
  770. if err != nil {
  771. r.logger.InfoContext(ctx, "failed to search process: ", err)
  772. } else {
  773. if processInfo.ProcessPath != "" {
  774. r.logger.InfoContext(ctx, "found process path: ", processInfo.ProcessPath)
  775. } else if processInfo.PackageName != "" {
  776. r.logger.InfoContext(ctx, "found package name: ", processInfo.PackageName)
  777. } else if processInfo.UserId != -1 {
  778. if /*needUserName &&*/ true {
  779. osUser, _ := user.LookupId(F.ToString(processInfo.UserId))
  780. if osUser != nil {
  781. processInfo.User = osUser.Username
  782. }
  783. }
  784. if processInfo.User != "" {
  785. r.logger.InfoContext(ctx, "found user: ", processInfo.User)
  786. } else {
  787. r.logger.InfoContext(ctx, "found user id: ", processInfo.UserId)
  788. }
  789. }
  790. metadata.ProcessInfo = processInfo
  791. }
  792. }
  793. for i, rule := range r.rules {
  794. if rule.Match(metadata) {
  795. detour := rule.Outbound()
  796. r.logger.DebugContext(ctx, "match[", i, "] ", rule.String(), " => ", detour)
  797. if outbound, loaded := r.Outbound(detour); loaded {
  798. return rule, outbound
  799. }
  800. r.logger.ErrorContext(ctx, "outbound not found: ", detour)
  801. }
  802. }
  803. return nil, defaultOutbound
  804. }
  805. func (r *Router) InterfaceFinder() control.InterfaceFinder {
  806. return &r.interfaceFinder
  807. }
  808. func (r *Router) UpdateInterfaces() error {
  809. if r.platformInterface == nil || !r.platformInterface.UsePlatformInterfaceGetter() {
  810. return r.interfaceFinder.update()
  811. } else {
  812. interfaces, err := r.platformInterface.Interfaces()
  813. if err != nil {
  814. return err
  815. }
  816. r.interfaceFinder.updateInterfaces(common.Map(interfaces, func(it platform.NetworkInterface) net.Interface {
  817. return net.Interface{
  818. Name: it.Name,
  819. Index: it.Index,
  820. MTU: it.MTU,
  821. }
  822. }))
  823. return nil
  824. }
  825. }
  826. func (r *Router) AutoDetectInterface() bool {
  827. return r.autoDetectInterface
  828. }
  829. func (r *Router) AutoDetectInterfaceFunc() control.Func {
  830. if r.platformInterface != nil {
  831. return r.platformInterface.AutoDetectInterfaceControl()
  832. } else {
  833. return control.BindToInterfaceFunc(r.InterfaceFinder(), func(network string, address string) (interfaceName string, interfaceIndex int) {
  834. remoteAddr := M.ParseSocksaddr(address).Addr
  835. if C.IsLinux {
  836. return r.InterfaceMonitor().DefaultInterfaceName(remoteAddr), -1
  837. } else {
  838. return "", r.InterfaceMonitor().DefaultInterfaceIndex(remoteAddr)
  839. }
  840. })
  841. }
  842. }
  843. func (r *Router) DefaultInterface() string {
  844. return r.defaultInterface
  845. }
  846. func (r *Router) DefaultMark() int {
  847. return r.defaultMark
  848. }
  849. func (r *Router) Rules() []adapter.Rule {
  850. return r.rules
  851. }
  852. func (r *Router) NetworkMonitor() tun.NetworkUpdateMonitor {
  853. return r.networkMonitor
  854. }
  855. func (r *Router) InterfaceMonitor() tun.DefaultInterfaceMonitor {
  856. return r.interfaceMonitor
  857. }
  858. func (r *Router) PackageManager() tun.PackageManager {
  859. return r.packageManager
  860. }
  861. func (r *Router) TimeFunc() func() time.Time {
  862. if r.timeService == nil {
  863. return nil
  864. }
  865. return r.timeService.TimeFunc()
  866. }
  867. func (r *Router) ClashServer() adapter.ClashServer {
  868. return r.clashServer
  869. }
  870. func (r *Router) SetClashServer(server adapter.ClashServer) {
  871. r.clashServer = server
  872. }
  873. func (r *Router) V2RayServer() adapter.V2RayServer {
  874. return r.v2rayServer
  875. }
  876. func (r *Router) SetV2RayServer(server adapter.V2RayServer) {
  877. r.v2rayServer = server
  878. }
  879. func hasRule(rules []option.Rule, cond func(rule option.DefaultRule) bool) bool {
  880. for _, rule := range rules {
  881. switch rule.Type {
  882. case C.RuleTypeDefault:
  883. if cond(rule.DefaultOptions) {
  884. return true
  885. }
  886. case C.RuleTypeLogical:
  887. for _, subRule := range rule.LogicalOptions.Rules {
  888. if cond(subRule) {
  889. return true
  890. }
  891. }
  892. }
  893. }
  894. return false
  895. }
  896. func hasDNSRule(rules []option.DNSRule, cond func(rule option.DefaultDNSRule) bool) bool {
  897. for _, rule := range rules {
  898. switch rule.Type {
  899. case C.RuleTypeDefault:
  900. if cond(rule.DefaultOptions) {
  901. return true
  902. }
  903. case C.RuleTypeLogical:
  904. for _, subRule := range rule.LogicalOptions.Rules {
  905. if cond(subRule) {
  906. return true
  907. }
  908. }
  909. }
  910. }
  911. return false
  912. }
  913. func isGeoIPRule(rule option.DefaultRule) bool {
  914. return len(rule.SourceGeoIP) > 0 && common.Any(rule.SourceGeoIP, notPrivateNode) || len(rule.GeoIP) > 0 && common.Any(rule.GeoIP, notPrivateNode)
  915. }
  916. func isGeoIPDNSRule(rule option.DefaultDNSRule) bool {
  917. return len(rule.SourceGeoIP) > 0 && common.Any(rule.SourceGeoIP, notPrivateNode)
  918. }
  919. func isGeositeRule(rule option.DefaultRule) bool {
  920. return len(rule.Geosite) > 0
  921. }
  922. func isGeositeDNSRule(rule option.DefaultDNSRule) bool {
  923. return len(rule.Geosite) > 0
  924. }
  925. func isProcessRule(rule option.DefaultRule) 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 isProcessDNSRule(rule option.DefaultDNSRule) bool {
  929. return len(rule.ProcessName) > 0 || len(rule.ProcessPath) > 0 || len(rule.PackageName) > 0 || len(rule.User) > 0 || len(rule.UserID) > 0
  930. }
  931. func notPrivateNode(code string) bool {
  932. return code != "private"
  933. }
  934. func (r *Router) prepareGeoIPDatabase() error {
  935. var geoPath string
  936. if r.geoIPOptions.Path != "" {
  937. geoPath = r.geoIPOptions.Path
  938. } else {
  939. geoPath = "geoip.db"
  940. if foundPath, loaded := C.FindPath(geoPath); loaded {
  941. geoPath = foundPath
  942. }
  943. }
  944. geoPath = C.BasePath(geoPath)
  945. if !rw.FileExists(geoPath) {
  946. r.logger.Warn("geoip database not exists: ", geoPath)
  947. var err error
  948. for attempts := 0; attempts < 3; attempts++ {
  949. err = r.downloadGeoIPDatabase(geoPath)
  950. if err == nil {
  951. break
  952. }
  953. r.logger.Error("download geoip database: ", err)
  954. os.Remove(geoPath)
  955. // time.Sleep(10 * time.Second)
  956. }
  957. if err != nil {
  958. return err
  959. }
  960. }
  961. geoReader, codes, err := geoip.Open(geoPath)
  962. if err != nil {
  963. return E.Cause(err, "open geoip database")
  964. }
  965. r.logger.Info("loaded geoip database: ", len(codes), " codes")
  966. r.geoIPReader = geoReader
  967. return nil
  968. }
  969. func (r *Router) prepareGeositeDatabase() error {
  970. var geoPath string
  971. if r.geositeOptions.Path != "" {
  972. geoPath = r.geositeOptions.Path
  973. } else {
  974. geoPath = "geosite.db"
  975. if foundPath, loaded := C.FindPath(geoPath); loaded {
  976. geoPath = foundPath
  977. }
  978. }
  979. geoPath = C.BasePath(geoPath)
  980. if !rw.FileExists(geoPath) {
  981. r.logger.Warn("geosite database not exists: ", geoPath)
  982. var err error
  983. for attempts := 0; attempts < 3; attempts++ {
  984. err = r.downloadGeositeDatabase(geoPath)
  985. if err == nil {
  986. break
  987. }
  988. r.logger.Error("download geosite database: ", err)
  989. os.Remove(geoPath)
  990. // time.Sleep(10 * time.Second)
  991. }
  992. if err != nil {
  993. return err
  994. }
  995. }
  996. geoReader, codes, err := geosite.Open(geoPath)
  997. if err == nil {
  998. r.logger.Info("loaded geosite database: ", len(codes), " codes")
  999. r.geositeReader = geoReader
  1000. } else {
  1001. return E.Cause(err, "open geosite database")
  1002. }
  1003. return nil
  1004. }
  1005. func (r *Router) downloadGeoIPDatabase(savePath string) error {
  1006. var downloadURL string
  1007. if r.geoIPOptions.DownloadURL != "" {
  1008. downloadURL = r.geoIPOptions.DownloadURL
  1009. } else {
  1010. downloadURL = "https://github.com/SagerNet/sing-geoip/releases/latest/download/geoip.db"
  1011. }
  1012. r.logger.Info("downloading geoip database")
  1013. var detour adapter.Outbound
  1014. if r.geoIPOptions.DownloadDetour != "" {
  1015. outbound, loaded := r.Outbound(r.geoIPOptions.DownloadDetour)
  1016. if !loaded {
  1017. return E.New("detour outbound not found: ", r.geoIPOptions.DownloadDetour)
  1018. }
  1019. detour = outbound
  1020. } else {
  1021. detour = r.defaultOutboundForConnection
  1022. }
  1023. if parentDir := filepath.Dir(savePath); parentDir != "" {
  1024. os.MkdirAll(parentDir, 0o755)
  1025. }
  1026. saveFile, err := os.OpenFile(savePath, os.O_CREATE|os.O_WRONLY, 0o644)
  1027. if err != nil {
  1028. return E.Cause(err, "open output file: ", downloadURL)
  1029. }
  1030. defer saveFile.Close()
  1031. httpClient := &http.Client{
  1032. Transport: &http.Transport{
  1033. ForceAttemptHTTP2: true,
  1034. TLSHandshakeTimeout: 5 * time.Second,
  1035. DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
  1036. return detour.DialContext(ctx, network, M.ParseSocksaddr(addr))
  1037. },
  1038. },
  1039. }
  1040. defer httpClient.CloseIdleConnections()
  1041. response, err := httpClient.Get(downloadURL)
  1042. if err != nil {
  1043. return err
  1044. }
  1045. defer response.Body.Close()
  1046. _, err = io.Copy(saveFile, response.Body)
  1047. return err
  1048. }
  1049. func (r *Router) downloadGeositeDatabase(savePath string) error {
  1050. var downloadURL string
  1051. if r.geositeOptions.DownloadURL != "" {
  1052. downloadURL = r.geositeOptions.DownloadURL
  1053. } else {
  1054. downloadURL = "https://github.com/SagerNet/sing-geosite/releases/latest/download/geosite.db"
  1055. }
  1056. r.logger.Info("downloading geosite database")
  1057. var detour adapter.Outbound
  1058. if r.geositeOptions.DownloadDetour != "" {
  1059. outbound, loaded := r.Outbound(r.geositeOptions.DownloadDetour)
  1060. if !loaded {
  1061. return E.New("detour outbound not found: ", r.geositeOptions.DownloadDetour)
  1062. }
  1063. detour = outbound
  1064. } else {
  1065. detour = r.defaultOutboundForConnection
  1066. }
  1067. if parentDir := filepath.Dir(savePath); parentDir != "" {
  1068. os.MkdirAll(parentDir, 0o755)
  1069. }
  1070. saveFile, err := os.OpenFile(savePath, os.O_CREATE|os.O_WRONLY, 0o644)
  1071. if err != nil {
  1072. return E.Cause(err, "open output file: ", downloadURL)
  1073. }
  1074. defer saveFile.Close()
  1075. httpClient := &http.Client{
  1076. Transport: &http.Transport{
  1077. ForceAttemptHTTP2: true,
  1078. TLSHandshakeTimeout: 5 * time.Second,
  1079. DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
  1080. return detour.DialContext(ctx, network, M.ParseSocksaddr(addr))
  1081. },
  1082. },
  1083. }
  1084. defer httpClient.CloseIdleConnections()
  1085. response, err := httpClient.Get(downloadURL)
  1086. if err != nil {
  1087. return err
  1088. }
  1089. defer response.Body.Close()
  1090. _, err = io.Copy(saveFile, response.Body)
  1091. return err
  1092. }
  1093. func (r *Router) OnPackagesUpdated(packages int, sharedUsers int) {
  1094. r.logger.Info("updated packages list: ", packages, " packages, ", sharedUsers, " shared users")
  1095. }
  1096. func (r *Router) NewError(ctx context.Context, err error) {
  1097. common.Close(err)
  1098. if E.IsClosedOrCanceled(err) {
  1099. r.logger.DebugContext(ctx, "connection closed: ", err)
  1100. return
  1101. }
  1102. r.logger.ErrorContext(ctx, err)
  1103. }
  1104. func (r *Router) notifyNetworkUpdate(int) error {
  1105. if C.IsAndroid && r.platformInterface == nil {
  1106. var vpnStatus string
  1107. if r.interfaceMonitor.AndroidVPNEnabled() {
  1108. vpnStatus = "enabled"
  1109. } else {
  1110. vpnStatus = "disabled"
  1111. }
  1112. r.logger.Info("updated default interface ", r.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", r.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()), ", vpn ", vpnStatus)
  1113. } else {
  1114. r.logger.Info("updated default interface ", r.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", r.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()))
  1115. }
  1116. if conntrack.Enabled {
  1117. conntrack.Close()
  1118. }
  1119. for _, outbound := range r.outbounds {
  1120. listener, isListener := outbound.(adapter.InterfaceUpdateListener)
  1121. if isListener {
  1122. err := listener.InterfaceUpdated()
  1123. if err != nil {
  1124. return err
  1125. }
  1126. }
  1127. }
  1128. return nil
  1129. }