chore: separate the DNS enhancer config passing

This commit is contained in:
wwqgtxx 2025-09-29 10:28:26 +08:00
parent f7bd8b83e5
commit 94b591ed44
6 changed files with 27 additions and 30 deletions

View File

@ -146,6 +146,7 @@ type DNS struct {
PreferH3 bool PreferH3 bool
IPv6 bool IPv6 bool
IPv6Timeout uint IPv6Timeout uint
UseHosts bool
UseSystemHosts bool UseSystemHosts bool
NameServer []dns.NameServer NameServer []dns.NameServer
Fallback []dns.NameServer Fallback []dns.NameServer
@ -157,7 +158,6 @@ type DNS struct {
CacheAlgorithm string CacheAlgorithm string
CacheMaxSize int CacheMaxSize int
FakeIPRange *fakeip.Pool FakeIPRange *fakeip.Pool
Hosts *trie.DomainTrie[resolver.HostValue]
NameServerPolicy []dns.Policy NameServerPolicy []dns.Policy
ProxyServerNameserver []dns.NameServer ProxyServerNameserver []dns.NameServer
DirectNameServer []dns.NameServer DirectNameServer []dns.NameServer
@ -680,7 +680,7 @@ func ParseRawConfig(rawCfg *RawConfig) (*Config, error) {
} }
config.Hosts = hosts config.Hosts = hosts
dnsCfg, err := parseDNS(rawCfg, hosts, ruleProviders) dnsCfg, err := parseDNS(rawCfg, ruleProviders)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -1341,7 +1341,7 @@ func parseNameServerPolicy(nsPolicy *orderedmap.OrderedMap[string, any], rulePro
return policy, nil 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 cfg := rawCfg.DNS
if cfg.Enable && len(cfg.NameServer) == 0 { if cfg.Enable && len(cfg.NameServer) == 0 {
return nil, fmt.Errorf("if DNS configuration is turned on, NameServer cannot be empty") 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, PreferH3: cfg.PreferH3,
IPv6Timeout: cfg.IPv6Timeout, IPv6Timeout: cfg.IPv6Timeout,
IPv6: cfg.IPv6, IPv6: cfg.IPv6,
UseHosts: cfg.UseHosts,
UseSystemHosts: cfg.UseSystemHosts, UseSystemHosts: cfg.UseSystemHosts,
EnhancedMode: cfg.EnhancedMode, EnhancedMode: cfg.EnhancedMode,
CacheAlgorithm: cfg.CacheAlgorithm, 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 return dnsCfg, nil
} }

View File

@ -12,6 +12,7 @@ type ResolverEnhancer struct {
mode C.DNSMode mode C.DNSMode
fakePool *fakeip.Pool fakePool *fakeip.Pool
mapping *lru.LruCache[netip.Addr, string] mapping *lru.LruCache[netip.Addr, string]
useHosts bool
} }
func (h *ResolverEnhancer) FakeIPEnabled() 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 fakePool *fakeip.Pool
var mapping *lru.LruCache[netip.Addr, string] var mapping *lru.LruCache[netip.Addr, string]
@ -116,5 +123,6 @@ func NewEnhancer(cfg Config) *ResolverEnhancer {
mode: cfg.EnhancedMode, mode: cfg.EnhancedMode,
fakePool: fakePool, fakePool: fakePool,
mapping: mapping, mapping: mapping,
useHosts: cfg.UseHosts,
} }
} }

View File

