From 4d5b7e9c14a929814fd4f9a20e0d78253e33aab1 Mon Sep 17 00:00:00 2001 From: Kristoffer Dalby Date: Wed, 6 Aug 2025 08:41:43 +0200 Subject: [PATCH] derp: allow override to ip for debug Signed-off-by: Kristoffer Dalby --- hscontrol/derp/server/derp_server.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/hscontrol/derp/server/derp_server.go b/hscontrol/derp/server/derp_server.go index fee395f1..7ced0ba7 100644 --- a/hscontrol/derp/server/derp_server.go +++ b/hscontrol/derp/server/derp_server.go @@ -20,6 +20,7 @@ import ( "github.com/juanfont/headscale/hscontrol/util" "github.com/rs/zerolog/log" "tailscale.com/derp" + "tailscale.com/envknob" "tailscale.com/net/stun" "tailscale.com/net/wsconn" "tailscale.com/tailcfg" @@ -35,6 +36,11 @@ const ( DerpVerifyScheme = "headscale-derp-verify" ) +// debugUseDERPIP is a debug-only flag that causes the DERP server to resolve +// hostnames to IP addresses when generating the DERP region configuration. +// This is useful for integration testing where DNS resolution may be unreliable. +var debugUseDERPIP = envknob.Bool("HEADSCALE_DEBUG_DERP_USE_IP") + type DERPServer struct { serverURL string key key.NodePrivate @@ -70,7 +76,10 @@ func (d *DERPServer) GenerateRegion() (tailcfg.DERPRegion, error) { } var host string var port int - host, portStr, err := net.SplitHostPort(serverURL.Host) + var portStr string + + // Extract hostname and port from URL + host, portStr, err = net.SplitHostPort(serverURL.Host) if err != nil { if serverURL.Scheme == "https" { host = serverURL.Host @@ -85,6 +94,19 @@ func (d *DERPServer) GenerateRegion() (tailcfg.DERPRegion, error) { return tailcfg.DERPRegion{}, err } } + + // If debug flag is set, resolve hostname to IP address + if debugUseDERPIP { + ips, err := net.LookupIP(host) + if err != nil { + log.Error().Caller().Err(err).Msgf("Failed to resolve DERP hostname %s to IP, using hostname", host) + } else if len(ips) > 0 { + // Use the first IP address + ipStr := ips[0].String() + log.Info().Caller().Msgf("HEADSCALE_DEBUG_DERP_USE_IP: Resolved %s to %s", host, ipStr) + host = ipStr + } + } localDERPregion := tailcfg.DERPRegion{ RegionID: d.cfg.ServerRegionID,