router.go 43 KB

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