router.go 32 KB

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