From 65380457b85c4a7f3c5abf3bed66cdae4c1bf6b0 Mon Sep 17 00:00:00 2001 From: NagaseMinato <80738880+NagaseMinato@users.noreply.github.com> Date: Mon, 10 Aug 2026 19:11:10 +0800 Subject: [PATCH] Fix tailscale preferred MagicDNS domain matching --- protocol/tailscale/endpoint.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/protocol/tailscale/endpoint.go b/protocol/tailscale/endpoint.go index 27bbef50..03ec6c9f 100644 --- a/protocol/tailscale/endpoint.go +++ b/protocol/tailscale/endpoint.go @@ -98,6 +98,7 @@ type Endpoint struct { routerCfg *router.Config dnsCfg *tsDNS.Config routeDomains common.TypedValue[map[string]bool] + routeSuffixes common.TypedValue[[]string] searchDomains atomic.Bool routePrefixes atomic.Pointer[netipx.IPSet] @@ -790,6 +791,11 @@ func (t *Endpoint) PreferredDomain(domain string) bool { if routeDomains[domain] { return true } + for _, suffix := range t.routeSuffixes.Load() { + if mDNS.IsSubDomain(suffix, domain) { + return true + } + } return !strings.Contains(domain, ".") && t.searchDomains.Load() } @@ -828,13 +834,18 @@ func (t *Endpoint) onReconfig(cfg *wgcfg.Config, routerCfg *router.Config, dnsCf t.dnsCfg = dnsCfg routeDomains := make(map[string]bool) - for fqdn := range dnsCfg.Routes { + for fqdn := range dnsCfg.Hosts { routeDomains[fqdn.WithoutTrailingDot()] = true } for _, fqdn := range dnsCfg.SearchDomains { routeDomains[fqdn.WithoutTrailingDot()] = true } + routeSuffixes := make([]string, 0, len(dnsCfg.Routes)) + for fqdn := range dnsCfg.Routes { + routeSuffixes = append(routeSuffixes, fqdn.WithoutTrailingDot()) + } t.routeDomains.Store(routeDomains) + t.routeSuffixes.Store(routeSuffixes) t.searchDomains.Store(len(dnsCfg.SearchDomains) > 0) var builder netipx.IPSetBuilder