From 94b591ed44b948fe1fdb58817642902b609e81be Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Mon, 29 Sep 2025 10:28:26 +0800 Subject: [PATCH] chore: separate the DNS enhancer config passing --- config/config.go | 11 ++++------- dns/enhancer.go | 10 +++++++++- dns/middleware.go | 8 ++++---- dns/resolver.go | 8 -------- dns/server.go | 4 ++-- hub/executor/executor.go | 16 ++++++++-------- 6 files changed, 27 insertions(+), 30 deletions(-) diff --git a/config/config.go b/config/config.go index bcd3cc7a..dec0955b 100644 --- a/config/config.go +++ b/config/config.go @@ -146,6 +146,7 @@ type DNS struct { PreferH3 bool IPv6 bool IPv6Timeout uint + UseHosts bool UseSystemHosts bool NameServer []dns.NameServer Fallback []dns.NameServer @@ -157,7 +158,6 @@ type DNS struct { CacheAlgorithm string CacheMaxSize int FakeIPRange *fakeip.Pool - Hosts *trie.DomainTrie[resolver.HostValue] NameServerPolicy []dns.Policy ProxyServerNameserver []dns.NameServer DirectNameServer []dns.NameServer @@ -680,7 +680,7 @@ func ParseRawConfig(rawCfg *RawConfig) (*Config, error) { } config.Hosts = hosts - dnsCfg, err := parseDNS(rawCfg, hosts, ruleProviders) + dnsCfg, err := parseDNS(rawCfg, ruleProviders) if err != nil { return nil, err } @@ -1341,7 +1341,7 @@ func parseNameServerPolicy(nsPolicy *orderedmap.OrderedMap[string, any], rulePro return policy, nil } -func parseDNS(rawCfg *RawConfig, hosts *trie.DomainTrie[resolver.HostValue], ruleProviders map[string]providerTypes.RuleProvider) (*DNS, error) { +func parseDNS(rawCfg *RawConfig, ruleProviders map[string]providerTypes.RuleProvider) (*DNS, error) { cfg := rawCfg.DNS if cfg.Enable && len(cfg.NameServer) == 0 { return nil, fmt.Errorf("if DNS configuration is turned on, NameServer cannot be empty") @@ -1357,6 +1357,7 @@ func parseDNS(rawCfg *RawConfig, hosts *trie.DomainTrie[resolver.HostValue], rul PreferH3: cfg.PreferH3, IPv6Timeout: cfg.IPv6Timeout, IPv6: cfg.IPv6, + UseHosts: cfg.UseHosts, UseSystemHosts: cfg.UseSystemHosts, EnhancedMode: cfg.EnhancedMode, CacheAlgorithm: cfg.CacheAlgorithm, @@ -1490,10 +1491,6 @@ func parseDNS(rawCfg *RawConfig, hosts *trie.DomainTrie[resolver.HostValue], rul } } - if cfg.UseHosts { - dnsCfg.Hosts = hosts - } - return dnsCfg, nil } diff --git a/dns/enhancer.go b/dns/enhancer.go index 9ea3ae84..36923ca6 100644 --- a/dns/enhancer.go +++ b/dns/enhancer.go @@ -12,6 +12,7 @@ type ResolverEnhancer struct { mode C.DNSMode fakePool *fakeip.Pool mapping *lru.LruCache[netip.Addr, string] + useHosts bool } func (h *ResolverEnhancer) FakeIPEnabled() bool { @@ -103,7 +104,13 @@ func (h *ResolverEnhancer) StoreFakePoolState() { } } -func NewEnhancer(cfg Config) *ResolverEnhancer { +type EnhancerConfig struct { + EnhancedMode C.DNSMode + Pool *fakeip.Pool + UseHosts bool +} + +func NewEnhancer(cfg EnhancerConfig) *ResolverEnhancer { var fakePool *fakeip.Pool var mapping *lru.LruCache[netip.Addr, string] @@ -116,5 +123,6 @@ func NewEnhancer(cfg Config) *ResolverEnhancer { mode: cfg.EnhancedMode, fakePool: fakePool, mapping: mapping, + useHosts: cfg.UseHosts, } } diff --git a/dns/middleware.go b/dns/middleware.go index e6461e91..5b0c0d85 100644 --- a/dns/middleware.go +++ b/dns/middleware.go @@ -20,7 +20,7 @@ type ( middleware func(next handler) handler ) -func withHosts(hosts R.Hosts, mapping *lru.LruCache[netip.Addr, string]) middleware { +func withHosts(mapping *lru.LruCache[netip.Addr, string]) middleware { return func(next handler) handler { return func(ctx *context.DNSContext, r *D.Msg) (*D.Msg, error) { q := r.Question[0] @@ -36,7 +36,7 @@ func withHosts(hosts R.Hosts, mapping *lru.LruCache[netip.Addr, string]) middlew rr.Target = domain + "." resp.Answer = append([]D.RR{rr}, resp.Answer...) } - record, ok := hosts.Search(host, q.Qtype != D.TypeA && q.Qtype != D.TypeAAAA) + record, ok := R.DefaultHosts.Search(host, q.Qtype != D.TypeA && q.Qtype != D.TypeAAAA) if !ok { if record != nil && record.IsDomain { // replace request domain @@ -221,8 +221,8 @@ func compose(middlewares []middleware, endpoint handler) handler { func NewHandler(resolver *Resolver, mapper *ResolverEnhancer) handler { middlewares := []middleware{} - if resolver.hosts != nil { - middlewares = append(middlewares, withHosts(R.NewHosts(resolver.hosts), mapper.mapping)) + if mapper.useHosts { + middlewares = append(middlewares, withHosts(mapper.mapping)) } if mapper.mode == C.DNSFakeIP { diff --git a/dns/resolver.go b/dns/resolver.go index f5f69c5f..f7d4d429 100644 --- a/dns/resolver.go +++ b/dns/resolver.go @@ -9,7 +9,6 @@ import ( "github.com/metacubex/mihomo/common/arc" "github.com/metacubex/mihomo/common/lru" "github.com/metacubex/mihomo/common/singleflight" - "github.com/metacubex/mihomo/component/fakeip" "github.com/metacubex/mihomo/component/resolver" "github.com/metacubex/mihomo/component/trie" C "github.com/metacubex/mihomo/constant" @@ -40,7 +39,6 @@ type result struct { type Resolver struct { ipv6 bool ipv6Timeout time.Duration - hosts *trie.DomainTrie[resolver.HostValue] main []dnsClient fallback []dnsClient fallbackDomainFilters []C.DomainMatcher @@ -452,11 +450,8 @@ type Config struct { DirectFollowPolicy bool IPv6 bool IPv6Timeout uint - EnhancedMode C.DNSMode FallbackIPFilter []C.IpMatcher FallbackDomainFilter []C.DomainMatcher - Pool *fakeip.Pool - Hosts *trie.DomainTrie[resolver.HostValue] Policy []Policy CacheAlgorithm string CacheMaxSize int @@ -530,7 +525,6 @@ func NewResolver(config Config) (rs Resolvers) { ipv6: config.IPv6, main: cacheTransform(config.Main), cache: config.newCache(), - hosts: config.Hosts, ipv6Timeout: time.Duration(config.IPv6Timeout) * time.Millisecond, } r.defaultResolver = defaultResolver @@ -541,7 +535,6 @@ func NewResolver(config Config) (rs Resolvers) { ipv6: config.IPv6, main: cacheTransform(config.ProxyServer), cache: config.newCache(), - hosts: config.Hosts, ipv6Timeout: time.Duration(config.IPv6Timeout) * time.Millisecond, } } @@ -551,7 +544,6 @@ func NewResolver(config Config) (rs Resolvers) { ipv6: config.IPv6, main: cacheTransform(config.DirectServer), cache: config.newCache(), - hosts: config.Hosts, ipv6Timeout: time.Duration(config.IPv6Timeout) * time.Millisecond, } } diff --git a/dns/server.go b/dns/server.go index caf1c289..541aeee4 100644 --- a/dns/server.go +++ b/dns/server.go @@ -51,7 +51,7 @@ func (s *Server) SetHandler(handler handler) { } func ReCreateServer(addr string, resolver *Resolver, mapper *ResolverEnhancer) { - if addr == address && resolver != nil { + if addr == address && resolver != nil && mapper != nil { handler := NewHandler(resolver, mapper) server.SetHandler(handler) return @@ -70,7 +70,7 @@ func ReCreateServer(addr string, resolver *Resolver, mapper *ResolverEnhancer) { server.handler = nil address = "" - if addr == "" { + if addr == "" || resolver == nil || mapper == nil { return } diff --git a/hub/executor/executor.go b/hub/executor/executor.go index fcf176e0..9921973d 100644 --- a/hub/executor/executor.go +++ b/hub/executor/executor.go @@ -246,14 +246,12 @@ func updateDNS(c *config.DNS, generalIPv6 bool) { dns.ReCreateServer("", nil, nil) return } - cfg := dns.Config{ + + r := dns.NewResolver(dns.Config{ Main: c.NameServer, Fallback: c.Fallback, IPv6: c.IPv6 && generalIPv6, IPv6Timeout: c.IPv6Timeout, - EnhancedMode: c.EnhancedMode, - Pool: c.FakeIPRange, - Hosts: c.Hosts, FallbackIPFilter: c.FallbackIPFilter, FallbackDomainFilter: c.FallbackDomainFilter, Default: c.DefaultNameserver, @@ -263,10 +261,12 @@ func updateDNS(c *config.DNS, generalIPv6 bool) { DirectFollowPolicy: c.DirectFollowPolicy, CacheAlgorithm: c.CacheAlgorithm, CacheMaxSize: c.CacheMaxSize, - } - - r := dns.NewResolver(cfg) - m := dns.NewEnhancer(cfg) + }) + m := dns.NewEnhancer(dns.EnhancerConfig{ + EnhancedMode: c.EnhancedMode, + Pool: c.FakeIPRange, + UseHosts: c.UseHosts, + }) // reuse cache of old host mapper if old := resolver.DefaultHostMapper; old != nil {