Nameserver01 (nameserver01)
Status: Final
Purpose
- Detect whether authoritative nameservers also behave as recursors.
Preconditions And Inputs
- Preconditions:
- A
zone.Zoneobject is available.
- A
- Required inputs:
- Nameserver addresses from
methods.Method4and5. - Three hardcoded probe names:
xn--nameservertest.iis.sexn--nameservertest.icann.orgxn--nameservertest.ripe.net
Aquery responses from each nameserver.
- Nameserver addresses from
- Profile/config knobs that affect behavior:
net.ipv4andnet.ipv6: disabled transports are skipped with transport debug tags.resolver.defaults.parallel: parallel nameserver query fanout.
Algorithm And Decision Flow
- Emit
TEST_CASE_START. - Read nameserver list from
Method4and5. - For each nameserver (parallelized, input-order merged logs):
- If transport is disabled, emit
IPV4_DISABLEDorIPV6_DISABLEDfor rrtypeA, then skip this nameserver. - Initialize counters:
responseCount,nxdomainCount,hasSeenRA,allNxdomainAA=true, andisNoRecursor=true. - For each probe name:
- Query
A. - If no DNS message is returned, emit
NO_RESPONSE(ns,domain), setisNoRecursor=false, and continue. - Increment
responseCount. - If response has
RA=1, sethasSeenRA=true. - If response
RCODEisNXDOMAIN, incrementnxdomainCount. If the response does not haveAA=1, setallNxdomainAA=false.
- Query
- If
hasSeenRA=true, record server as recursor and setisNoRecursor=false. - Else if
responseCount>0andnxdomainCount==responseCountandallNxdomainAA==false, record server as recursor and setisNoRecursor=false. - If
isNoRecursoris still true, record server as non-recursor.
- If transport is disabled, emit
- After all parallel tasks, emit a single consolidated
IS_A_RECURSORwithserverslist (if any), and a single consolidatedNO_RECURSORwithserverslist (if any). - Emit
TEST_CASE_END.
Emitted Tags (Possible Set)
| Tag | Emitted when |
|---|---|
IPV4_DISABLED | IPv4 nameserver evaluation is skipped because IPv4 is disabled. |
IPV6_DISABLED | IPv6 nameserver evaluation is skipped because IPv6 is disabled. |
IS_A_RECURSOR | Nameserver set RA=1 on at least one probe response, or all received probe responses were NXDOMAIN without all having AA=1. |
NO_RECURSOR | Nameserver produced responses but did not match recursor criteria and had no NO_RESPONSE for probes. |
NO_RESPONSE | A probe query returned no DNS message. |
TEST_CASE_END | Testcase completion marker is emitted. |
TEST_CASE_START | Testcase start marker is emitted. |
Tag Arguments
| Tag | Argument key | Type | Meaning |
|---|---|---|---|
IPV4_DISABLED | ns | string | Nameserver identity (ns name only; use address for IP) skipped on IPv4. |
IPV4_DISABLED | address | string | Nameserver IP address for the same endpoint. |
IPV4_DISABLED | rrtype | string | rrtype skipped (A). |
IPV6_DISABLED | ns | string | Nameserver identity (ns name only; use address for IP) skipped on IPv6. |
IPV6_DISABLED | address | string | Nameserver IP address for the same endpoint. |
IPV6_DISABLED | rrtype | string | rrtype skipped (A). |
IS_A_RECURSOR | servers | array<object> | Structured sorted list of nameservers classified as recursors ({ns}, {address} items). |
NO_RECURSOR | servers | array<object> | Structured sorted list of nameservers classified as non-recursors ({ns}, {address} items). |
NO_RESPONSE | ns | string | Nameserver identity (ns name only; use address for IP) with missing response. |
NO_RESPONSE | address | string | Nameserver IP address for the same endpoint. |
NO_RESPONSE | domain | string | Probe name queried. |
TEST_CASE_END | testcase | string | Testcase display name (Nameserver01). |
TEST_CASE_START | testcase | string | Testcase display name (Nameserver01). |
Severity Levels Per Tag
| Tag | Level | Notes |
|---|---|---|
IPV4_DISABLED | DEBUG | Default from share/profile.json (test_levels.NAMESERVER). |
IPV6_DISABLED | DEBUG | Default from share/profile.json (test_levels.NAMESERVER). |
IS_A_RECURSOR | ERROR | Default from share/profile.json (test_levels.NAMESERVER). |
NO_RECURSOR | INFO | Default from share/profile.json (test_levels.NAMESERVER). |
NO_RESPONSE | DEBUG | Default from share/profile.json (test_levels.NAMESERVER). |
TEST_CASE_END | DEBUG | Default from share/profile.json (test_levels.NAMESERVER). |
TEST_CASE_START | DEBUG | Default from share/profile.json (test_levels.NAMESERVER). |
Differences From Upstream
- Upstream reference:
nameserver01.md - Differences (Upstream vs Gonemaster):
- Upstream: describes evaluation over the retrieved nameserver IP set. Gonemaster: iterates the raw
Method4and5list without testcase-local deduplication, so duplicatename/ipentries can be evaluated more than once. - Upstream: does not explicitly describe testcase boundary and transport-disabled debug emissions. Gonemaster: emits
TEST_CASE_START,TEST_CASE_END,IPV4_DISABLED, andIPV6_DISABLED. - Upstream: classifies a server as a recursor when all probe responses are
NXDOMAIN, regardless of theAAflag. Gonemaster: excludes servers from recursor classification when allNXDOMAINresponses also haveAA=1, since this indicates the server claims authoritative knowledge (e.g. a fake root zone) rather than performing recursion. Reported upstream.
- Upstream: describes evaluation over the retrieved nameserver IP set. Gonemaster: iterates the raw
- Potential upstream report:
no
Edge Cases And Limitations
- A nameserver can emit both
NO_RESPONSE(for one or more probes) andIS_A_RECURSOR(from other probe responses) in the same testcase run. - Up to three
NO_RESPONSEentries can be emitted per nameserver (one per probe name). - If transport is disabled for a nameserver, no recursor classification tags are emitted for that nameserver.
- A nameserver that claims to be authoritative for the root zone (responds with
AA=1andNXDOMAINto all probes) is not classified as a recursor, since theNXDOMAINresponses come from fake authoritative data rather than recursive resolution.