router.go 33 KB

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