{"record":{"id":"f852fd3c10ebbf36","repo":"cloudflare/cloudflared","slug":"failed-to-determine-ipv6-source-address-for-icmp-p","errorCode":null,"errorMessage":"failed to determine IPv6 source address for ICMP proxy","messagePattern":"failed to determine IPv6 source address for ICMP proxy","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/cloudflared/tunnel/configuration.go","lineNumber":379,"sourceCode":"\n\ticmpRouter, err := ingress.NewICMPRouter(ipv4Src, ipv6Src, logger, icmpFunnelTimeout)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn icmpRouter, nil\n}\n\nfunc determineICMPSources(c *cli.Context, logger *zerolog.Logger) (netip.Addr, netip.Addr, error) {\n\tipv4Src, err := determineICMPv4Src(c.String(flags.ICMPV4Src), logger)\n\tif err != nil {\n\t\treturn netip.Addr{}, netip.Addr{}, errors.Wrap(err, \"failed to determine IPv4 source address for ICMP proxy\")\n\t}\n\n\tlogger.Info().Msgf(\"ICMP proxy will use %s as source for IPv4\", ipv4Src)\n\n\tipv6Src, zone, err := determineICMPv6Src(c.String(flags.ICMPV6Src), logger, ipv4Src)\n\tif err != nil {\n\t\treturn netip.Addr{}, netip.Addr{}, errors.Wrap(err, \"failed to determine IPv6 source address for ICMP proxy\")\n\t}\n\n\tif zone != \"\" {\n\t\tlogger.Info().Msgf(\"ICMP proxy will use %s in zone %s as source for IPv6\", ipv6Src, zone)\n\t} else {\n\t\tlogger.Info().Msgf(\"ICMP proxy will use %s as source for IPv6\", ipv6Src)\n\t}\n\n\treturn ipv4Src, ipv6Src, nil\n}\n\nfunc determineICMPv4Src(userDefinedSrc string, logger *zerolog.Logger) (netip.Addr, error) {\n\tif userDefinedSrc != \"\" {\n\t\taddr, err := netip.ParseAddr(userDefinedSrc)\n\t\tif err != nil {\n\t\t\treturn netip.Addr{}, err\n\t\t}\n\t\tif addr.Is4() {","sourceCodeStart":361,"sourceCodeEnd":397,"githubUrl":"https://github.com/cloudflare/cloudflared/blob/2253eeeb25a44a713a4b60b8ba1e1b3f377d1a0f/cmd/cloudflared/tunnel/configuration.go#L361-L397","documentation":"The IPv6 counterpart of determineICMPSources: determineICMPv6Src fails to resolve the IPv6 source address (and optional zone) for the ICMP proxy, using the already-resolved IPv4 source as a hint. The failure is wrapped as 'failed to determine IPv6 source address for ICMP proxy' and aborts ICMP router creation.","triggerScenarios":"Enabling ICMP proxying on a host with no global IPv6 address, or an invalid --icmpv6-src value (bad address or nonexistent zone like 'eth9').","commonSituations":"Hosts with only link-local IPv6 and no global address; specifying a zone that doesn't exist; IPv4-only servers; firewalls/network policies disabling IPv6.","solutions":["Set an explicit valid source: --icmpv6-src <valid-global-ipv6> (optionally %zone).","Ensure the host has a routable IPv6 address (ip -6 addr show).","Fix or remove a bad --icmpv6-src / zone value.","If the environment is IPv4-only, rely on the IPv4 path only and avoid forcing IPv6 ICMP."],"exampleFix":"// before\ncloudflared tunnel run --icmpv6-src fe80::1%eth9 my-tunnel\n// after\ncloudflared tunnel run --icmpv6-src 2001:db8::10%eth0 my-tunnel","handlingStrategy":"validation","validationCode":"// verify a routable IPv6 source exists before enabling ICMP\nfunc hasIPv6Source(src string) error {\n\taddr, err := netip.ParseAddr(strings.Split(src, \"%\")[0])\n\tif err != nil { return err }\n\tif !addr.Is6() || addr.IsLinkLocalUnicast() && src == \"\" {\n\t\treturn fmt.Errorf(\"%s is not a usable global IPv6 source\", src)\n\t}\n\treturn nil\n}","typeGuard":null,"tryCatchPattern":"ipv6Src, zone, err := determineICMPv6Src(c.String(flags.ICMPV6Src), logger, ipv4Src)\nif err != nil {\n\treturn netip.Addr{}, netip.Addr{}, errors.Wrap(err, \"failed to determine IPv6 source address for ICMP proxy\")\n}","preventionTips":["Set --icmpv6-src explicitly on dual-stack or multi-interface hosts","Confirm a global (not link-local) IPv6 address exists via `ip -6 addr`","Validate the zone suffix matches a real interface name","Accept IPv4-only ICMP in IPv4-only environments"],"tags":["network","icmp","ipv6","configuration"],"backgroundTag":"invalid-config-value","analyzedSha":"2253eeeb25a44a713a4b60b8ba1e1b3f377d1a0f","analyzedAt":"2026-09-06T04:14:33.757Z","contentChangedAt":"2026-09-06T04:14:33.757Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}