diff --git a/config/config.go b/config/config.go index 77a4a4dc..f4c6f875 100644 --- a/config/config.go +++ b/config/config.go @@ -156,6 +156,7 @@ type DNS struct { FallbackIPFilter []C.IpMatcher FallbackDomainFilter []C.DomainMatcher Listen string + ListenRoutingMark int EnhancedMode C.DNSMode DefaultNameserver []dns.NameServer CacheAlgorithm string @@ -228,6 +229,7 @@ type RawDNS struct { Fallback []string `yaml:"fallback" json:"fallback"` FallbackFilter RawFallbackFilter `yaml:"fallback-filter" json:"fallback-filter"` Listen string `yaml:"listen" json:"listen"` + ListenRoutingMark int `yaml:"listen-routing-mark" json:"listen-routing-mark"` EnhancedMode C.DNSMode `yaml:"enhanced-mode" json:"enhanced-mode"` FakeIPRange string `yaml:"fake-ip-range" json:"fake-ip-range"` FakeIPRange6 string `yaml:"fake-ip-range6" json:"fake-ip-range6"` @@ -1400,16 +1402,17 @@ func parseDNS(rawCfg *RawConfig, ruleProviders map[string]P.RuleProvider) (*DNS, } dnsCfg := &DNS{ - Enable: cfg.Enable, - Listen: cfg.Listen, - PreferH3: cfg.PreferH3, - IPv6Timeout: cfg.IPv6Timeout, - IPv6: cfg.IPv6, - UseHosts: cfg.UseHosts, - UseSystemHosts: cfg.UseSystemHosts, - EnhancedMode: cfg.EnhancedMode, - CacheAlgorithm: cfg.CacheAlgorithm, - CacheMaxSize: cfg.CacheMaxSize, + Enable: cfg.Enable, + Listen: cfg.Listen, + ListenRoutingMark: cfg.ListenRoutingMark, + PreferH3: cfg.PreferH3, + IPv6Timeout: cfg.IPv6Timeout, + IPv6: cfg.IPv6, + UseHosts: cfg.UseHosts, + UseSystemHosts: cfg.UseSystemHosts, + EnhancedMode: cfg.EnhancedMode, + CacheAlgorithm: cfg.CacheAlgorithm, + CacheMaxSize: cfg.CacheMaxSize, } var err error if dnsCfg.NameServer, err = parseNameServer(cfg.NameServer, cfg.RespectRules, cfg.PreferH3); err != nil { diff --git a/dns/server.go b/dns/server.go index bdcb0011..32d1cd49 100644 --- a/dns/server.go +++ b/dns/server.go @@ -43,7 +43,7 @@ func (s *Server) SetService(service resolver.Service) { s.service = service } -func ReCreateServer(addr string, service resolver.Service) { +func ReCreateServer(addr string, lc *inbound.ListenerConfig, service resolver.Service) { if addr == address && service != nil { server.SetService(service) return @@ -62,7 +62,7 @@ func ReCreateServer(addr string, service resolver.Service) { server.service = nil address = "" - if addr == "" || service == nil { + if addr == "" || lc == nil || service == nil { return } @@ -81,8 +81,6 @@ func ReCreateServer(addr string, service resolver.Service) { address = addr server = &Server{service: service} - lc := inbound.NewListenerConfig() - lc.SetRouteMark(0) // TODO: add route mark support for dns server go func() { p, err := lc.ListenPacket(context.Background(), "udp", addr) if err != nil { diff --git a/hub/executor/executor.go b/hub/executor/executor.go index 8e0d09e6..484f1065 100644 --- a/hub/executor/executor.go +++ b/hub/executor/executor.go @@ -242,7 +242,7 @@ func updateDNS(c *config.DNS, generalIPv6 bool) { resolver.DefaultService = nil resolver.ProxyServerHostResolver = nil resolver.DirectHostResolver = nil - dns.ReCreateServer("", nil) + dns.ReCreateServer("", nil, nil) return } @@ -297,7 +297,9 @@ func updateDNS(c *config.DNS, generalIPv6 bool) { resolver.DirectHostResolver = r.Resolver } - dns.ReCreateServer(c.Listen, s) + lc := inbound.NewListenerConfig() + lc.SetRouteMark(c.ListenRoutingMark) + dns.ReCreateServer(c.Listen, lc, s) } func updateHosts(tree *trie.DomainTrie[resolver.HostValue]) {