From 5b70e0ea43ea3b17907f261ddff2f11a5137b006 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 20 Feb 2026 19:16:54 +0000 Subject: [PATCH] Resolve domain names in NAT1To1IP and MediaNAT1To1IP config Previously, these fields only accepted literal IP addresses via netip.ParseAddr. Add resolveAddrOrHost helper that first tries parsing as a literal IP, then falls back to DNS resolution via net.LookupHost, returning the first IPv4 result. https://claude.ai/code/session_011bUzCCC8jboSXZdeRWM2w4 --- pkg/sip/config.go | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/pkg/sip/config.go b/pkg/sip/config.go index bacf3405..8e463068 100644 --- a/pkg/sip/config.go +++ b/pkg/sip/config.go @@ -38,7 +38,7 @@ func GetServiceConfig(conf *config.Config) (*ServiceConfig, error) { return nil, err } } else if conf.NAT1To1IP != "" { - ip, err := netip.ParseAddr(conf.NAT1To1IP) + ip, err := resolveAddrOrHost(conf.NAT1To1IP) if err != nil { return nil, err } @@ -55,7 +55,7 @@ func GetServiceConfig(conf *config.Config) (*ServiceConfig, error) { return nil, err } } else if conf.MediaNAT1To1IP != "" && conf.MediaNAT1To1IP != conf.NAT1To1IP { - ip, err := netip.ParseAddr(conf.MediaNAT1To1IP) + ip, err := resolveAddrOrHost(conf.MediaNAT1To1IP) if err != nil { return nil, err } @@ -81,6 +81,24 @@ func getPublicIP() (netip.Addr, error) { return netip.Addr{}, errors.Errorf("could not resolve external IP: %v", err) } +func resolveAddrOrHost(addrOrHost string) (netip.Addr, error) { + // Try parsing as a literal IP address first. + if ip, err := netip.ParseAddr(addrOrHost); err == nil { + return ip, nil + } + // Fall back to DNS resolution for domain names. + ips, err := net.LookupHost(addrOrHost) + if err != nil { + return netip.Addr{}, fmt.Errorf("failed to resolve %q: %w", addrOrHost, err) + } + for _, ipStr := range ips { + if ip, err := netip.ParseAddr(ipStr); err == nil && ip.Is4() { + return ip, nil + } + } + return netip.Addr{}, fmt.Errorf("no IPv4 address found for %q", addrOrHost) +} + func getLocalIP(localNet string) (netip.Addr, error) { ifaces, err := net.Interfaces() if err != nil {