{"record":{"id":"2317e9e8c7d26885","repo":"hashicorp/nomad","slug":"invalid-bridge-network-subnet-ipv6-not-an-ipv6-ad","errorCode":null,"errorMessage":"invalid bridge_network_subnet_ipv6: not an IPv6 address: %s","messagePattern":"invalid bridge_network_subnet_ipv6: not an IPv6 address: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"command/agent/agent.go","lineNumber":1129,"sourceCode":"\t\tip, _, err := net.ParseCIDR(ipv4Subnet)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid bridge_network_subnet: %w\", err)\n\t\t}\n\t\t// it's a valid IP, so now make sure it is ipv4\n\t\tif ip.To4() == nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid bridge_network_subnet: not an IPv4 address: %s\", ipv4Subnet)\n\t\t}\n\t\tconf.BridgeNetworkAllocSubnet = ipv4Subnet\n\t}\n\tipv6Subnet := agentConfig.Client.BridgeNetworkSubnetIPv6\n\tif ipv6Subnet != \"\" {\n\t\tip, _, err := net.ParseCIDR(ipv6Subnet)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid bridge_network_subnet_ipv6: %w\", err)\n\t\t}\n\t\t// it's valid, so now make sure it's *not* ipv4\n\t\tif ip.To4() != nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid bridge_network_subnet_ipv6: not an IPv6 address: %s\", ipv6Subnet)\n\t\t}\n\t\tconf.BridgeNetworkAllocSubnetIPv6 = ipv6Subnet\n\t}\n\tconf.BridgeNetworkHairpinMode = agentConfig.Client.BridgeNetworkHairpinMode\n\n\tfor _, hn := range agentConfig.Client.HostNetworks {\n\t\tconf.HostNetworks[hn.Name] = hn\n\t}\n\tconf.BindWildcardDefaultHostNetwork = agentConfig.Client.BindWildcardDefaultHostNetwork\n\n\tif agentConfig.Client.NomadServiceDiscovery != nil {\n\t\tconf.NomadServiceDiscovery = *agentConfig.Client.NomadServiceDiscovery\n\t}\n\n\tartifactConfig, err := clientconfig.ArtifactConfigFromAgent(agentConfig.Client.Artifact)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid artifact config: %v\", err)\n\t}","sourceCodeStart":1111,"sourceCodeEnd":1147,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/command/agent/agent.go#L1111-L1147","documentation":"convertClientConfig validates client { bridge_network_subnet_ipv6 }: the CIDR parses but the address is not IPv6, so the bridge network subnet for allocations cannot be configured and client startup fails.","triggerScenarios":"Setting client.bridge_network_subnet_ipv6 to an IPv4 CIDR such as '10.0.0.0/24'; raised during agent start, clientConfig build, or SIGHUP reload.","commonSituations":"Swapping values between bridge_network_subnet and bridge_network_subnet_ipv6 when configuring dual-stack bridge networking; copy-paste mistakes.","solutions":["Move the IPv4 CIDR to client.bridge_network_subnet","Set client.bridge_network_subnet_ipv6 to a genuine IPv6 CIDR, e.g. 'fd00::/64'","Remove the ipv6 field if no IPv6 allocation is needed"],"exampleFix":"// before\nclient {\n  bridge_network_subnet_ipv6 = \"10.0.0.0/24\"\n}\n// after\nclient {\n  bridge_network_subnet = \"10.0.0.0/24\"\n  bridge_network_subnet_ipv6 = \"fd00::/64\"\n}","handlingStrategy":"validation","validationCode":"subnet := \"fd00::/64\"\nif ip, _, err := net.ParseCIDR(subnet); err != nil || ip.To4() != nil {\n    return fmt.Errorf(\"bridge_network_subnet_ipv6 must be an IPv6 CIDR\")\n}","typeGuard":"func isValidIPv6CIDR(s string) bool {\n    ip, _, err := net.ParseCIDR(s)\n    return err == nil && ip.To4() == nil\n}","tryCatchPattern":null,"preventionTips":["Keep IPv4 CIDRs in bridge_network_subnet only","Review dual-stack examples in Nomad docs when configuring both fields","Validate config with `nomad agent -verify-only`"],"tags":["nomad","config-validation","ipv4","ipv6"],"backgroundTag":"invalid-cidr-notation","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}