router.go 37 KB

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