tailscale: Match bare hostnames in preferred_by when search domains exist

MagicDNS resolves single-label names via tailnet search domains, so
route preferred_by should treat them as tailscale domains, matching
official client behavior.
This commit is contained in:
世界
2026-08-04 22:29:14 +08:00
parent cc1c891400
commit 3b22615aec

View File

@@ -98,6 +98,7 @@ type Endpoint struct {
routerCfg *router.Config
dnsCfg *tsDNS.Config
routeDomains common.TypedValue[map[string]bool]
searchDomains atomic.Bool
routePrefixes atomic.Pointer[netipx.IPSet]
acceptRoutes bool
@@ -785,7 +786,11 @@ func (t *Endpoint) PreferredDomain(domain string) bool {
if routeDomains == nil {
return false
}
return routeDomains[strings.ToLower(domain)]
domain = strings.ToLower(domain)
if routeDomains[domain] {
return true
}
return !strings.Contains(domain, ".") && t.searchDomains.Load()
}
func (t *Endpoint) PreferredAddress(address netip.Addr) bool {
@@ -830,6 +835,7 @@ func (t *Endpoint) onReconfig(cfg *wgcfg.Config, routerCfg *router.Config, dnsCf
routeDomains[fqdn.WithoutTrailingDot()] = true
}
t.routeDomains.Store(routeDomains)
t.searchDomains.Store(len(dnsCfg.SearchDomains) > 0)
var builder netipx.IPSetBuilder
for _, peer := range cfg.Peers {