router.go 33 KB

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