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:
@@ -53,6 +53,14 @@ func InitTsNet(ctx context.Context, cfg *Core, logger *slog.Logger, withDebugLog
|
||||
logger.With(slog.String("ip", ip.String())).Info("ip got from tsnet")
|
||||
}
|
||||
|
||||
rawSuffix, err := GetMagicDNSSuffixFromStatus(status)
|
||||
if err != nil {
|
||||
logger.Debug("failed to extract MagicDNS suffix", slog.String("error", err.Error()))
|
||||
} else {
|
||||
SetMagicDNSSuffix(rawSuffix)
|
||||
logger.Info("MagicDNS suffix extracted", slog.String("suffix", rawSuffix))
|
||||
}
|
||||
|
||||
if cfg.AcceptRoutes {
|
||||
lc, err := srv.LocalClient()
|
||||
if err != nil {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user