{"record":{"id":"800fb88a54b09f37","repo":"TechnitiumSoftware/DnsServer","slug":"failed-to-resolve-forwarder-domain-name-for-all-co","errorCode":null,"errorMessage":"Failed to resolve forwarder domain name for all conditional forwarders: {forwarders}","messagePattern":"Failed to resolve forwarder domain name for all conditional forwarders: (.+?)","errorType":"exception","errorClass":"DnsServerException","httpStatus":null,"severity":"error","filePath":"DnsServerCore/Dns/DnsServer.cs","lineNumber":5456,"sourceCode":"\n                        conditionalForwarderGroups[forwarder.Priority] = conditionalForwardersEntry;\n                    }\n                }\n            }\n\n            if (conditionalForwarderGroups.Count < 1)\n            {\n                List<NameServerAddress> forwarders = new List<NameServerAddress>(conditionalForwarders.Count);\n\n                foreach (DnsResourceRecord conditionalForwarder in conditionalForwarders)\n                {\n                    if (conditionalForwarder.Type != DnsResourceRecordType.FWD)\n                        continue;\n\n                    forwarders.Add((conditionalForwarder.RDATA as DnsForwarderRecordData).NameServer);\n                }\n\n                throw new DnsServerException(\"Failed to resolve forwarder domain name for all conditional forwarders: \" + forwarders.Join(), lastResolverException);\n            }\n\n            if (conditionalForwarderGroups.Count == 1)\n            {\n                foreach (KeyValuePair<byte, List<DnsResourceRecord>> conditionalForwardersEntry in conditionalForwarderGroups)\n                    return await ConcurrentConditionalForwarderResolveAsync(question, eDnsClientSubnet, advancedForwardingClientSubnet, dnsCache, conditionalForwardersEntry.Value, skipDnsAppAuthoritativeRequestHandlers);\n            }\n\n            List<byte> priorities = new List<byte>(conditionalForwarderGroups.Keys);\n            priorities.Sort();\n\n            using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource())\n            {\n                CancellationToken currentCancellationToken = cancellationTokenSource.Token;\n\n                DnsDatagram lastResponse = null;\n                Exception lastException = null;\n","sourceCodeStart":5438,"sourceCodeEnd":5474,"githubUrl":"https://github.com/TechnitiumSoftware/DnsServer/blob/d0484b6c1e7439cdc53d67d81e9c876cda2ad756/DnsServerCore/Dns/DnsServer.cs#L5438-L5474","documentation":"Thrown by the conditional-forwarder resolution path when, after attempting to resolve the configured conditional forwarders' nameserver domain names, none produced a usable group (conditionalForwarderGroups.Count < 1). lastResolverException carries the underlying cause.","triggerScenarios":"A zone set up as a conditional forwarder (FWD record) whose nameserver hostname cannot be resolved, for every conditional forwarder in the group; misconfigured FWD records pointing at nonexistent NS hostnames.","commonSituations":"Conditional forwarder for an internal domain whose NS hostname only resolves inside a VPN the server is not on; migrated internal domain with stale FWD targets; circular dependency between conditional forwarders and the root resolver.","solutions":["Use an IP address for the FWD record's nameserver instead of a hostname.","Ensure the NS hostname for the conditional forwarder is resolvable by the server's bootstrap path.","Inspect the inner exception (lastResolverException) and the resolver log to find which forwarder failed and why.","Remove or correct stale conditional forwarder records for zones that no longer exist."],"exampleFix":"// before\nfwdRecord.NameServer = new NameServerAddress(\"ad-dc.corp.internal\");\n\n// after\nfwdRecord.NameServer = new NameServerAddress(\"10.0.10.5:53\");  // AD DC IP","handlingStrategy":"fallback","validationCode":"// Ensure each conditional forwarder NS is resolvable up-front\nasync Task<bool> CfwdResolvesAsync(IEnumerable<DnsResourceRecord> cfwd)\n{\n    foreach (var r in cfwd.Where(r => r.Type == DnsResourceRecordType.FWD))\n    {\n        var ns = (r.RDATA as DnsForwarderRecordData).NameServer;\n        if (!ns.IsIPEndPoint && (await System.Net.Dns.GetHostAddressesAsync(ns.Host)).Length == 0) return false;\n    }\n    return true;\n}","typeGuard":null,"tryCatchPattern":"try { await server.ResolveAsync(q); }\ncatch (DnsServerException ex) when (ex.Message.Contains(\"Failed to resolve forwarder domain name for all conditional forwarders\")) { log.Error(\"Check conditional forwarder NS hostnames or use IPs\", ex); }","preventionTips":["Use IPs for conditional forwarder NS targets.","Keep conditional forwarder hostnames resolvable via the bootstrap path.","Clean up stale FWD records after migrations."],"tags":["conditional-forwarder","recursion","name-resolution","zone"],"backgroundTag":null,"analyzedSha":"d0484b6c1e7439cdc53d67d81e9c876cda2ad756","analyzedAt":"2026-08-13T22:57:35.508Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}