mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2025-12-19 16:30:07 +08:00
chore: separate the DNS enhancer config passing
This commit is contained in:
parent
f7bd8b83e5
commit
94b591ed44
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user