This article walks through each layer where a delegated hostname can fail in an internal network setting, in the order they occur, with commands for both Windows DNS and BIND/Linux. Work through the stages in sequence — later stages assume the earlier ones passed.
If you have not yet created your delegation, start with Connecting your domain to LXP / Learn instead.
Prerequisites — check these first
A delegation only works if your DNS servers can reach the nameservers you delegated to. Two requirements are easy to miss:
Requirement | Detail |
Outbound DNS from your DNS servers | UDP and TCP port 53, from every DNS server authoritative for your domain, to Cloudflare's nameserver addresses |
Both nameservers delegated | Two |
Cloudflare's authoritative nameservers are anycast. The ranges containing them are:
108.162.192.0/18
172.64.0.0/13
173.245.48.0/20
Important: DNS forwarders do not satisfy this requirement. When your DNS server is authoritative for yourdomain.com and encounters a delegation for a hostname inside it, it queries the delegated nameservers directly. Forwarders are only consulted for names outside its authoritative zones. A server with correct forwarders and no direct egress will resolve the entire internet normally and fail on every delegated subdomain.
This is the single most common cause of a correct delegation not working.
Start here: classify the symptom
The diagnostic path depends entirely on what you are seeing. Find your symptom below and go to the stage indicated.
What you see | What it means | Go to |
Cloudflare "Error 1034 — Edge IP Restricted" | DNS resolved, but to an address that does not serve your hostname | Stage 1 |
SERVFAIL / "DNS server failure" | A resolver received the query and answered with a failure | Stage 3, then 4 |
Timeout / "the timeout period expired" | Nothing answered the query at all | Stage 2 |
NXDOMAIN / "does not exist" | No record exists at that name | Stage 1 |
Works externally, fails on the corporate network | Your internal zone differs from public DNS | Stage 1 (internal) |
Certificate warning, connection reset, or a block page | DNS is working; the failure is at the web layer | Stage 6 |
Intermittent or partial failures | Often TCP/53 fallback being blocked | Stage 2 |
Stage 0 — Clear caches
A correct change that appears not to work is usually a stale cache. Do this before anything else, and allow the previousrecord's TTL to expire before drawing conclusions.
Windows — on each DNS server, then a test workstation:
Clear-DnsServerCache
ipconfig /flushdns
BIND / Linux — on the DNS server, then a test client:
sudo rndc flush # BIND
sudo unbound-control flush_zone <yourdomain> # Unbound
sudo resolvectl flush-caches # systemd-resolved client
Stage 1 — Confirm the delegation exists, in both places
If your organization runs internal DNS that is authoritative for your domain — most banks and credit unions do — you have two authoritative sources and both must be correct. Machines on your corporate network never consult public DNS for your own domain.
Read the internal zone directly
Windows — on a domain controller. -Name is the label relative to the zone, not the FQDN:
Get-DnsServerResourceRecord -ZoneName yourdomain.com -Name learn
For learn.yourdomain.com, -ZoneName is yourdomain.com and -Name is learn. Passing the full hostname to -Name will look for learn.yourdomain.com.yourdomain.com and report nothing found.
If the hostname was created as its own zone, -ZoneName is the full hostname and -Name is @. List your zones to check:
Get-DnsServerZone
BIND / Linux — query the authoritative server directly, and list the zones it serves:
dig @<internal-dns-ip> learn.yourdomain.com NS +norecurse
named-checkconf -p | grep -A2 '^zone'
+norecurse matters. Without it you may get a cached or recursively resolved answer rather than what the zone actually contains. You can also inspect the zone file directly, or dump the running configuration with rndc dumpdb -zones and read /var/named/data/cache_dump.db.
Confirm public DNS agrees
Resolve-DnsName learn.yourdomain.com -Type NS -Server 1.1.1.1 -DnsOnly
dig @1.1.1.1 learn.yourdomain.com NS
What you should see
Result | Verdict |
Two | ✅ Correct |
One | ⚠️ Incomplete — add the second |
An | ❌ Not supported. See the setup article. |
A | ❌ Not supported — this causes Error 1034 |
Nothing, or an error | ❌ The delegation is missing from this zone |
Internal and public disagree | ❌ Fix the internal zone |
Check the nameserver hostnames for typos
A single-character error produces a delegation that looks perfect and never resolves. cloudfare (missing the l) is the classic. Confirm each nameserver you delegated to actually resolves:
Resolve-DnsName josh.ns.cloudflare.com -Server 1.1.1.1
dig @1.1.1.1 josh.ns.cloudflare.com A
If a nameserver hostname does not resolve, correct the spelling in your NS records.
Stage 2 — Confirm your DNS server can reach Cloudflare
Run these on the DNS server, not a workstation. The workstation never queries Cloudflare — your DNS server does the recursion, so its egress path is the one that matters.
Test UDP/53 — the primary transport
Resolve-DnsName learn.yourdomain.com -Server josh.ns.cloudflare.com Resolve-DnsName learn.yourdomain.com -Server sue.ns.cloudflare.com
dig @josh.ns.cloudflare.com learn.yourdomain.com dig @sue.ns.cloudflare.com learn.yourdomain.com
Test TCP/53 — the fallback transport
Test-NetConnection josh.ns.cloudflare.com -Port 53
dig @josh.ns.cloudflare.com learn.yourdomain.com +tcp
Note that Test-NetConnection -Port tests TCP only. A successful PingSucceeded with TcpTestSucceeded : False means routing is fine and port 53 is being dropped — it does not tell you anything about UDP, which is why both tests above are needed.
Interpreting the results
UDP | TCP | Diagnosis | Action |
✅ | ✅ | Egress is fine | Go to Stage 3 |
✅ | ❌ | Fallback blocked. Causes intermittent failures on large or DNSSEC-signed responses. | Open TCP/53 |
❌ | ❌ | DNS egress blocked. Most common cause. | Open UDP+TCP/53 |
❌ | ✅ | Unusual — check for a UDP-specific policy or DNS inspection appliance | Open UDP/53 |
If ICMP succeeds while port 53 fails, you have a firewall permitting ping and dropping DNS. That is a policy decision, not a fault.
The firewall request
Source: All DNS servers authoritative for yourdomain.com
Destination: 108.162.192.0/18, 172.64.0.0/13, 173.245.48.0/20
Ports: UDP 53 and TCP 53
Direction: Outbound only — no inbound rule required
If egress cannot be opened
A conditional forwarder for the specific hostname, pointing at a resolver that already has permitted egress, is a supported alternative.
Remove the NS delegation if you do this. Authoritative zone data generally takes precedence over a conditional forwarder, so leaving both in place risks the forwarder never being consulted.
Windows: DNS Manager → Conditional Forwarders → New, scoped to
learn.yourdomain.comBIND:
zone "learn.yourdomain.com" { type forward; forward only; forwarders { 1.1.1.1; }; };
This approach should work, but we are unable to assist with its diagnosis.
Stage 3 — Test end-to-end resolution
With the delegation in place and egress open, resolution should complete.
Resolve-DnsName learn.yourdomain.com -DnsOnly -NoHostsFile
dig learn.yourdomain.com
-DnsOnly and -NoHostsFile suppress the hosts file, LLMNR, and NetBIOS so you see the actual DNS answer. dig never consults those sources.
Trace the full delegation chain
This is the most informative diagnostic available to you. It walks the delegation from the root and shows exactly where it stops.
BIND / Linux:
dig learn.yourdomain.com +trace
Read it top down. You should see referrals from the root, to the TLD, to your domain's nameservers, then to the Cloudflare nameservers, then a final answer. The last successful step tells you which layer is failing. If the trace stops at your own nameservers, the delegation is not being served. If it reaches Cloudflare and stalls, egress or DNSSEC is the issue.
Windows — there is no +trace equivalent, so walk the chain manually. Each step queries the nameservers returned by the previous one:
# 1. Who is authoritative for your domain?
Resolve-DnsName yourdomain.com -Type NS -Server 1.1.1.1 -DnsOnly
# 2. Ask those nameservers about the delegated hostname.
# Substitute a nameserver returned by step 1. Resolve-DnsName learn.yourdomain.com -Type NS -Server <ns-from-step-1> -DnsOnly
# 3. Ask the Cloudflare nameservers returned by step 2 directly.
Resolve-DnsName learn.yourdomain.com -Server josh.ns.cloudflare.com -DnsOnly
The step that fails is the layer to investigate. Failure at step 2 means your nameservers are not serving the delegation; failure at step 3 means egress or DNSSEC.
For a genuine +trace, dig is available for Windows via BIND Tools, or you can run the trace from any Linux or macOS host and compare its result against your internal one.
Stage 4 — Rule out DNSSEC
If your domain is DNSSEC-signed, a mismatch at the delegation point produces SERVFAIL while every record looks correct.
Check for DS records and signed responses
Windows:
Resolve-DnsName learn.yourdomain.com -DnssecOk -Server 1.1.1.1
Resolve-DnsName learn.yourdomain.com -Type DS -Server 1.1.1.1
Resolve-DnsName yourdomain.com -Type DS -Server 1.1.1.1
BIND / Linux:
dig @1.1.1.1 learn.yourdomain.com +dnssec
dig @1.1.1.1 learn.yourdomain.com DS
dig @1.1.1.1 yourdomain.com DS
Compare against resolution with validation bypassed
This is the decisive test — if the query succeeds with validation off and fails with it on, DNSSEC is your problem.
BIND / Linux:
dig @1.1.1.1 learn.yourdomain.com +cd
Windows — Resolve-DnsName has no checking-disabled flag, so inspect your validation configuration instead:
Get-DnsServerDnsSecZoneSetting -ZoneName yourdomain.com
Get-DnsServerTrustAnchor -Name yourdomain.com
Get-DnsServerSetting -All | Select-Object EnableDnsSec
If you have no Linux host available, running the +cd comparison from any external machine is a valid substitute — the question is whether the record set validates, which is not specific to your network.
Common causes are a DS record published for the delegated hostname that does not match, or a stale DS or trust anchor left behind from a previous configuration.
Note that a delegated subdomain generally should not carry its own DS record unless we have explicitly provided one.
Stage 5 — Rule out something shadowing the delegation
A delegation can be present and correct while another configuration takes precedence over it.
Look for competing zones and forwarders
Windows:
Get-DnsServerZone | Where-Object { $_.ZoneType -ne 'Primary' }
Get-DnsServerForwarder
Get-DnsServerZoneDelegation -Name yourdomain.com
BIND / Linux:
named-checkconf -p | grep -B1 -A4 'type forward\|type stub'
named-checkconf -p | grep -A2 'zone "learn'
grep -rn "learn\|response-policy" /etc/named.conf /etc/named/ /etc/bind/
Inspect what the server has actually cached
Windows:
Show-DnsServerCache | Where-Object { $_.RecordName -like '*learn*' }BIND / Linux:
sudo rndc dumpdb -cache sudo grep -i "learn" /var/named/data/cache_dump.db
For Unbound, use unbound-control dump_cache | grep -i learn instead.
Things to look for:
A conditional forwarder or stub zone for
yourdomain.comthat does not know about thelearndelegationA separate internal zone named
learn.yourdomain.comcontaining anArecordA wildcard record in the parent zone
Response Policy Zones (RPZ) or DNS filtering rewriting the answer
Any of these will win over the delegation and produce a wrong or failing answer.
Stage 6 — DNS resolves, but the site still fails
If resolution now returns Cloudflare addresses and the site still does not load, the problem is at the web layer.
Check what you resolved to
Windows:
Resolve-DnsName learn.yourdomain.com -DnsOnly
BIND / Linux:
dig learn.yourdomain.com +short
Expected: two or three addresses in Cloudflare's proxy ranges — typically 104.x, 172.6x, or 188.114.x.
If you see an address ending in .126, or any address that josh.ns.cloudflare.com resolves to, something is still returning a nameserver address. Return to Stage 1 and Stage 5.
Test HTTPS reachability
Windows:
Test-NetConnection learn.yourdomain.com -Port 443
Invoke-WebRequest https://learn.yourdomain.com/cdn-cgi/trace -UseBasicParsing | Select-Object -ExpandProperty Content
BIND / Linux:
nc -vz learn.yourdomain.com 443
curl -sv https://learn.yourdomain.com/cdn-cgi/trace
The /cdn-cgi/trace endpoint returns the Cloudflare colo that served you and the source IP Cloudflare observed. It is a fast way to confirm you reached Cloudflare's edge at all.
Common web-layer causes
Symptom | Likely cause |
Error 1034 — Edge IP Restricted | Resolution reached a Cloudflare address not authorised for your hostname. A static record still exists somewhere. See Stage 1. |
Certificate warning naming your own CA | TLS inspection appliance. The hostname may need to be added to an inspection bypass list. |
Connection reset or hang on 443 | HTTPS egress blocked, or a proxy requiring explicit configuration |
Corporate block page | URL filtering category. The hostname needs allowlisting. |
Site loads but assets fail | Content filtering on specific paths, or a proxy stripping headers |
A note on Error 1034 and Ray IDs
Error 1034 is rejected at Cloudflare's edge before the request is associated with our zone. This means the Ray ID shown on the error page cannot be located in our logs, and we cannot look it up for you. This is expected for this error class and is not a sign of a spoofed page — but it does mean the diagnosis has to come from your side's DNS configuration rather than from our logs.
What to send us
If you have worked through the stages and are still stuck, send the following and we will pick it up from there:
Output of
Get-DnsServerResourceRecord(or the equivalentdig +norecurse) from your internal DNS serverOutput of the same query against
1.1.1.1Results of the Stage 2 UDP and TCP tests, run on the DNS server, with the server's IP address
dig learn.yourdomain.com +traceif you have a Linux host availableA full-page screenshot of any error page, including the Ray ID and footer
Whether the hostname worked previously, and roughly when it stopped
Item 3 is the one most often missing and most often decisive. Please run it on the DNS server rather than a workstation.
Quick reference
Symptom | Most likely cause | Stage |
Timeout from the DNS server | DNS egress blocked | 2 |
SERVFAIL | Egress blocked, or DNSSEC | 2, 4 |
NXDOMAIN | Delegation missing from this zone | 1 |
Error 1034 | A static record still in place somewhere | 1, 5 |
Works off-network only | Internal zone missing the delegation | 1 |
Intermittent failures | TCP/53 fallback blocked | 2 |
Certificate warnings | TLS inspection | 6 |
Resolves to a | A nameserver address is being returned as a web endpoint | 1, 5 |