@ -20,7 +20,7 @@ type (
middleware func(next handler) handler 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(next handler) handler {
return func(ctx *context.DNSContext, r *D.Msg) (*D.Msg, error) { return func(ctx *context.DNSContext, r *D.Msg) (*D.Msg, error) {
q := r.Question[0] q := r.Question[0]
@ -36,7 +36,7 @@ func withHosts(hosts R.Hosts, mapping *lru.LruCache[netip.Addr, string]) middlew
rr.Target = domain + "." rr.Target = domain + "."
resp.Answer = append([]D.RR{rr}, resp.Answer...) 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 !ok {
if record != nil && record.IsDomain { if record != nil && record.IsDomain {
// replace request domain // replace request domain
@ -221,8 +221,8 @@ func compose(middlewares []middleware, endpoint handler) handler {
func NewHandler(resolver *Resolver, mapper *ResolverEnhancer) handler { func NewHandler(resolver *Resolver, mapper *ResolverEnhancer) handler {
middlewares := []middleware{} middlewares := []middleware{}
if resolver.hosts != nil { if mapper.useHosts {
middlewares = append(middlewares, withHosts(R.NewHosts(resolver.hosts), mapper.mapping)) middlewares = append(middlewares, withHosts(mapper.mapping))
} }
if mapper.mode == C.DNSFakeIP { if mapper.mode == C.DNSFakeIP {

View File

@ -9,7 +9,6 @@ import (
"github.com/metacubex/mihomo/common/arc" "github.com/metacubex/mihomo/common/arc"
"github.com/metacubex/mihomo/common/lru" "github.com/metacubex/mihomo/common/lru"
"github.com/metacubex/mihomo/common/singleflight" "github.com/metacubex/mihomo/common/singleflight"
"github.com/metacubex/mihomo/component/fakeip"
"github.com/metacubex/mihomo/component/resolver" "github.com/metacubex/mihomo/component/resolver"
"github.com/metacubex/mihomo/component/trie" "github.com/metacubex/mihomo/component/trie"
C "github.com/metacubex/mihomo/constant" C "github.com/metacubex/mihomo/constant"
@ -40,7 +39,6 @@ type result struct {
type Resolver struct { type Resolver struct {
ipv6 bool ipv6 bool
ipv6Timeout time.Duration ipv6Timeout time.Duration
hosts *trie.DomainTrie[resolver.HostValue]
main []dnsClient main []dnsClient
fallback []dnsClient fallback []dnsClient
fallbackDomainFilters []C.DomainMatcher fallbackDomainFilters []C.DomainMatcher
@ -452,11 +450,8 @@ type Config struct {
DirectFollowPolicy bool DirectFollowPolicy bool
IPv6 bool IPv6 bool
IPv6Timeout uint IPv6Timeout uint
EnhancedMode C.DNSMode
FallbackIPFilter []C.IpMatcher FallbackIPFilter []C.IpMatcher
FallbackDomainFilter []C.DomainMatcher FallbackDomainFilter []C.DomainMatcher
Pool *fakeip.Pool
Hosts *trie.DomainTrie[resolver.HostValue]
Policy []Policy Policy []Policy
CacheAlgorithm string CacheAlgorithm string
CacheMaxSize int CacheMaxSize int
@ -530,7 +525,6 @@ func NewResolver(config Config) (rs Resolvers) {
ipv6: config.IPv6, ipv6: config.IPv6,
main: cacheTransform(config.Main), main: cacheTransform(config.Main),
cache: config.newCache(), cache: config.newCache(),
hosts: config.Hosts,
ipv6Timeout: time.Duration(config.IPv6Timeout) * time.Millisecond, ipv6Timeout: time.Duration(config.IPv6Timeout) * time.Millisecond,
} }
r.defaultResolver = defaultResolver r.defaultResolver = defaultResolver
@ -541,7 +535,6 @@ func NewResolver(config Config) (rs Resolvers) {
ipv6: config.IPv6, ipv6: config.IPv6,
main: cacheTransform(config.ProxyServer), main: cacheTransform(config.ProxyServer),
cache: config.newCache(), cache: config.newCache(),
hosts: config.Hosts,
ipv6Timeout: time.Duration(config.IPv6Timeout) * time.Millisecond, ipv6Timeout: time.Duration(config.IPv6Timeout) * time.Millisecond,
} }
} }
@ -551,7 +544,6 @@ func NewResolver(config Config) (rs Resolvers) {
ipv6: config.IPv6, ipv6: config.IPv6,
main: cacheTransform(config.DirectServer), main: cacheTransform(config.DirectServer),
cache: config.newCache(), cache: config.newCache(),
hosts: config.Hosts,
ipv6Timeout: time.Duration(config.IPv6Timeout) * time.Millisecond, ipv6Timeout: time.Duration(config.IPv6Timeout) * time.Millisecond,
} }
} }

View File

@ -51,7 +51,7 @@ func (s *Server) SetHandler(handler handler) {
} }
func ReCreateServer(addr string, resolver *Resolver, mapper *ResolverEnhancer) { func ReCreateServer(addr string, resolver *Resolver, mapper *ResolverEnhancer) {
if addr == address && resolver != nil { if addr == address && resolver != nil && mapper != nil {
handler := NewHandler(resolver, mapper) handler := NewHandler(resolver, mapper)
server.SetHandler(handler) server.SetHandler(handler)
return return
@ -70,7 +70,7 @@ func ReCreateServer(addr string, resolver *Resolver, mapper *ResolverEnhancer) {
server.handler = nil server.handler = nil
address = "" address = ""
if addr == "" { if addr == "" || resolver == nil || mapper == nil {
return return
} }

View File

@ -246,14 +246,12 @@ func updateDNS(c *config.DNS, generalIPv6 bool) {
dns.ReCreateServer("", nil, nil) dns.ReCreateServer("", nil, nil)
return return
} }
cfg := dns.Config{
r := dns.NewResolver(dns.Config{
Main: c.NameServer, Main: c.NameServer,
Fallback: c.Fallback, Fallback: c.Fallback,
IPv6: c.IPv6 && generalIPv6, IPv6: c.IPv6 && generalIPv6,
IPv6Timeout: c.IPv6Timeout, IPv6Timeout: c.IPv6Timeout,
EnhancedMode: c.EnhancedMode,
Pool: c.FakeIPRange,
Hosts: c.Hosts,
FallbackIPFilter: c.FallbackIPFilter, FallbackIPFilter: c.FallbackIPFilter,
FallbackDomainFilter: c.FallbackDomainFilter, FallbackDomainFilter: c.FallbackDomainFilter,
Default: c.DefaultNameserver, Default: c.DefaultNameserver,
@ -263,10 +261,12 @@ func updateDNS(c *config.DNS, generalIPv6 bool) {
DirectFollowPolicy: c.DirectFollowPolicy, DirectFollowPolicy: c.DirectFollowPolicy,
CacheAlgorithm: c.CacheAlgorithm, CacheAlgorithm: c.CacheAlgorithm,
CacheMaxSize: c.CacheMaxSize, CacheMaxSize: c.CacheMaxSize,
} })
m := dns.NewEnhancer(dns.EnhancerConfig{
r := dns.NewResolver(cfg) EnhancedMode: c.EnhancedMode,
m := dns.NewEnhancer(cfg) Pool: c.FakeIPRange,
UseHosts: c.UseHosts,
})
// reuse cache of old host mapper // reuse cache of old host mapper
if old := resolver.DefaultHostMapper; old != nil { if old := resolver.DefaultHostMapper; old != nil {