cloudflare/cloudflared · error
did not find group range in
Error message
did not find group range in %s
What it means
checkInPingGroup reads /proc/sys/net/ipv4/ping_group_range and expects contents matching a '<min> <max>' pattern. If the regex finds no group range in the file, cloudflared cannot determine whether the process group may open ping sockets and returns this error instead of proceeding.
Solutions
- Check that `cat /proc/sys/net/ipv4/ping_group_range` prints two numbers like '0 2147483647'; if missing, the kernel lacks unprivileged ping support.
- Run in a full Linux environment where /proc/sys/net/ipv4/ping_group_range is exposed (reconfigure the container to mount /proc read-write for sysctls, e.g. docker run --sysctl net.ipv4.ping_group_range='0 2147483647').
- Set the sysctl explicitly: `sudo sysctl -w net.ipv4.ping_group_range="0 2147483647"` then retry cloudflared.
- If the environment cannot expose ping_group_range, run cloudflared as root or grant CAP_NET_RAW so the unprivileged ping path is not needed.
Defensive patterns
Strategy: validation
Validate before calling
function pingGroupRangeReadable(): boolean {
try {
const v = fs.readFileSync('/proc/sys/net/ipv4/ping_group_range', 'utf8').trim();
return /^\d+\s+\d+$/.test(v);
} catch { return false; }
} Type guard
func pingGroupRangeValid() bool {
data, err := os.ReadFile("/proc/sys/net/ipv4/ping_group_range")
if err != nil { return false }
re := regexp.MustCompile(`^\s*(\d+)\s+(\d+)\s*$`)
return re.Match(data)
} Prevention
- Confirm the kernel exposes /proc/sys/net/ipv4/ping_group_range (standard since Linux 2.6.39).
- Mount /proc fully in containers; avoid hardened setups that hide this sysctl.
- Set the sysctl explicitly before starting cloudflared.
- Fall back to running as root/CAP_NET_RAW on minimal kernels lacking the sysctl.
When it happens
Trigger: testPermission -> checkInPingGroup when /proc/sys/net/ipv4/ping_group_range is unreadable, empty, or has unexpected content that doesn't match the expected `uint uint` format (found regex fails).
Common situations: Unusual or minimal kernels/containers that omit ping_group_range from procfs; mounted /proc with restricted visibility (e.g. hardened containers hiding the sysctl); malformed proc values.
Understand the failure class
Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.
Related errors
- Group ID is not between ping group to
- cannot send ICMPv4 using ICMPv6 proxy
- cannot send ICMPv6 using ICMPv4 proxy
- could not write token to configuration directory
- error determining executable path
AI-assisted analysis of cloudflare/cloudflared@2253eeeb25 (2026-09-06).
Data as JSON: /api/errors/73d6df3c14f0ddef.
Report an issue: GitHub.
Appendix: source
Thrown at ingress/icmp_linux.go:96
}
groupID := uint64(os.Getegid())
// Example content: 999 59999
found := findGroupIDRegex.FindAll(file, 2)
if len(found) == 2 {
groupMin, err := strconv.ParseUint(string(found[0]), 10, 32)
if err != nil {
return errors.Wrapf(err, "failed to determine minimum ping group ID")
}
groupMax, err := strconv.ParseUint(string(found[1]), 10, 32)
if err != nil {
return errors.Wrapf(err, "failed to determine maximum ping group ID")
}
if groupID < groupMin || groupID > groupMax {
return fmt.Errorf("Group ID %d is not between ping group %d to %d", groupID, groupMin, groupMax)
}
return nil
}
return fmt.Errorf("did not find group range in %s", pingGroupPath)
}
func (ip *icmpProxy) Request(ctx context.Context, pk *packet.ICMP, responder ICMPResponder) error {
ctx, span := responder.RequestSpan(ctx, pk)
defer responder.ExportSpan()
originalEcho, err := getICMPEcho(pk.Message)
if err != nil {
tracing.EndWithErrorStatus(span, err)
return err
}
observeICMPRequest(ip.logger, span, pk.Src.String(), pk.Dst.String(), originalEcho.ID, originalEcho.Seq)
shouldReplaceFunnelFunc := createShouldReplaceFunnelFunc(ip.logger, responder, pk, originalEcho.ID)
newFunnelFunc := func() (packet.Funnel, error) {
conn, err := newICMPConn(ip.listenIP)
if err != nil {
tracing.EndWithErrorStatus(span, err)View on GitHub (pinned to 2253eeeb25)