feat(utils): implement MagicDNS suffix handling and normalization for dst_addr

- Added support for extracting and setting MagicDNS suffix.
- Normalized `dst_addr` using the MagicDNS suffix to simplify configuration.
- Improved logging for normalized and failed addresses during `connect` rule processing.
This commit is contained in:
nullcat
2026-06-01 16:07:23 +08:00
parent a9828b4461
commit e60a6b76c7
4 changed files with 110 additions and 184 deletions
+81
View File
@@ -8,6 +8,7 @@ import (
"net"
"net/netip"
"strings"
"sync"
"time"
"tailscale.com/client/local"
@@ -189,3 +190,83 @@ func getSelfTsnetAddr(srv *tsnet.Server) netip.Addr {
}
return ip
}
var (
magicDNSSuffixMu sync.RWMutex
magicDNSSuffix string
)
func SetMagicDNSSuffix(raw string) {
magicDNSSuffixMu.Lock()
defer magicDNSSuffixMu.Unlock()
magicDNSSuffix = strings.Trim(raw, ".")
}
func GetMagicDNSSuffix() (string, bool) {
magicDNSSuffixMu.RLock()
defer magicDNSSuffixMu.RUnlock()
if magicDNSSuffix == "" {
return "", false
}
return magicDNSSuffix, true
}
func GetMagicDNSSuffixFromStatus(st *ipnstate.Status) (string, error) {
suffix := st.CurrentTailnet.MagicDNSSuffix
if suffix == "" {
suffix = st.MagicDNSSuffix
}
suffix = strings.Trim(suffix, ".")
if suffix == "" {
return "", errors.New("magic dns suffix not found in status")
}
return suffix, nil
}
func NormalizeDstAddrWithSuffix(dst string) (string, bool, error) {
host, port, err := net.SplitHostPort(dst)
if err != nil {
return dst, false, err
}
if _, err := netip.ParseAddr(host); err == nil {
return dst, false, nil
}
if strings.Contains(host, ".") {
return dst, false, nil
}
suffix, ok := GetMagicDNSSuffix()
if !ok {
return dst, false, nil
}
normalized := net.JoinHostPort(host+"."+suffix, port)
return normalized, true, nil
}
func NormalizeConnectRulesDstAddr(rules map[string][]ConnectRule, logger *slog.Logger) {
for tag, rrs := range rules {
for i := range rrs {
rule := &rrs[i]
normalized, changed, err := NormalizeDstAddrWithSuffix(rule.DstAddr)
if err != nil {
logger.Debug("failed to normalize dst_addr",
slog.String("tag", tag),
slog.String("dst", rule.DstAddr),
slog.String("error", err.Error()),
)
continue
}
if changed {
logger.Debug("dst_addr normalized with MagicDNS suffix",
slog.String("tag", tag),
slog.String("original", rule.DstAddr),
slog.String("normalized", normalized),
)
rule.DstAddr = normalized
}
}
}
}