I do not believe that there is a outright statement in the standards documents (at least not the original DNS RFCs) of how to deal with this particular scenario.
That said, over the years the consensus has more or less become that REFUSED
is the best option out of what tools we have available.
I'll outline some thoughts on some of the different options below:
The options outlined in the question
Blackhole the query entirely
This is bad for the operator of the authoritative server as this approach would make the server appear to be down, opening for scenarios where recursing servers have observed it repeatedly not answering their queries and give up on it entirely, regardless the QNAME
.
It's also bad from the client perspective as it may lead to waiting until some timeout expires rather than quickly getting an error.
(I would consider this the worst option.)
Return a non-authoritative NXDOMAIN
response
This is not in line with how NXDOMAIN
is otherwise used. NXDOMAIN
is used to indicate that you know that a name does not exist, not that you do not know anything about the name.
Return a non-authoritative NOERROR
response (this is silly, but I mention it for completeness)
First of all, I'll note that the "referral to the root" alternative is a special case of this one.
The argument against NXDOMAIN
applies to NODATA
(NOERROR
+ SOA
in authority section) as well with only minor adjustment; it's a status which is used to indicate that you know that there is no such RRset, not that you lack knowledge.
Additionally, NODATA
suggests that you know that this name exists in some shape or form (eg, it may have records of other types or it may be an empty non-terminal).
NOERROR
indicates that the query was considered valid and answerable, so there should be some form of answer. If this a query that cannot be answered, NOERROR
seems like a bad fit.
Return a canned referral to the root nameservers (this is even sillier)
This was a very common way of dealing with this in the past. The contents of the answer are not useful per se but it is a validly formed referral response that at least makes it clear that the queried server doesn't know about that name.
(I think this is probably the least silly form of NOERROR
use in this context.)
Other options
Status REFUSED
REFUSED
is generally considered the best approach, indicates that the server is configured not to answer this query. Overall a good fit, whether or not it's not explicitly mandated that it must be used in this particular case.
Status SERVFAIL
Also used by some server implementations.
Less clear than REFUSED
in that it doesn't clearly indicate that the non-answer is deliberate; SERVFAIL
is normally used for unexpected errors encountered when processing valid queries.