router.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  1. package route
  2. import (
  3. "context"
  4. "io"
  5. "net"
  6. "net/http"
  7. "net/netip"
  8. "net/url"
  9. "os"
  10. "path/filepath"
  11. "reflect"
  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/sniff"
  19. C "github.com/sagernet/sing-box/constant"
  20. "github.com/sagernet/sing-box/log"
  21. "github.com/sagernet/sing-box/option"
  22. "github.com/sagernet/sing-dns"
  23. "github.com/sagernet/sing/common"
  24. "github.com/sagernet/sing/common/buf"
  25. "github.com/sagernet/sing/common/bufio"
  26. "github.com/sagernet/sing/common/control"
  27. E "github.com/sagernet/sing/common/exceptions"
  28. F "github.com/sagernet/sing/common/format"
  29. M "github.com/sagernet/sing/common/metadata"
  30. N "github.com/sagernet/sing/common/network"
  31. "github.com/sagernet/sing/common/rw"
  32. "golang.org/x/net/dns/dnsmessage"
  33. )
  34. var _ adapter.Router = (*Router)(nil)
  35. type Router struct {
  36. ctx context.Context
  37. logger log.ContextLogger
  38. dnsLogger log.ContextLogger
  39. outboundByTag map[string]adapter.Outbound
  40. rules []adapter.Rule
  41. defaultDetour string
  42. defaultOutboundForConnection adapter.Outbound
  43. defaultOutboundForPacketConnection adapter.Outbound
  44. needGeoIPDatabase bool
  45. needGeositeDatabase bool
  46. geoIPOptions option.GeoIPOptions
  47. geositeOptions option.GeositeOptions
  48. geoIPReader *geoip.Reader
  49. geositeReader *geosite.Reader
  50. geositeCache map[string]adapter.Rule
  51. dnsClient *dns.Client
  52. defaultDomainStrategy dns.DomainStrategy
  53. dnsRules []adapter.Rule
  54. defaultTransport dns.Transport
  55. transports []dns.Transport
  56. transportMap map[string]dns.Transport
  57. interfaceBindManager control.BindManager
  58. networkMonitor NetworkUpdateMonitor
  59. autoDetectInterface bool
  60. defaultInterface string
  61. interfaceMonitor DefaultInterfaceMonitor
  62. trafficController adapter.TrafficController
  63. }
  64. func NewRouter(ctx context.Context, logger log.ContextLogger, dnsLogger log.ContextLogger, options option.RouteOptions, dnsOptions option.DNSOptions) (*Router, error) {
  65. router := &Router{
  66. ctx: ctx,
  67. logger: logger,
  68. dnsLogger: dnsLogger,
  69. outboundByTag: make(map[string]adapter.Outbound),
  70. rules: make([]adapter.Rule, 0, len(options.Rules)),
  71. dnsRules: make([]adapter.Rule, 0, len(dnsOptions.Rules)),
  72. needGeoIPDatabase: hasGeoRule(options.Rules, isGeoIPRule) || hasGeoDNSRule(dnsOptions.Rules, isGeoIPDNSRule),
  73. needGeositeDatabase: hasGeoRule(options.Rules, isGeositeRule) || hasGeoDNSRule(dnsOptions.Rules, isGeositeDNSRule),
  74. geoIPOptions: common.PtrValueOrDefault(options.GeoIP),
  75. geositeOptions: common.PtrValueOrDefault(options.Geosite),
  76. geositeCache: make(map[string]adapter.Rule),
  77. defaultDetour: options.Final,
  78. dnsClient: dns.NewClient(dns.DomainStrategy(dnsOptions.DNSClientOptions.Strategy), dnsOptions.DNSClientOptions.DisableCache, dnsOptions.DNSClientOptions.DisableExpire),
  79. defaultDomainStrategy: dns.DomainStrategy(dnsOptions.Strategy),
  80. interfaceBindManager: control.NewBindManager(),
  81. autoDetectInterface: options.AutoDetectInterface,
  82. defaultInterface: options.DefaultInterface,
  83. }
  84. for i, ruleOptions := range options.Rules {
  85. routeRule, err := NewRule(router, logger, ruleOptions)
  86. if err != nil {
  87. return nil, E.Cause(err, "parse rule[", i, "]")
  88. }
  89. router.rules = append(router.rules, routeRule)
  90. }
  91. for i, dnsRuleOptions := range dnsOptions.Rules {
  92. dnsRule, err := NewDNSRule(router, logger, dnsRuleOptions)
  93. if err != nil {
  94. return nil, E.Cause(err, "parse dns rule[", i, "]")
  95. }
  96. router.dnsRules = append(router.dnsRules, dnsRule)
  97. }
  98. transports := make([]dns.Transport, len(dnsOptions.Servers))
  99. dummyTransportMap := make(map[string]dns.Transport)
  100. transportMap := make(map[string]dns.Transport)
  101. transportTags := make([]string, len(dnsOptions.Servers))
  102. transportTagMap := make(map[string]bool)
  103. for i, server := range dnsOptions.Servers {
  104. var tag string
  105. if server.Tag != "" {
  106. tag = server.Tag
  107. } else {
  108. tag = F.ToString(i)
  109. }
  110. transportTags[i] = tag
  111. transportTagMap[tag] = true
  112. }
  113. for {
  114. lastLen := len(dummyTransportMap)
  115. for i, server := range dnsOptions.Servers {
  116. tag := transportTags[i]
  117. if _, exists := dummyTransportMap[tag]; exists {
  118. continue
  119. }
  120. var detour N.Dialer
  121. if server.Detour == "" {
  122. detour = dialer.NewRouter(router)
  123. } else {
  124. detour = dialer.NewDetour(router, server.Detour)
  125. }
  126. if server.Address != "local" {
  127. serverURL, err := url.Parse(server.Address)
  128. if err != nil {
  129. return nil, err
  130. }
  131. serverAddress := serverURL.Hostname()
  132. if serverAddress == "" {
  133. serverAddress = server.Address
  134. }
  135. _, notIpAddress := netip.ParseAddr(serverAddress)
  136. if server.AddressResolver != "" {
  137. if !transportTagMap[server.AddressResolver] {
  138. return nil, E.New("parse dns server[", tag, "]: address resolver not found: ", server.AddressResolver)
  139. }
  140. if upstream, exists := dummyTransportMap[server.AddressResolver]; exists {
  141. detour = dns.NewDialerWrapper(detour, router.dnsClient, upstream, dns.DomainStrategy(server.AddressStrategy), time.Duration(server.AddressFallbackDelay))
  142. } else {
  143. continue
  144. }
  145. } else if notIpAddress != nil {
  146. return nil, E.New("parse dns server[", tag, "]: missing address_resolver")
  147. }
  148. }
  149. transport, err := dns.NewTransport(ctx, detour, server.Address)
  150. if err != nil {
  151. return nil, E.Cause(err, "parse dns server[", tag, "]")
  152. }
  153. transports[i] = transport
  154. dummyTransportMap[tag] = transport
  155. if server.Tag != "" {
  156. transportMap[server.Tag] = transport
  157. }
  158. }
  159. if len(transports) == len(dummyTransportMap) {
  160. break
  161. }
  162. if lastLen != len(dummyTransportMap) {
  163. continue
  164. }
  165. unresolvedTags := common.MapIndexed(common.FilterIndexed(dnsOptions.Servers, func(index int, server option.DNSServerOptions) bool {
  166. _, exists := dummyTransportMap[transportTags[index]]
  167. return !exists
  168. }), func(index int, server option.DNSServerOptions) string {
  169. return transportTags[index]
  170. })
  171. return nil, E.New("found circular reference in dns servers: ", strings.Join(unresolvedTags, " "))
  172. }
  173. var defaultTransport dns.Transport
  174. if dnsOptions.Final != "" {
  175. defaultTransport = dummyTransportMap[options.Final]
  176. if defaultTransport == nil {
  177. return nil, E.New("default dns server not found: ", options.Final)
  178. }
  179. }
  180. if defaultTransport == nil {
  181. if len(transports) == 0 {
  182. transports = append(transports, dns.NewLocalTransport())
  183. }
  184. defaultTransport = transports[0]
  185. }
  186. router.defaultTransport = defaultTransport
  187. router.transports = transports
  188. router.transportMap = transportMap
  189. if router.interfaceBindManager != nil || options.AutoDetectInterface {
  190. networkMonitor, err := NewNetworkUpdateMonitor(router)
  191. if err == nil {
  192. router.networkMonitor = networkMonitor
  193. if router.interfaceBindManager != nil {
  194. networkMonitor.RegisterCallback(router.interfaceBindManager.Update)
  195. }
  196. }
  197. }
  198. if router.networkMonitor != nil && options.AutoDetectInterface {
  199. interfaceMonitor, err := NewDefaultInterfaceMonitor(router.networkMonitor, func() {
  200. router.logger.Info("updated default interface ", router.interfaceMonitor.DefaultInterfaceName(), ", index ", router.interfaceMonitor.DefaultInterfaceIndex())
  201. })
  202. if err != nil {
  203. return nil, E.New("auto_detect_interface unsupported on current platform")
  204. }
  205. router.interfaceMonitor = interfaceMonitor
  206. }
  207. return router, nil
  208. }
  209. func (r *Router) Initialize(outbounds []adapter.Outbound, defaultOutbound func() adapter.Outbound) error {
  210. outboundByTag := make(map[string]adapter.Outbound)
  211. for _, detour := range outbounds {
  212. outboundByTag[detour.Tag()] = detour
  213. }
  214. var defaultOutboundForConnection adapter.Outbound
  215. var defaultOutboundForPacketConnection adapter.Outbound
  216. if r.defaultDetour != "" {
  217. detour, loaded := outboundByTag[r.defaultDetour]
  218. if !loaded {
  219. return E.New("default detour not found: ", r.defaultDetour)
  220. }
  221. if common.Contains(detour.Network(), C.NetworkTCP) {
  222. defaultOutboundForConnection = detour
  223. }
  224. if common.Contains(detour.Network(), C.NetworkUDP) {
  225. defaultOutboundForPacketConnection = detour
  226. }
  227. }
  228. var index, packetIndex int
  229. if defaultOutboundForConnection == nil {
  230. for i, detour := range outbounds {
  231. if common.Contains(detour.Network(), C.NetworkTCP) {
  232. index = i
  233. defaultOutboundForConnection = detour
  234. break
  235. }
  236. }
  237. }
  238. if defaultOutboundForPacketConnection == nil {
  239. for i, detour := range outbounds {
  240. if common.Contains(detour.Network(), C.NetworkUDP) {
  241. packetIndex = i
  242. defaultOutboundForPacketConnection = detour
  243. break
  244. }
  245. }
  246. }
  247. if defaultOutboundForConnection == nil || defaultOutboundForPacketConnection == nil {
  248. detour := defaultOutbound()
  249. if defaultOutboundForConnection == nil {
  250. defaultOutboundForConnection = detour
  251. }
  252. if defaultOutboundForPacketConnection == nil {
  253. defaultOutboundForPacketConnection = detour
  254. }
  255. }
  256. if defaultOutboundForConnection != defaultOutboundForPacketConnection {
  257. var description string
  258. if defaultOutboundForConnection.Tag() != "" {
  259. description = defaultOutboundForConnection.Tag()
  260. } else {
  261. description = F.ToString(index)
  262. }
  263. var packetDescription string
  264. if defaultOutboundForPacketConnection.Tag() != "" {
  265. packetDescription = defaultOutboundForPacketConnection.Tag()
  266. } else {
  267. packetDescription = F.ToString(packetIndex)
  268. }
  269. r.logger.Info("using ", defaultOutboundForConnection.Type(), "[", description, "] as default outbound for connection")
  270. r.logger.Info("using ", defaultOutboundForPacketConnection.Type(), "[", packetDescription, "] as default outbound for packet connection")
  271. }
  272. r.defaultOutboundForConnection = defaultOutboundForConnection
  273. r.defaultOutboundForPacketConnection = defaultOutboundForPacketConnection
  274. r.outboundByTag = outboundByTag
  275. for i, rule := range r.rules {
  276. if _, loaded := outboundByTag[rule.Outbound()]; !loaded {
  277. return E.New("outbound not found for rule[", i, "]: ", rule.Outbound())
  278. }
  279. }
  280. return nil
  281. }
  282. func (r *Router) Start() error {
  283. if r.needGeoIPDatabase {
  284. err := r.prepareGeoIPDatabase()
  285. if err != nil {
  286. return err
  287. }
  288. }
  289. if r.needGeositeDatabase {
  290. err := r.prepareGeositeDatabase()
  291. if err != nil {
  292. return err
  293. }
  294. }
  295. for _, rule := range r.rules {
  296. err := rule.Start()
  297. if err != nil {
  298. return err
  299. }
  300. }
  301. for _, rule := range r.dnsRules {
  302. err := rule.Start()
  303. if err != nil {
  304. return err
  305. }
  306. }
  307. if r.needGeositeDatabase {
  308. for _, rule := range r.rules {
  309. err := rule.UpdateGeosite()
  310. if err != nil {
  311. r.logger.Error("failed to initialize geosite: ", err)
  312. }
  313. }
  314. for _, rule := range r.dnsRules {
  315. err := rule.UpdateGeosite()
  316. if err != nil {
  317. r.logger.Error("failed to initialize geosite: ", err)
  318. }
  319. }
  320. err := common.Close(r.geositeReader)
  321. if err != nil {
  322. return err
  323. }
  324. r.geositeCache = nil
  325. r.geositeReader = nil
  326. }
  327. if r.interfaceMonitor != nil {
  328. err := r.interfaceMonitor.Start()
  329. if err != nil {
  330. return err
  331. }
  332. }
  333. if r.networkMonitor != nil {
  334. err := r.networkMonitor.Start()
  335. if err != nil {
  336. return err
  337. }
  338. }
  339. return nil
  340. }
  341. func (r *Router) Close() error {
  342. for _, rule := range r.rules {
  343. err := rule.Close()
  344. if err != nil {
  345. return err
  346. }
  347. }
  348. for _, rule := range r.dnsRules {
  349. err := rule.Close()
  350. if err != nil {
  351. return err
  352. }
  353. }
  354. return common.Close(
  355. common.PtrOrNil(r.geoIPReader),
  356. r.interfaceMonitor,
  357. r.networkMonitor,
  358. )
  359. }
  360. func (r *Router) GeoIPReader() *geoip.Reader {
  361. return r.geoIPReader
  362. }
  363. func (r *Router) LoadGeosite(code string) (adapter.Rule, error) {
  364. rule, cached := r.geositeCache[code]
  365. if cached {
  366. return rule, nil
  367. }
  368. items, err := r.geositeReader.Read(code)
  369. if err != nil {
  370. return nil, err
  371. }
  372. rule, err = NewDefaultRule(r, nil, geosite.Compile(items))
  373. if err != nil {
  374. return nil, err
  375. }
  376. r.geositeCache[code] = rule
  377. return rule, nil
  378. }
  379. func (r *Router) Outbound(tag string) (adapter.Outbound, bool) {
  380. outbound, loaded := r.outboundByTag[tag]
  381. return outbound, loaded
  382. }
  383. func (r *Router) DefaultOutbound(network string) adapter.Outbound {
  384. if network == C.NetworkTCP {
  385. return r.defaultOutboundForConnection
  386. } else {
  387. return r.defaultOutboundForPacketConnection
  388. }
  389. }
  390. func (r *Router) RouteConnection(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) error {
  391. if metadata.SniffEnabled {
  392. _buffer := buf.StackNew()
  393. defer common.KeepAlive(_buffer)
  394. buffer := common.Dup(_buffer)
  395. defer buffer.Release()
  396. sniffMetadata, err := sniff.PeekStream(ctx, conn, buffer, sniff.TLSClientHello, sniff.HTTPHost)
  397. if err == nil {
  398. metadata.Protocol = sniffMetadata.Protocol
  399. metadata.Domain = sniffMetadata.Domain
  400. if metadata.SniffOverrideDestination && sniff.IsDomainName(metadata.Domain) {
  401. metadata.Destination.Fqdn = metadata.Domain
  402. }
  403. if metadata.Domain != "" {
  404. r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol, ", domain: ", metadata.Domain)
  405. } else {
  406. r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol)
  407. }
  408. }
  409. if !buffer.IsEmpty() {
  410. conn = bufio.NewCachedConn(conn, buffer)
  411. }
  412. }
  413. if metadata.Destination.IsFqdn() && metadata.DomainStrategy != dns.DomainStrategyAsIS {
  414. addresses, err := r.Lookup(adapter.WithContext(ctx, &metadata), metadata.Destination.Fqdn, metadata.DomainStrategy)
  415. if err != nil {
  416. return err
  417. }
  418. metadata.DestinationAddresses = addresses
  419. r.dnsLogger.DebugContext(ctx, "resolved [", strings.Join(F.MapToString(metadata.DestinationAddresses), " "), "]")
  420. }
  421. matchedRule, detour := r.match(ctx, metadata, r.defaultOutboundForConnection)
  422. if !common.Contains(detour.Network(), C.NetworkTCP) {
  423. conn.Close()
  424. return E.New("missing supported outbound, closing connection")
  425. }
  426. if r.trafficController != nil {
  427. conn = r.trafficController.RoutedConnection(ctx, conn, metadata, matchedRule)
  428. }
  429. return detour.NewConnection(ctx, conn, metadata)
  430. }
  431. func (r *Router) RoutePacketConnection(ctx context.Context, conn N.PacketConn, metadata adapter.InboundContext) error {
  432. if metadata.SniffEnabled {
  433. _buffer := buf.StackNewPacket()
  434. defer common.KeepAlive(_buffer)
  435. buffer := common.Dup(_buffer)
  436. defer buffer.Release()
  437. _, err := conn.ReadPacket(buffer)
  438. if err != nil {
  439. return err
  440. }
  441. sniffMetadata, err := sniff.PeekPacket(ctx, buffer.Bytes(), sniff.QUICClientHello, sniff.STUNMessage)
  442. originDestination := metadata.Destination
  443. if err == nil {
  444. metadata.Protocol = sniffMetadata.Protocol
  445. metadata.Domain = sniffMetadata.Domain
  446. if metadata.SniffOverrideDestination && sniff.IsDomainName(metadata.Domain) {
  447. metadata.Destination.Fqdn = metadata.Domain
  448. }
  449. if metadata.Domain != "" {
  450. r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol, ", domain: ", metadata.Domain)
  451. } else {
  452. r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol)
  453. }
  454. }
  455. conn = bufio.NewCachedPacketConn(conn, buffer, originDestination)
  456. }
  457. if metadata.Destination.IsFqdn() && metadata.DomainStrategy != dns.DomainStrategyAsIS {
  458. addresses, err := r.Lookup(adapter.WithContext(ctx, &metadata), metadata.Destination.Fqdn, metadata.DomainStrategy)
  459. if err != nil {
  460. return err
  461. }
  462. metadata.DestinationAddresses = addresses
  463. r.dnsLogger.DebugContext(ctx, "resolved [", strings.Join(F.MapToString(metadata.DestinationAddresses), " "), "]")
  464. }
  465. matchedRule, detour := r.match(ctx, metadata, r.defaultOutboundForPacketConnection)
  466. if !common.Contains(detour.Network(), C.NetworkUDP) {
  467. conn.Close()
  468. return E.New("missing supported outbound, closing packet connection")
  469. }
  470. if r.trafficController != nil {
  471. conn = r.trafficController.RoutedPacketConnection(ctx, conn, metadata, matchedRule)
  472. }
  473. return detour.NewPacketConnection(ctx, conn, metadata)
  474. }
  475. func (r *Router) Exchange(ctx context.Context, message *dnsmessage.Message) (*dnsmessage.Message, error) {
  476. return r.dnsClient.Exchange(ctx, r.matchDNS(ctx), message)
  477. }
  478. func (r *Router) Lookup(ctx context.Context, domain string, strategy dns.DomainStrategy) ([]netip.Addr, error) {
  479. return r.dnsClient.Lookup(ctx, r.matchDNS(ctx), domain, strategy)
  480. }
  481. func (r *Router) LookupDefault(ctx context.Context, domain string) ([]netip.Addr, error) {
  482. return r.dnsClient.Lookup(ctx, r.matchDNS(ctx), domain, r.defaultDomainStrategy)
  483. }
  484. func (r *Router) match(ctx context.Context, metadata adapter.InboundContext, defaultOutbound adapter.Outbound) (adapter.Rule, adapter.Outbound) {
  485. for i, rule := range r.rules {
  486. if rule.Match(&metadata) {
  487. detour := rule.Outbound()
  488. r.logger.DebugContext(ctx, "match[", i, "] ", rule.String(), " => ", detour)
  489. if outbound, loaded := r.Outbound(detour); loaded {
  490. return rule, outbound
  491. }
  492. r.logger.ErrorContext(ctx, "outbound not found: ", detour)
  493. }
  494. }
  495. return nil, defaultOutbound
  496. }
  497. func (r *Router) matchDNS(ctx context.Context) dns.Transport {
  498. metadata := adapter.ContextFrom(ctx)
  499. if metadata == nil {
  500. r.dnsLogger.WarnContext(ctx, "no context: ", reflect.TypeOf(ctx))
  501. return r.defaultTransport
  502. }
  503. for i, rule := range r.dnsRules {
  504. if rule.Match(metadata) {
  505. detour := rule.Outbound()
  506. r.dnsLogger.DebugContext(ctx, "match[", i, "] ", rule.String(), " => ", detour)
  507. if transport, loaded := r.transportMap[detour]; loaded {
  508. return transport
  509. }
  510. r.dnsLogger.ErrorContext(ctx, "transport not found: ", detour)
  511. }
  512. }
  513. return r.defaultTransport
  514. }
  515. func (r *Router) InterfaceBindManager() control.BindManager {
  516. return r.interfaceBindManager
  517. }
  518. func (r *Router) AutoDetectInterface() bool {
  519. return r.autoDetectInterface
  520. }
  521. func (r *Router) DefaultInterface() string {
  522. return r.defaultInterface
  523. }
  524. func (r *Router) AutoDetectInterfaceName() string {
  525. if r.interfaceMonitor == nil {
  526. return ""
  527. }
  528. return r.interfaceMonitor.DefaultInterfaceName()
  529. }
  530. func (r *Router) AutoDetectInterfaceIndex() int {
  531. if r.interfaceMonitor == nil {
  532. return -1
  533. }
  534. return r.interfaceMonitor.DefaultInterfaceIndex()
  535. }
  536. func (r *Router) Rules() []adapter.Rule {
  537. return r.rules
  538. }
  539. func (r *Router) SetTrafficController(controller adapter.TrafficController) {
  540. r.trafficController = controller
  541. }
  542. func hasGeoRule(rules []option.Rule, cond func(rule option.DefaultRule) bool) bool {
  543. for _, rule := range rules {
  544. switch rule.Type {
  545. case C.RuleTypeDefault:
  546. if cond(rule.DefaultOptions) {
  547. return true
  548. }
  549. case C.RuleTypeLogical:
  550. for _, subRule := range rule.LogicalOptions.Rules {
  551. if cond(subRule) {
  552. return true
  553. }
  554. }
  555. }
  556. }
  557. return false
  558. }
  559. func hasGeoDNSRule(rules []option.DNSRule, cond func(rule option.DefaultDNSRule) bool) bool {
  560. for _, rule := range rules {
  561. switch rule.Type {
  562. case C.RuleTypeDefault:
  563. if cond(rule.DefaultOptions) {
  564. return true
  565. }
  566. case C.RuleTypeLogical:
  567. for _, subRule := range rule.LogicalOptions.Rules {
  568. if cond(subRule) {
  569. return true
  570. }
  571. }
  572. }
  573. }
  574. return false
  575. }
  576. func isGeoIPRule(rule option.DefaultRule) bool {
  577. return len(rule.SourceGeoIP) > 0 && common.Any(rule.SourceGeoIP, notPrivateNode) || len(rule.GeoIP) > 0 && common.Any(rule.GeoIP, notPrivateNode)
  578. }
  579. func isGeoIPDNSRule(rule option.DefaultDNSRule) bool {
  580. return len(rule.SourceGeoIP) > 0 && common.Any(rule.SourceGeoIP, notPrivateNode)
  581. }
  582. func isGeositeRule(rule option.DefaultRule) bool {
  583. return len(rule.Geosite) > 0
  584. }
  585. func isGeositeDNSRule(rule option.DefaultDNSRule) bool {
  586. return len(rule.Geosite) > 0
  587. }
  588. func notPrivateNode(code string) bool {
  589. return code != "private"
  590. }
  591. func (r *Router) prepareGeoIPDatabase() error {
  592. var geoPath string
  593. if r.geoIPOptions.Path != "" {
  594. geoPath = r.geoIPOptions.Path
  595. } else {
  596. geoPath = "geoip.db"
  597. if foundPath, loaded := C.FindPath(geoPath); loaded {
  598. geoPath = foundPath
  599. }
  600. }
  601. if !rw.FileExists(geoPath) {
  602. r.logger.Warn("geoip database not exists: ", geoPath)
  603. var err error
  604. for attempts := 0; attempts < 3; attempts++ {
  605. err = r.downloadGeoIPDatabase(geoPath)
  606. if err == nil {
  607. break
  608. }
  609. r.logger.Error("download geoip database: ", err)
  610. os.Remove(geoPath)
  611. time.Sleep(10 * time.Second)
  612. }
  613. if err != nil {
  614. return err
  615. }
  616. }
  617. geoReader, codes, err := geoip.Open(geoPath)
  618. if err != nil {
  619. return E.Cause(err, "open geoip database")
  620. }
  621. r.logger.Info("loaded geoip database: ", len(codes), " codes")
  622. r.geoIPReader = geoReader
  623. return nil
  624. }
  625. func (r *Router) prepareGeositeDatabase() error {
  626. var geoPath string
  627. if r.geositeOptions.Path != "" {
  628. geoPath = r.geoIPOptions.Path
  629. } else {
  630. geoPath = "geosite.db"
  631. if foundPath, loaded := C.FindPath(geoPath); loaded {
  632. geoPath = foundPath
  633. }
  634. }
  635. if !rw.FileExists(geoPath) {
  636. r.logger.Warn("geosite database not exists: ", geoPath)
  637. var err error
  638. for attempts := 0; attempts < 3; attempts++ {
  639. err = r.downloadGeositeDatabase(geoPath)
  640. if err == nil {
  641. break
  642. }
  643. r.logger.Error("download geosite database: ", err)
  644. os.Remove(geoPath)
  645. time.Sleep(10 * time.Second)
  646. }
  647. if err != nil {
  648. return err
  649. }
  650. }
  651. geoReader, codes, err := geosite.Open(geoPath)
  652. if err == nil {
  653. r.logger.Info("loaded geosite database: ", len(codes), " codes")
  654. r.geositeReader = geoReader
  655. } else {
  656. return E.Cause(err, "open geosite database")
  657. }
  658. return nil
  659. }
  660. func (r *Router) downloadGeoIPDatabase(savePath string) error {
  661. var downloadURL string
  662. if r.geoIPOptions.DownloadURL != "" {
  663. downloadURL = r.geoIPOptions.DownloadURL
  664. } else {
  665. downloadURL = "https://github.com/SagerNet/sing-geoip/releases/latest/download/geoip.db"
  666. }
  667. r.logger.Info("downloading geoip database")
  668. var detour adapter.Outbound
  669. if r.geoIPOptions.DownloadDetour != "" {
  670. outbound, loaded := r.Outbound(r.geoIPOptions.DownloadDetour)
  671. if !loaded {
  672. return E.New("detour outbound not found: ", r.geoIPOptions.DownloadDetour)
  673. }
  674. detour = outbound
  675. } else {
  676. detour = r.defaultOutboundForConnection
  677. }
  678. if parentDir := filepath.Dir(savePath); parentDir != "" {
  679. os.MkdirAll(parentDir, 0o755)
  680. }
  681. saveFile, err := os.OpenFile(savePath, os.O_CREATE|os.O_WRONLY, 0o644)
  682. if err != nil {
  683. return E.Cause(err, "open output file: ", downloadURL)
  684. }
  685. defer saveFile.Close()
  686. httpClient := &http.Client{
  687. Transport: &http.Transport{
  688. ForceAttemptHTTP2: true,
  689. TLSHandshakeTimeout: 5 * time.Second,
  690. DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
  691. return detour.DialContext(ctx, network, M.ParseSocksaddr(addr))
  692. },
  693. },
  694. }
  695. response, err := httpClient.Get(downloadURL)
  696. if err != nil {
  697. return err
  698. }
  699. defer response.Body.Close()
  700. _, err = io.Copy(saveFile, response.Body)
  701. return err
  702. }
  703. func (r *Router) downloadGeositeDatabase(savePath string) error {
  704. var downloadURL string
  705. if r.geositeOptions.DownloadURL != "" {
  706. downloadURL = r.geositeOptions.DownloadURL
  707. } else {
  708. downloadURL = "https://github.com/SagerNet/sing-geosite/releases/latest/download/geosite.db"
  709. }
  710. r.logger.Info("downloading geoip database")
  711. var detour adapter.Outbound
  712. if r.geositeOptions.DownloadDetour != "" {
  713. outbound, loaded := r.Outbound(r.geositeOptions.DownloadDetour)
  714. if !loaded {
  715. return E.New("detour outbound not found: ", r.geoIPOptions.DownloadDetour)
  716. }
  717. detour = outbound
  718. } else {
  719. detour = r.defaultOutboundForConnection
  720. }
  721. if parentDir := filepath.Dir(savePath); parentDir != "" {
  722. os.MkdirAll(parentDir, 0o755)
  723. }
  724. saveFile, err := os.OpenFile(savePath, os.O_CREATE|os.O_WRONLY, 0o644)
  725. if err != nil {
  726. return E.Cause(err, "open output file: ", downloadURL)
  727. }
  728. defer saveFile.Close()
  729. httpClient := &http.Client{
  730. Transport: &http.Transport{
  731. ForceAttemptHTTP2: true,
  732. TLSHandshakeTimeout: 5 * time.Second,
  733. DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
  734. return detour.DialContext(ctx, network, M.ParseSocksaddr(addr))
  735. },
  736. },
  737. }
  738. response, err := httpClient.Get(downloadURL)
  739. if err != nil {
  740. return err
  741. }
  742. defer response.Body.Close()
  743. _, err = io.Copy(saveFile, response.Body)
  744. return err
  745. }
  746. func (r *Router) NewError(ctx context.Context, err error) {
  747. r.logger.ErrorContext(ctx, err)
  748. }