cloudflare/cloudflared · error

failed to resolve any edge address

Error message

failed to resolve any edge address

What it means

StaticEdge builds the edge address list directly from user-supplied hostnames (mainly for testing connectivity), resolving each via ResolveAddrs without SRV lookup. This error is thrown when none of the provided hostnames could be resolved to any IP address, so there is no edge address to connect to. It means the entire user-provided hostname list failed DNS resolution.

Source

Thrown at edgediscovery/allregions/regions.go:41

	edgeAddrs, err := EdgeDiscovery(log, RegionalServiceName(region))
	if err != nil {
		return nil, err
	}
	if len(edgeAddrs) < 2 {
		return nil, fmt.Errorf("expected at least 2 Cloudflare Regions regions, but SRV only returned %v", len(edgeAddrs))
	}
	return &Regions{
		region1: NewRegion(edgeAddrs[0], overrideIPVersion),
		region2: NewRegion(edgeAddrs[1], overrideIPVersion),
	}, nil
}

// StaticEdge creates a list of edge addresses from the list of hostnames.
// Mainly used for testing connectivity.
func StaticEdge(hostnames []string, log *zerolog.Logger) (*Regions, error) {
	resolved := ResolveAddrs(hostnames, log)
	if len(resolved) == 0 {
		return nil, fmt.Errorf("failed to resolve any edge address")
	}
	return NewNoResolve(resolved), nil
}

// NewNoResolve doesn't resolve the edge. Instead it just uses the given addresses.
// You probably only need this for testing.
func NewNoResolve(addrs []*EdgeAddr) *Regions {
	region1 := make([]*EdgeAddr, 0)
	region2 := make([]*EdgeAddr, 0)
	for i, v := range addrs {
		if i%2 == 0 {
			region1 = append(region1, v)
		} else {
			region2 = append(region2, v)
		}
	}

	return &Regions{

View on GitHub (pinned to 2253eeeb25)

Solutions

  1. Check the hostnames for typos and verify each resolves on this machine: 'nslookup <hostname>' (or 'getent hosts <hostname>'); correct or remove the bad entries.
  2. Fix the machine's DNS setup — /etc/resolv.conf, VPN, or corporate resolver — so at least one hostname resolves.
  3. Use literal IPs instead of hostnames when DNS is unavailable, since addresses don't need resolving.
  4. If this was used for connectivity testing, confirm the intended hostnames are the correct Cloudflare edge endpoints (port 7844) reachable from your network.

Example fix

// before
// edge-addresses = ["edge1.example.internal", "edge2.example.internal"]  // none resolve
// after
// edge-addresses = ["198.41.192.7:7844", "198.41.200.13:7844"]
Defensive patterns

Strategy: validation

Validate before calling

func allHostnamesResolve(hostnames []string) error {
    for _, h := range hostnames {
        if _, err := net.LookupHost(h); err != nil {
            return fmt.Errorf("hostname %q does not resolve: %w", h, err)
        }
    }
    return nil
}
// call before constructing the static edge config

Try / catch

regions, err := allregions.StaticEdge(hostnames, log)
if err != nil {
    if strings.Contains(err.Error(), "failed to resolve any edge address") {
        return fmt.Errorf("check --edge hostnames and this machine's DNS: %w", err)
    }
    return err
}

Prevention

When it happens

Trigger: Calling StaticEdge(hostnames, log) where ResolveAddrs returns an empty slice because every hostname in the list is unresolvable — mistyped hostnames, names absent from DNS, or a resolver that fails for all of them (len(resolved) == 0).

Common situations: Typo'd hostnames in --edge or test configuration; using internal hostnames that the machine's resolver cannot see (VPN down, split-horizon DNS); testing in an isolated network with no DNS at all; hostnames that only exist in /etc/hosts on another machine.

Related errors


AI-assisted analysis of cloudflare/cloudflared@2253eeeb25 (2026-09-06). Data as JSON: /api/errors/8de5ed5e5a58bacb. Report an issue: GitHub.