router.go 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004
  1. package route
  2. import (
  3. "context"
  4. "net"
  5. "net/netip"
  6. "net/url"
  7. "os"
  8. "os/user"
  9. "strings"
  10. "time"
  11. "github.com/sagernet/sing-box/adapter"
  12. "github.com/sagernet/sing-box/common/dialer"
  13. "github.com/sagernet/sing-box/common/dialer/conntrack"
  14. "github.com/sagernet/sing-box/common/geoip"
  15. "github.com/sagernet/sing-box/common/geosite"
  16. "github.com/sagernet/sing-box/common/mux"
  17. "github.com/sagernet/sing-box/common/process"
  18. "github.com/sagernet/sing-box/common/sniff"
  19. C "github.com/sagernet/sing-box/constant"
  20. "github.com/sagernet/sing-box/experimental/libbox/platform"
  21. "github.com/sagernet/sing-box/log"
  22. "github.com/sagernet/sing-box/ntp"
  23. "github.com/sagernet/sing-box/option"
  24. "github.com/sagernet/sing-box/outbound"
  25. "github.com/sagernet/sing-box/transport/fakeip"
  26. "github.com/sagernet/sing-dns"
  27. "github.com/sagernet/sing-tun"
  28. "github.com/sagernet/sing-vmess"
  29. "github.com/sagernet/sing/common"
  30. "github.com/sagernet/sing/common/buf"
  31. "github.com/sagernet/sing/common/bufio"
  32. "github.com/sagernet/sing/common/bufio/deadline"
  33. "github.com/sagernet/sing/common/control"
  34. E "github.com/sagernet/sing/common/exceptions"
  35. F "github.com/sagernet/sing/common/format"
  36. M "github.com/sagernet/sing/common/metadata"
  37. N "github.com/sagernet/sing/common/network"
  38. "github.com/sagernet/sing/common/uot"
  39. )
  40. var _ adapter.Router = (*Router)(nil)
  41. type Router struct {
  42. ctx context.Context
  43. logger log.ContextLogger
  44. dnsLogger log.ContextLogger
  45. inboundByTag map[string]adapter.Inbound
  46. outbounds []adapter.Outbound
  47. outboundByTag map[string]adapter.Outbound
  48. rules []adapter.Rule
  49. defaultDetour string
  50. defaultOutboundForConnection adapter.Outbound
  51. defaultOutboundForPacketConnection adapter.Outbound
  52. needGeoIPDatabase bool
  53. needGeositeDatabase bool
  54. geoIPOptions option.GeoIPOptions
  55. geositeOptions option.GeositeOptions
  56. geoIPReader *geoip.Reader
  57. geositeReader *geosite.Reader
  58. geositeCache map[string]adapter.Rule
  59. dnsClient *dns.Client
  60. defaultDomainStrategy dns.DomainStrategy
  61. dnsRules []adapter.DNSRule
  62. defaultTransport dns.Transport
  63. transports []dns.Transport
  64. transportMap map[string]dns.Transport
  65. transportDomainStrategy map[dns.Transport]dns.DomainStrategy
  66. dnsReverseMapping *DNSReverseMapping
  67. fakeIPStore adapter.FakeIPStore
  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 && strings.Contains(server.Address, ".") {
  179. return nil, E.New("parse dns server[", tag, "]: missing address_resolver")
  180. }
  181. }
  182. transport, err := dns.CreateTransport(tag, ctx, logFactory.NewLogger(F.ToString("dns/transport[", tag, "]")), detour, server.Address)
  183. if err != nil {
  184. return nil, E.Cause(err, "parse dns server[", tag, "]")
  185. }
  186. transports[i] = transport
  187. dummyTransportMap[tag] = transport
  188. if server.Tag != "" {
  189. transportMap[server.Tag] = transport
  190. }
  191. strategy := dns.DomainStrategy(server.Strategy)
  192. if strategy != dns.DomainStrategyAsIS {
  193. transportDomainStrategy[transport] = strategy
  194. }
  195. }
  196. if len(transports) == len(dummyTransportMap) {
  197. break
  198. }
  199. if lastLen != len(dummyTransportMap) {
  200. continue
  201. }
  202. unresolvedTags := common.MapIndexed(common.FilterIndexed(dnsOptions.Servers, func(index int, server option.DNSServerOptions) bool {
  203. _, exists := dummyTransportMap[transportTags[index]]
  204. return !exists
  205. }), func(index int, server option.DNSServerOptions) string {
  206. return transportTags[index]
  207. })
  208. if len(unresolvedTags) == 0 {
  209. panic(F.ToString("unexpected unresolved dns servers: ", len(transports), " ", len(dummyTransportMap), " ", len(transportMap)))
  210. }
  211. return nil, E.New("found circular reference in dns servers: ", strings.Join(unresolvedTags, " "))
  212. }
  213. var defaultTransport dns.Transport
  214. if dnsOptions.Final != "" {
  215. defaultTransport = dummyTransportMap[dnsOptions.Final]
  216. if defaultTransport == nil {
  217. return nil, E.New("default dns server not found: ", dnsOptions.Final)
  218. }
  219. }
  220. if defaultTransport == nil {
  221. if len(transports) == 0 {
  222. transports = append(transports, dns.NewLocalTransport("local", N.SystemDialer))
  223. }
  224. defaultTransport = transports[0]
  225. }
  226. router.defaultTransport = defaultTransport
  227. router.transports = transports
  228. router.transportMap = transportMap
  229. router.transportDomainStrategy = transportDomainStrategy
  230. if dnsOptions.ReverseMapping {
  231. router.dnsReverseMapping = NewDNSReverseMapping()
  232. }
  233. if fakeIPOptions := dnsOptions.FakeIP; fakeIPOptions != nil && dnsOptions.FakeIP.Enabled {
  234. var inet4Range netip.Prefix
  235. var inet6Range netip.Prefix
  236. if fakeIPOptions.Inet4Range != nil {
  237. inet4Range = fakeIPOptions.Inet4Range.Build()
  238. }
  239. if fakeIPOptions.Inet6Range != nil {
  240. inet6Range = fakeIPOptions.Inet6Range.Build()
  241. }
  242. router.fakeIPStore = fakeip.NewStore(router, inet4Range, inet6Range)
  243. }
  244. usePlatformDefaultInterfaceMonitor := platformInterface != nil && platformInterface.UsePlatformDefaultInterfaceMonitor()
  245. needInterfaceMonitor := options.AutoDetectInterface || common.Any(inbounds, func(inbound option.Inbound) bool {
  246. return inbound.HTTPOptions.SetSystemProxy || inbound.MixedOptions.SetSystemProxy || inbound.TunOptions.AutoRoute
  247. })
  248. if needInterfaceMonitor {
  249. if !usePlatformDefaultInterfaceMonitor {
  250. networkMonitor, err := tun.NewNetworkUpdateMonitor(router)
  251. if err != os.ErrInvalid {
  252. if err != nil {
  253. return nil, err
  254. }
  255. router.networkMonitor = networkMonitor
  256. networkMonitor.RegisterCallback(router.interfaceFinder.update)
  257. interfaceMonitor, err := tun.NewDefaultInterfaceMonitor(router.networkMonitor, tun.DefaultInterfaceMonitorOptions{
  258. OverrideAndroidVPN: options.OverrideAndroidVPN,
  259. })
  260. if err != nil {
  261. return nil, E.New("auto_detect_interface unsupported on current platform")
  262. }
  263. interfaceMonitor.RegisterCallback(router.notifyNetworkUpdate)
  264. router.interfaceMonitor = interfaceMonitor
  265. }
  266. } else {
  267. interfaceMonitor := platformInterface.CreateDefaultInterfaceMonitor(router)
  268. interfaceMonitor.RegisterCallback(router.notifyNetworkUpdate)
  269. router.interfaceMonitor = interfaceMonitor
  270. }
  271. }
  272. needFindProcess := hasRule(options.Rules, isProcessRule) || hasDNSRule(dnsOptions.Rules, isProcessDNSRule) || options.FindProcess
  273. needPackageManager := C.IsAndroid && platformInterface == nil && (needFindProcess || common.Any(inbounds, func(inbound option.Inbound) bool {
  274. return len(inbound.TunOptions.IncludePackage) > 0 || len(inbound.TunOptions.ExcludePackage) > 0
  275. }))
  276. if needPackageManager {
  277. packageManager, err := tun.NewPackageManager(router)
  278. if err != nil {
  279. return nil, E.Cause(err, "create package manager")
  280. }
  281. router.packageManager = packageManager
  282. }
  283. if needFindProcess {
  284. if platformInterface != nil {
  285. router.processSearcher = platformInterface
  286. } else {
  287. searcher, err := process.NewSearcher(process.Config{
  288. Logger: logFactory.NewLogger("router/process"),
  289. PackageManager: router.packageManager,
  290. })
  291. if err != nil {
  292. if err != os.ErrInvalid {
  293. router.logger.Warn(E.Cause(err, "create process searcher"))
  294. }
  295. } else {
  296. router.processSearcher = searcher
  297. }
  298. }
  299. }
  300. if ntpOptions.Enabled {
  301. router.timeService = ntp.NewService(ctx, router, logFactory.NewLogger("ntp"), ntpOptions)
  302. }
  303. return router, nil
  304. }
  305. func (r *Router) Initialize(inbounds []adapter.Inbound, outbounds []adapter.Outbound, defaultOutbound func() adapter.Outbound) error {
  306. inboundByTag := make(map[string]adapter.Inbound)
  307. for _, inbound := range inbounds {
  308. inboundByTag[inbound.Tag()] = inbound
  309. }
  310. outboundByTag := make(map[string]adapter.Outbound)
  311. for _, detour := range outbounds {
  312. outboundByTag[detour.Tag()] = detour
  313. }
  314. var defaultOutboundForConnection adapter.Outbound
  315. var defaultOutboundForPacketConnection adapter.Outbound
  316. if r.defaultDetour != "" {
  317. detour, loaded := outboundByTag[r.defaultDetour]
  318. if !loaded {
  319. return E.New("default detour not found: ", r.defaultDetour)
  320. }
  321. if common.Contains(detour.Network(), N.NetworkTCP) {
  322. defaultOutboundForConnection = detour
  323. }
  324. if common.Contains(detour.Network(), N.NetworkUDP) {
  325. defaultOutboundForPacketConnection = detour
  326. }
  327. }
  328. var index, packetIndex int
  329. if defaultOutboundForConnection == nil {
  330. for i, detour := range outbounds {
  331. if common.Contains(detour.Network(), N.NetworkTCP) {
  332. index = i
  333. defaultOutboundForConnection = detour
  334. break
  335. }
  336. }
  337. }
  338. if defaultOutboundForPacketConnection == nil {
  339. for i, detour := range outbounds {
  340. if common.Contains(detour.Network(), N.NetworkUDP) {
  341. packetIndex = i
  342. defaultOutboundForPacketConnection = detour
  343. break
  344. }
  345. }
  346. }
  347. if defaultOutboundForConnection == nil || defaultOutboundForPacketConnection == nil {
  348. detour := defaultOutbound()
  349. if defaultOutboundForConnection == nil {
  350. defaultOutboundForConnection = detour
  351. }
  352. if defaultOutboundForPacketConnection == nil {
  353. defaultOutboundForPacketConnection = detour
  354. }
  355. outbounds = append(outbounds, detour)
  356. outboundByTag[detour.Tag()] = detour
  357. }
  358. if defaultOutboundForConnection != defaultOutboundForPacketConnection {
  359. var description string
  360. if defaultOutboundForConnection.Tag() != "" {
  361. description = defaultOutboundForConnection.Tag()
  362. } else {
  363. description = F.ToString(index)
  364. }
  365. var packetDescription string
  366. if defaultOutboundForPacketConnection.Tag() != "" {
  367. packetDescription = defaultOutboundForPacketConnection.Tag()
  368. } else {
  369. packetDescription = F.ToString(packetIndex)
  370. }
  371. r.logger.Info("using ", defaultOutboundForConnection.Type(), "[", description, "] as default outbound for connection")
  372. r.logger.Info("using ", defaultOutboundForPacketConnection.Type(), "[", packetDescription, "] as default outbound for packet connection")
  373. }
  374. r.inboundByTag = inboundByTag
  375. r.outbounds = outbounds
  376. r.defaultOutboundForConnection = defaultOutboundForConnection
  377. r.defaultOutboundForPacketConnection = defaultOutboundForPacketConnection
  378. r.outboundByTag = outboundByTag
  379. for i, rule := range r.rules {
  380. if _, loaded := outboundByTag[rule.Outbound()]; !loaded {
  381. return E.New("outbound not found for rule[", i, "]: ", rule.Outbound())
  382. }
  383. }
  384. return nil
  385. }
  386. func (r *Router) Outbounds() []adapter.Outbound {
  387. return r.outbounds
  388. }
  389. func (r *Router) Start() error {
  390. if r.needGeoIPDatabase {
  391. err := r.prepareGeoIPDatabase()
  392. if err != nil {
  393. return err
  394. }
  395. }
  396. if r.needGeositeDatabase {
  397. err := r.prepareGeositeDatabase()
  398. if err != nil {
  399. return err
  400. }
  401. }
  402. if r.interfaceMonitor != nil {
  403. err := r.interfaceMonitor.Start()
  404. if err != nil {
  405. return err
  406. }
  407. }
  408. if r.networkMonitor != nil {
  409. err := r.networkMonitor.Start()
  410. if err != nil {
  411. return err
  412. }
  413. }
  414. if r.packageManager != nil {
  415. err := r.packageManager.Start()
  416. if err != nil {
  417. return err
  418. }
  419. }
  420. if r.needGeositeDatabase {
  421. for _, rule := range r.rules {
  422. err := rule.UpdateGeosite()
  423. if err != nil {
  424. r.logger.Error("failed to initialize geosite: ", err)
  425. }
  426. }
  427. for _, rule := range r.dnsRules {
  428. err := rule.UpdateGeosite()
  429. if err != nil {
  430. r.logger.Error("failed to initialize geosite: ", err)
  431. }
  432. }
  433. err := common.Close(r.geositeReader)
  434. if err != nil {
  435. return err
  436. }
  437. r.geositeCache = nil
  438. r.geositeReader = nil
  439. }
  440. for i, rule := range r.rules {
  441. err := rule.Start()
  442. if err != nil {
  443. return E.Cause(err, "initialize rule[", i, "]")
  444. }
  445. }
  446. for i, rule := range r.dnsRules {
  447. err := rule.Start()
  448. if err != nil {
  449. return E.Cause(err, "initialize DNS rule[", i, "]")
  450. }
  451. }
  452. if r.fakeIPStore != nil {
  453. err := r.fakeIPStore.Start()
  454. if err != nil {
  455. return err
  456. }
  457. }
  458. for i, transport := range r.transports {
  459. err := transport.Start()
  460. if err != nil {
  461. return E.Cause(err, "initialize DNS server[", i, "]")
  462. }
  463. }
  464. if r.timeService != nil {
  465. err := r.timeService.Start()
  466. if err != nil {
  467. return E.Cause(err, "initialize time service")
  468. }
  469. }
  470. return nil
  471. }
  472. func (r *Router) Close() error {
  473. var err error
  474. for i, rule := range r.rules {
  475. r.logger.Trace("closing rule[", i, "]")
  476. err = E.Append(err, rule.Close(), func(err error) error {
  477. return E.Cause(err, "close rule[", i, "]")
  478. })
  479. }
  480. for i, rule := range r.dnsRules {
  481. r.logger.Trace("closing dns rule[", i, "]")
  482. err = E.Append(err, rule.Close(), func(err error) error {
  483. return E.Cause(err, "close dns rule[", i, "]")
  484. })
  485. }
  486. for i, transport := range r.transports {
  487. r.logger.Trace("closing transport[", i, "] ")
  488. err = E.Append(err, transport.Close(), func(err error) error {
  489. return E.Cause(err, "close dns transport[", i, "]")
  490. })
  491. }
  492. if r.geositeReader != nil {
  493. r.logger.Trace("closing geoip reader")
  494. err = E.Append(err, common.Close(r.geoIPReader), func(err error) error {
  495. return E.Cause(err, "close geoip reader")
  496. })
  497. }
  498. if r.interfaceMonitor != nil {
  499. r.logger.Trace("closing interface monitor")
  500. err = E.Append(err, r.interfaceMonitor.Close(), func(err error) error {
  501. return E.Cause(err, "close interface monitor")
  502. })
  503. }
  504. if r.networkMonitor != nil {
  505. r.logger.Trace("closing network monitor")
  506. err = E.Append(err, r.networkMonitor.Close(), func(err error) error {
  507. return E.Cause(err, "close network monitor")
  508. })
  509. }
  510. if r.packageManager != nil {
  511. r.logger.Trace("closing package manager")
  512. err = E.Append(err, r.packageManager.Close(), func(err error) error {
  513. return E.Cause(err, "close package manager")
  514. })
  515. }
  516. if r.timeService != nil {
  517. r.logger.Trace("closing time service")
  518. err = E.Append(err, r.timeService.Close(), func(err error) error {
  519. return E.Cause(err, "close time service")
  520. })
  521. }
  522. if r.fakeIPStore != nil {
  523. r.logger.Trace("closing fakeip store")
  524. err = E.Append(err, r.fakeIPStore.Close(), func(err error) error {
  525. return E.Cause(err, "close fakeip store")
  526. })
  527. }
  528. return err
  529. }
  530. func (r *Router) Outbound(tag string) (adapter.Outbound, bool) {
  531. outbound, loaded := r.outboundByTag[tag]
  532. return outbound, loaded
  533. }
  534. func (r *Router) DefaultOutbound(network string) adapter.Outbound {
  535. if network == N.NetworkTCP {
  536. return r.defaultOutboundForConnection
  537. } else {
  538. return r.defaultOutboundForPacketConnection
  539. }
  540. }
  541. func (r *Router) FakeIPStore() adapter.FakeIPStore {
  542. return r.fakeIPStore
  543. }
  544. func (r *Router) RouteConnection(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) error {
  545. if metadata.InboundDetour != "" {
  546. if metadata.LastInbound == metadata.InboundDetour {
  547. return E.New("routing loop on detour: ", metadata.InboundDetour)
  548. }
  549. detour := r.inboundByTag[metadata.InboundDetour]
  550. if detour == nil {
  551. return E.New("inbound detour not found: ", metadata.InboundDetour)
  552. }
  553. injectable, isInjectable := detour.(adapter.InjectableInbound)
  554. if !isInjectable {
  555. return E.New("inbound detour is not injectable: ", metadata.InboundDetour)
  556. }
  557. if !common.Contains(injectable.Network(), N.NetworkTCP) {
  558. return E.New("inject: TCP unsupported")
  559. }
  560. metadata.LastInbound = metadata.Inbound
  561. metadata.Inbound = metadata.InboundDetour
  562. metadata.InboundDetour = ""
  563. err := injectable.NewConnection(ctx, conn, metadata)
  564. if err != nil {
  565. return E.Cause(err, "inject ", detour.Tag())
  566. }
  567. return nil
  568. }
  569. metadata.Network = N.NetworkTCP
  570. switch metadata.Destination.Fqdn {
  571. case mux.Destination.Fqdn:
  572. r.logger.InfoContext(ctx, "inbound multiplex connection")
  573. return mux.NewConnection(ctx, r, r, r.logger, conn, metadata)
  574. case vmess.MuxDestination.Fqdn:
  575. r.logger.InfoContext(ctx, "inbound legacy multiplex connection")
  576. return vmess.HandleMuxConnection(ctx, conn, adapter.NewUpstreamHandler(metadata, r.RouteConnection, r.RoutePacketConnection, r))
  577. case uot.MagicAddress:
  578. request, err := uot.ReadRequest(conn)
  579. if err != nil {
  580. return E.Cause(err, "read UoT request")
  581. }
  582. if request.IsConnect {
  583. r.logger.InfoContext(ctx, "inbound UoT connect connection to ", request.Destination)
  584. } else {
  585. r.logger.InfoContext(ctx, "inbound UoT connection to ", request.Destination)
  586. }
  587. metadata.Domain = metadata.Destination.Fqdn
  588. metadata.Destination = request.Destination
  589. return r.RoutePacketConnection(ctx, uot.NewConn(conn, *request), metadata)
  590. case uot.LegacyMagicAddress:
  591. r.logger.InfoContext(ctx, "inbound legacy UoT connection")
  592. metadata.Domain = metadata.Destination.Fqdn
  593. metadata.Destination = M.Socksaddr{Addr: netip.IPv4Unspecified()}
  594. return r.RoutePacketConnection(ctx, uot.NewConn(conn, uot.Request{}), metadata)
  595. }
  596. if r.fakeIPStore != nil && r.fakeIPStore.Contains(metadata.Destination.Addr) {
  597. domain, loaded := r.fakeIPStore.Lookup(metadata.Destination.Addr)
  598. if !loaded {
  599. return E.New("missing fakeip context")
  600. }
  601. metadata.Destination = M.Socksaddr{
  602. Fqdn: domain,
  603. Port: metadata.Destination.Port,
  604. }
  605. r.logger.DebugContext(ctx, "found fakeip domain: ", domain)
  606. }
  607. if deadline.NeedAdditionalReadDeadline(conn) {
  608. conn = deadline.NewConn(conn)
  609. }
  610. if metadata.InboundOptions.SniffEnabled {
  611. buffer := buf.NewPacket()
  612. buffer.FullReset()
  613. sniffMetadata, err := sniff.PeekStream(ctx, conn, buffer, time.Duration(metadata.InboundOptions.SniffTimeout), sniff.StreamDomainNameQuery, sniff.TLSClientHello, sniff.HTTPHost)
  614. if sniffMetadata != nil {
  615. metadata.Protocol = sniffMetadata.Protocol
  616. metadata.Domain = sniffMetadata.Domain
  617. if metadata.InboundOptions.SniffOverrideDestination && M.IsDomainName(metadata.Domain) {
  618. metadata.Destination = M.Socksaddr{
  619. Fqdn: metadata.Domain,
  620. Port: metadata.Destination.Port,
  621. }
  622. }
  623. if metadata.Domain != "" {
  624. r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol, ", domain: ", metadata.Domain)
  625. } else {
  626. r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol)
  627. }
  628. } else if err != nil {
  629. r.logger.TraceContext(ctx, "sniffed no protocol: ", err)
  630. }
  631. if !buffer.IsEmpty() {
  632. conn = bufio.NewCachedConn(conn, buffer)
  633. } else {
  634. buffer.Release()
  635. }
  636. }
  637. if r.dnsReverseMapping != nil && metadata.Domain == "" {
  638. domain, loaded := r.dnsReverseMapping.Query(metadata.Destination.Addr)
  639. if loaded {
  640. metadata.Domain = domain
  641. r.logger.DebugContext(ctx, "found reserve mapped domain: ", metadata.Domain)
  642. }
  643. }
  644. if metadata.Destination.IsFqdn() && dns.DomainStrategy(metadata.InboundOptions.DomainStrategy) != dns.DomainStrategyAsIS {
  645. addresses, err := r.Lookup(adapter.WithContext(ctx, &metadata), metadata.Destination.Fqdn, dns.DomainStrategy(metadata.InboundOptions.DomainStrategy))
  646. if err != nil {
  647. return err
  648. }
  649. metadata.DestinationAddresses = addresses
  650. r.dnsLogger.DebugContext(ctx, "resolved [", strings.Join(F.MapToString(metadata.DestinationAddresses), " "), "]")
  651. }
  652. ctx, matchedRule, detour, err := r.match(ctx, &metadata, r.defaultOutboundForConnection)
  653. if err != nil {
  654. return err
  655. }
  656. if !common.Contains(detour.Network(), N.NetworkTCP) {
  657. return E.New("missing supported outbound, closing connection")
  658. }
  659. if r.clashServer != nil {
  660. trackerConn, tracker := r.clashServer.RoutedConnection(ctx, conn, metadata, matchedRule)
  661. defer tracker.Leave()
  662. conn = trackerConn
  663. }
  664. if r.v2rayServer != nil {
  665. if statsService := r.v2rayServer.StatsService(); statsService != nil {
  666. conn = statsService.RoutedConnection(metadata.Inbound, detour.Tag(), metadata.User, conn)
  667. }
  668. }
  669. return detour.NewConnection(ctx, conn, metadata)
  670. }
  671. func (r *Router) RoutePacketConnection(ctx context.Context, conn N.PacketConn, metadata adapter.InboundContext) error {
  672. if metadata.InboundDetour != "" {
  673. if metadata.LastInbound == metadata.InboundDetour {
  674. return E.New("routing loop on detour: ", metadata.InboundDetour)
  675. }
  676. detour := r.inboundByTag[metadata.InboundDetour]
  677. if detour == nil {
  678. return E.New("inbound detour not found: ", metadata.InboundDetour)
  679. }
  680. injectable, isInjectable := detour.(adapter.InjectableInbound)
  681. if !isInjectable {
  682. return E.New("inbound detour is not injectable: ", metadata.InboundDetour)
  683. }
  684. if !common.Contains(injectable.Network(), N.NetworkUDP) {
  685. return E.New("inject: UDP unsupported")
  686. }
  687. metadata.LastInbound = metadata.Inbound
  688. metadata.Inbound = metadata.InboundDetour
  689. metadata.InboundDetour = ""
  690. err := injectable.NewPacketConnection(ctx, conn, metadata)
  691. if err != nil {
  692. return E.Cause(err, "inject ", detour.Tag())
  693. }
  694. return nil
  695. }
  696. metadata.Network = N.NetworkUDP
  697. var originAddress M.Socksaddr
  698. if r.fakeIPStore != nil && r.fakeIPStore.Contains(metadata.Destination.Addr) {
  699. domain, loaded := r.fakeIPStore.Lookup(metadata.Destination.Addr)
  700. if !loaded {
  701. return E.New("missing fakeip context")
  702. }
  703. originAddress = metadata.Destination
  704. metadata.Destination = M.Socksaddr{
  705. Fqdn: domain,
  706. Port: metadata.Destination.Port,
  707. }
  708. r.logger.DebugContext(ctx, "found fakeip domain: ", domain)
  709. }
  710. // Currently we don't have deadline usages for UDP connections
  711. /*if deadline.NeedAdditionalReadDeadline(conn) {
  712. conn = deadline.NewPacketConn(bufio.NewNetPacketConn(conn))
  713. }*/
  714. if metadata.InboundOptions.SniffEnabled {
  715. buffer := buf.NewPacket()
  716. buffer.FullReset()
  717. destination, err := conn.ReadPacket(buffer)
  718. if err != nil {
  719. buffer.Release()
  720. return err
  721. }
  722. sniffMetadata, _ := sniff.PeekPacket(ctx, buffer.Bytes(), sniff.DomainNameQuery, sniff.QUICClientHello, sniff.STUNMessage)
  723. if sniffMetadata != nil {
  724. metadata.Protocol = sniffMetadata.Protocol
  725. metadata.Domain = sniffMetadata.Domain
  726. if metadata.InboundOptions.SniffOverrideDestination && M.IsDomainName(metadata.Domain) {
  727. metadata.Destination = M.Socksaddr{
  728. Fqdn: metadata.Domain,
  729. Port: metadata.Destination.Port,
  730. }
  731. }
  732. if metadata.Domain != "" {
  733. r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol, ", domain: ", metadata.Domain)
  734. } else {
  735. r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol)
  736. }
  737. }
  738. conn = bufio.NewCachedPacketConn(conn, buffer, destination)
  739. }
  740. if r.dnsReverseMapping != nil && metadata.Domain == "" {
  741. domain, loaded := r.dnsReverseMapping.Query(metadata.Destination.Addr)
  742. if loaded {
  743. metadata.Domain = domain
  744. r.logger.DebugContext(ctx, "found reserve mapped domain: ", metadata.Domain)
  745. }
  746. }
  747. if metadata.Destination.IsFqdn() && dns.DomainStrategy(metadata.InboundOptions.DomainStrategy) != dns.DomainStrategyAsIS {
  748. addresses, err := r.Lookup(adapter.WithContext(ctx, &metadata), metadata.Destination.Fqdn, dns.DomainStrategy(metadata.InboundOptions.DomainStrategy))
  749. if err != nil {
  750. return err
  751. }
  752. metadata.DestinationAddresses = addresses
  753. r.dnsLogger.DebugContext(ctx, "resolved [", strings.Join(F.MapToString(metadata.DestinationAddresses), " "), "]")
  754. }
  755. ctx, matchedRule, detour, err := r.match(ctx, &metadata, r.defaultOutboundForPacketConnection)
  756. if err != nil {
  757. return err
  758. }
  759. if !common.Contains(detour.Network(), N.NetworkUDP) {
  760. return E.New("missing supported outbound, closing packet connection")
  761. }
  762. if r.clashServer != nil {
  763. trackerConn, tracker := r.clashServer.RoutedPacketConnection(ctx, conn, metadata, matchedRule)
  764. defer tracker.Leave()
  765. conn = trackerConn
  766. }
  767. if r.v2rayServer != nil {
  768. if statsService := r.v2rayServer.StatsService(); statsService != nil {
  769. conn = statsService.RoutedPacketConnection(metadata.Inbound, detour.Tag(), metadata.User, conn)
  770. }
  771. }
  772. if originAddress.IsValid() {
  773. conn = fakeip.NewNATPacketConn(conn, originAddress, metadata.Destination)
  774. }
  775. return detour.NewPacketConnection(ctx, conn, metadata)
  776. }
  777. func (r *Router) match(ctx context.Context, metadata *adapter.InboundContext, defaultOutbound adapter.Outbound) (context.Context, adapter.Rule, adapter.Outbound, error) {
  778. matchRule, matchOutbound := r.match0(ctx, metadata, defaultOutbound)
  779. if contextOutbound, loaded := outbound.TagFromContext(ctx); loaded {
  780. if contextOutbound == matchOutbound.Tag() {
  781. return nil, nil, nil, E.New("connection loopback in outbound/", matchOutbound.Type(), "[", matchOutbound.Tag(), "]")
  782. }
  783. }
  784. ctx = outbound.ContextWithTag(ctx, matchOutbound.Tag())
  785. return ctx, matchRule, matchOutbound, nil
  786. }
  787. func (r *Router) match0(ctx context.Context, metadata *adapter.InboundContext, defaultOutbound adapter.Outbound) (adapter.Rule, adapter.Outbound) {
  788. if r.processSearcher != nil {
  789. var originDestination netip.AddrPort
  790. if metadata.OriginDestination.IsValid() {
  791. originDestination = metadata.OriginDestination.AddrPort()
  792. } else if metadata.Destination.IsIP() {
  793. originDestination = metadata.Destination.AddrPort()
  794. }
  795. processInfo, err := process.FindProcessInfo(r.processSearcher, ctx, metadata.Network, metadata.Source.AddrPort(), originDestination)
  796. if err != nil {
  797. r.logger.InfoContext(ctx, "failed to search process: ", err)
  798. } else {
  799. if processInfo.ProcessPath != "" {
  800. r.logger.InfoContext(ctx, "found process path: ", processInfo.ProcessPath)
  801. } else if processInfo.PackageName != "" {
  802. r.logger.InfoContext(ctx, "found package name: ", processInfo.PackageName)
  803. } else if processInfo.UserId != -1 {
  804. if /*needUserName &&*/ true {
  805. osUser, _ := user.LookupId(F.ToString(processInfo.UserId))
  806. if osUser != nil {
  807. processInfo.User = osUser.Username
  808. }
  809. }
  810. if processInfo.User != "" {
  811. r.logger.InfoContext(ctx, "found user: ", processInfo.User)
  812. } else {
  813. r.logger.InfoContext(ctx, "found user id: ", processInfo.UserId)
  814. }
  815. }
  816. metadata.ProcessInfo = processInfo
  817. }
  818. }
  819. for i, rule := range r.rules {
  820. if rule.Match(metadata) {
  821. detour := rule.Outbound()
  822. r.logger.DebugContext(ctx, "match[", i, "] ", rule.String(), " => ", detour)
  823. if outbound, loaded := r.Outbound(detour); loaded {
  824. return rule, outbound
  825. }
  826. r.logger.ErrorContext(ctx, "outbound not found: ", detour)
  827. }
  828. }
  829. return nil, defaultOutbound
  830. }
  831. func (r *Router) InterfaceFinder() control.InterfaceFinder {
  832. return &r.interfaceFinder
  833. }
  834. func (r *Router) UpdateInterfaces() error {
  835. if r.platformInterface == nil || !r.platformInterface.UsePlatformInterfaceGetter() {
  836. return r.interfaceFinder.update()
  837. } else {
  838. interfaces, err := r.platformInterface.Interfaces()
  839. if err != nil {
  840. return err
  841. }
  842. r.interfaceFinder.updateInterfaces(common.Map(interfaces, func(it platform.NetworkInterface) net.Interface {
  843. return net.Interface{
  844. Name: it.Name,
  845. Index: it.Index,
  846. MTU: it.MTU,
  847. }
  848. }))
  849. return nil
  850. }
  851. }
  852. func (r *Router) AutoDetectInterface() bool {
  853. return r.autoDetectInterface
  854. }
  855. func (r *Router) AutoDetectInterfaceFunc() control.Func {
  856. if r.platformInterface != nil && r.platformInterface.UsePlatformAutoDetectInterfaceControl() {
  857. return r.platformInterface.AutoDetectInterfaceControl()
  858. } else {
  859. return control.BindToInterfaceFunc(r.InterfaceFinder(), func(network string, address string) (interfaceName string, interfaceIndex int) {
  860. remoteAddr := M.ParseSocksaddr(address).Addr
  861. if C.IsLinux {
  862. return r.InterfaceMonitor().DefaultInterfaceName(remoteAddr), -1
  863. } else {
  864. return "", r.InterfaceMonitor().DefaultInterfaceIndex(remoteAddr)
  865. }
  866. })
  867. }
  868. }
  869. func (r *Router) DefaultInterface() string {
  870. return r.defaultInterface
  871. }
  872. func (r *Router) DefaultMark() int {
  873. return r.defaultMark
  874. }
  875. func (r *Router) Rules() []adapter.Rule {
  876. return r.rules
  877. }
  878. func (r *Router) NetworkMonitor() tun.NetworkUpdateMonitor {
  879. return r.networkMonitor
  880. }
  881. func (r *Router) InterfaceMonitor() tun.DefaultInterfaceMonitor {
  882. return r.interfaceMonitor
  883. }
  884. func (r *Router) PackageManager() tun.PackageManager {
  885. return r.packageManager
  886. }
  887. func (r *Router) TimeFunc() func() time.Time {
  888. if r.timeService == nil {
  889. return nil
  890. }
  891. return r.timeService.TimeFunc()
  892. }
  893. func (r *Router) ClashServer() adapter.ClashServer {
  894. return r.clashServer
  895. }
  896. func (r *Router) SetClashServer(server adapter.ClashServer) {
  897. r.clashServer = server
  898. }
  899. func (r *Router) V2RayServer() adapter.V2RayServer {
  900. return r.v2rayServer
  901. }
  902. func (r *Router) SetV2RayServer(server adapter.V2RayServer) {
  903. r.v2rayServer = server
  904. }
  905. func (r *Router) OnPackagesUpdated(packages int, sharedUsers int) {
  906. r.logger.Info("updated packages list: ", packages, " packages, ", sharedUsers, " shared users")
  907. }
  908. func (r *Router) NewError(ctx context.Context, err error) {
  909. common.Close(err)
  910. if E.IsClosedOrCanceled(err) {
  911. r.logger.DebugContext(ctx, "connection closed: ", err)
  912. return
  913. }
  914. r.logger.ErrorContext(ctx, err)
  915. }
  916. func (r *Router) notifyNetworkUpdate(int) error {
  917. if C.IsAndroid && r.platformInterface == nil {
  918. var vpnStatus string
  919. if r.interfaceMonitor.AndroidVPNEnabled() {
  920. vpnStatus = "enabled"
  921. } else {
  922. vpnStatus = "disabled"
  923. }
  924. r.logger.Info("updated default interface ", r.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", r.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()), ", vpn ", vpnStatus)
  925. } else {
  926. r.logger.Info("updated default interface ", r.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", r.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()))
  927. }
  928. conntrack.Close()
  929. for _, outbound := range r.outbounds {
  930. listener, isListener := outbound.(adapter.InterfaceUpdateListener)
  931. if isListener {
  932. err := listener.InterfaceUpdated()
  933. if err != nil {
  934. return err
  935. }
  936. }
  937. }
  938. return nil
  939. }
  940. func (r *Router) ResetNetwork() error {
  941. conntrack.Close()
  942. for _, outbound := range r.outbounds {
  943. listener, isListener := outbound.(adapter.InterfaceUpdateListener)
  944. if isListener {
  945. err := listener.InterfaceUpdated()
  946. if err != nil {
  947. return err
  948. }
  949. }
  950. }
  951. return nil
  952. }