feat(utils): resolveAddr can resolve subnet ip at domain properly

This commit is contained in:
nc
2026-06-05 03:56:52 +08:00
parent 390946e0a2
commit 125bc4bf3d
2 changed files with 154 additions and 61 deletions
-61
View File
@@ -8,7 +8,6 @@ import (
"net"
"net/netip"
"strings"
"sync"
"time"
"tailscale.com/client/local"
@@ -46,37 +45,6 @@ func StartTimeWatchDog(ctx context.Context, logger *slog.Logger) <-chan struct{}
return ch
}
func resolveAddr(ctx context.Context, srv *tsnet.Server, addr string) (*netip.Addr, error) {
lc, err := srv.LocalClient()
if err != nil {
return nil, err
}
stat, err := lc.Status(ctx)
if err != nil {
return nil, err
}
if ip, err := netip.ParseAddr(addr); err == nil {
for _, peer := range stat.Peer {
for _, ipRange := range peer.AllowedIPs.All() {
if ipRange.Contains(ip) {
return &peer.TailscaleIPs[0], nil
}
}
}
} else {
// addr is domain, resolve it
for _, peer := range stat.Peer {
dnsName := strings.TrimSuffix(peer.DNSName, ".")
if dnsName == addr {
return &peer.TailscaleIPs[0], nil
}
}
}
return nil, errors.New(fmt.Sprintf("addr '%s' not found in tsnet", addr))
}
func getPeerFromRules(ctx context.Context, srv *tsnet.Server, rules map[string][]ConnectRule, logger *slog.Logger) ([]netip.Addr, error) {
peerSet := make(map[netip.Addr]struct{})
@@ -191,35 +159,6 @@ 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
suffix = strings.Trim(suffix, ".")
if suffix == "" {
return "", errors.New("magic dns suffix not found in status")
}
return suffix, nil
}
func NormalizeDstAddrWithSuffix(ctx context.Context, srv *tsnet.Server, dst string) (string, bool, error) {
host, port, err := net.SplitHostPort(dst)
if err != nil {