| rfc8906xml2.original.xml | rfc8906.xml | |||
|---|---|---|---|---|
| <?xml version="1.0"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
| <?rfc compact="yes" ?> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
| <?rfc symrefs="yes" ?> | ||||
| <?rfc sortrefs="yes" ?> | ||||
| <?rfc toc="yes" ?> | ||||
| <!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | ||||
| <!-- <!ENTITY rfc1033 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.1033.xml'> --> | ||||
| <!ENTITY rfc1034 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
| RFC.1034.xml'> | ||||
| <!ENTITY rfc1035 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
| RFC.1035.xml'> | ||||
| <!ENTITY rfc2671 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
| RFC.2671.xml'> | ||||
| <!ENTITY rfc3225 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
| RFC.3225.xml'> | ||||
| <!ENTITY rfc3597 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
| RFC.3597.xml'> | ||||
| <!ENTITY rfc4035 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
| RFC.4035.xml'> | ||||
| <!ENTITY rfc5001 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
| RFC.5001.xml'> | ||||
| <!ENTITY rfc6840 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
| RFC.6840.xml'> | ||||
| <!ENTITY rfc6891 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
| RFC.6891.xml'> | ||||
| <!ENTITY rfc6895 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
| RFC.6895.xml'> | ||||
| <!ENTITY rfc7314 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
| RFC.7314.xml'> | ||||
| <!ENTITY rfc7766 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
| RFC.7766.xml'> | ||||
| <!ENTITY rfc7871 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
| RFC.7871.xml'> | ||||
| <!ENTITY rfc7873 PUBLIC '' 'http://xml2rfc.ietf.org/public/rfc/bibxml/reference. | ||||
| RFC.7873.xml'> | ||||
| ]> | ||||
| <rfc ipr="trust200902" category="bcp" docName="draft-ietf-dnsop-no-response-issu | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" | |||
| e-23"> | submissionType="IETF" category="bcp" consensus="true" | |||
| docName="draft-ietf-dnsop-no-response-issue-23" number="8906" | ||||
| obsoletes="" updates="" xml:lang="en" symRefs="true" sortRefs="true" | ||||
| tocInclude="true" version="3"> | ||||
| <!-- xml2rfc v2v3 conversion 2.44.0 --> | ||||
| <front> | <front> | |||
| <title abbrev="Failure To Communicate"> | <title abbrev="Failure to Communicate"> | |||
| A Common Operational Problem in DNS Servers - Failure To Communicate | A Common Operational Problem in DNS Servers: Failure to Communicate | |||
| </title> | </title> | |||
| <seriesInfo name="RFC" value="8906"/> | ||||
| <seriesInfo name="BCP" value="231"/> | ||||
| <author initials="M." surname="Andrews" fullname="M. Andrews"> | <author initials="M." surname="Andrews" fullname="M. Andrews"> | |||
| <organization abbrev="ISC">Internet Systems Consortium</organization> | <organization abbrev="ISC">Internet Systems Consortium</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street>PO Box 360</street> | <street>PO Box 360</street> | |||
| <city>Newmarket</city> | <city>Newmarket</city> | |||
| <region>NH</region> | <region>NH</region> | |||
| <code>03857</code> | <code>03857</code> | |||
| <country>US</country> | <country>United States of America</country> | |||
| </postal> | </postal> | |||
| <email>marka@isc.org</email> | <email>marka@isc.org</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author initials="R." surname="Bellis" fullname="Ray Bellis"> | <author initials="R." surname="Bellis" fullname="Ray Bellis"> | |||
| <organization abbrev="ISC">Internet Systems Consortium</organization> | <organization abbrev="ISC">Internet Systems Consortium</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street>PO Box 360</street> | <street>PO Box 360</street> | |||
| <city>Newmarket</city> | <city>Newmarket</city> | |||
| <region>NH</region> | <region>NH</region> | |||
| <code>03857</code> | <code>03857</code> | |||
| <country>US</country> | <country>United States of America</country> | |||
| </postal> | </postal> | |||
| <email>ray@isc.org</email> | <email>ray@isc.org</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date/> | <date year="2020" month="September"/> | |||
| <abstract> | <abstract> | |||
| <t> | <t> | |||
| The DNS is a query / response protocol. Failing to respond | The DNS is a query/response protocol. Failing to respond | |||
| to queries, or responding incorrectly, causes both immediate | to queries, or responding incorrectly, causes both immediate | |||
| operational problems and long term problems with protocol | operational problems and long-term problems with protocol | |||
| development. | development. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| This document identifies a number of common kinds of queries | This document identifies a number of common kinds of queries | |||
| to which some servers either fail to respond or else respond | to which some servers either fail to respond or respond | |||
| incorrectly. This document also suggests procedures for | incorrectly. This document also suggests procedures for | |||
| zone operators to apply to identify and remediate the problem. | zone operators to apply to identify and remediate the problem. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The document does not look at the DNS data itself, just the | The document does not look at the DNS data itself, just the | |||
| structure of the responses. | structure of the responses. | |||
| </t> | </t> | |||
| </abstract> | </abstract> | |||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section anchor="intro" title="Introduction"> | <section anchor="intro" numbered="true" toc="default"> | |||
| <t> | <name>Introduction</name> | |||
| The DNS <xref target="RFC1034"/>, <xref target="RFC1035"/> | <t>The DNS <xref target="RFC1034" format="default"/> <xref | |||
| is a query / response protocol. Failing to respond to | target="RFC1035" format="default"/> is a query/response protocol. | |||
| queries, or responding incorrectly, causes both immediate | Failing to respond to queries or responding incorrectly causes both | |||
| operational problems and long term problems with protocol | immediate operational problems and long-term problems with protocol | |||
| development. | development.</t> | |||
| </t> | ||||
| <t> | <t> | |||
| Failure to respond to a query is indistinguishable from | Failure to respond to a query is indistinguishable from | |||
| packet loss without doing an analysis of query-response | packet loss without doing an analysis of query-response | |||
| patterns. Additionally failure to respond results in | patterns. Additionally, failure to respond results in | |||
| unnecessary queries being made by DNS clients, and | unnecessary queries being made by DNS clients and | |||
| introduces delays to the resolution process. | introduces delays to the resolution process. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Due to the inability to distinguish between packet loss and | Due to the inability to distinguish between packet loss and | |||
| nameservers or middle boxes dropping EDNS <xref target="RFC6891"/> | nameservers or middleboxes dropping Extension Mechanisms for DNS | |||
| (EDNS) <xref target="RFC6891" format="default"/> | ||||
| queries, packet loss is sometimes misclassified as lack of EDNS | queries, packet loss is sometimes misclassified as lack of EDNS | |||
| support which can lead to DNSSEC validation failures. | support, which can lead to DNSSEC validation failures. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The existence of servers which fail to respond to queries | The existence of servers that fail to respond to queries | |||
| results in developers being hesitant to deploy new standards. | results in developers being hesitant to deploy new standards. | |||
| Such servers need to be identified and remediated. | Such servers need to be identified and remediated. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The DNS has response codes that cover almost any conceivable | The DNS has response codes that cover almost any conceivable | |||
| query response. A nameserver should be able to respond to | query response. A nameserver should be able to respond to | |||
| any conceivable query using them. There should be no need | any conceivable query using them. There should be no need | |||
| to drop queries because a nameserver does not understand | to drop queries because a nameserver does not understand | |||
| them. | them. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Unless a nameserver is under attack, it should respond to | Unless a nameserver is under attack, it should respond to | |||
| all DNS requests directed to it. When a nameserver is under | all DNS requests directed to it. When a nameserver is under | |||
| attack it may wish to drop packets. A common attack is to | attack, it may wish to drop packets. A common attack is to | |||
| use a nameserver as an amplifier by sending spoofed packets. | use a nameserver as an amplifier by sending spoofed packets. | |||
| This is done because response packets are bigger than the | This is done because response packets are bigger than the | |||
| queries and large amplification factors are available especially | queries and large amplification factors are available, especially | |||
| if EDNS is supported. Limiting the rate of responses is | if EDNS is supported. Limiting the rate of responses is | |||
| reasonable when this is occurring and the client should | reasonable when this is occurring, and the client should | |||
| retry. This however only works if legitimate clients are | retry. However, this only works if legitimate clients are | |||
| not being forced to guess whether EDNS queries are accepted | not being forced to guess whether or not EDNS queries are accepted. As | |||
| or not. As long as there are still a pool of servers that don't | long as there is still a pool of servers that don't | |||
| respond to EDNS requests, clients have no way to know if | respond to EDNS requests, clients have no way to know if | |||
| the lack of response is due to packet loss, or EDNS packets | the lack of response is due to packet loss, EDNS packets | |||
| not being supported, or rate limiting due to the server being | not being supported, or rate limiting due to the server being | |||
| under attack. Misclassification of server behaviour is | under attack. Misclassification of server behaviour is | |||
| unavoidable when rate limiting is used until the population | unavoidable when rate limiting is used until the population | |||
| of servers which fail to respond to well-formed queries | of servers that fail to respond to well-formed queries | |||
| drops to near zero. | drops to near zero. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Nameservers should respond to queries even if the queried | Nameservers should respond to queries even if the queried | |||
| name is not for any name the server is configured to answer | name is not for any name the server is configured to answer | |||
| for. Misconfigured nameservers are a common occurrence in the | for. Misconfigured nameservers are a common occurrence in the | |||
| DNS and receiving queries for zones that the server is not | DNS, and receiving queries for zones that the server is not | |||
| configured for is not necessarily an indication that the | configured for is not necessarily an indication that the | |||
| server is under attack. Parent zone operators are advised | server is under attack. Parent zone operators are advised | |||
| to regularly check that the delegating NS records are | to regularly check that the delegating NS records are | |||
| consistent with those of the delegated zone and to correct | consistent with those of the delegated zone and to correct | |||
| them when they are not <xref target="RFC1034"/>, Section 4.4.2, | them when they are not (<xref target="RFC1034" sectionFormat="of" sectio | |||
| Paragraph 3. Doing this regularly should reduce the instances | n="4.2.2"/>, | |||
| Paragraph 3). | ||||
| Doing this regularly should reduce the instances | ||||
| of broken delegations. | of broken delegations. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| This document does not try to identify all possible errors | This document does not try to identify all possible errors | |||
| nor does it supply an exhaustive list of tests. | nor does it supply an exhaustive list of tests. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="consequences" title="Consequences"> | <section anchor="consequences" numbered="true" toc="default"> | |||
| <name>Consequences</name> | ||||
| <t> | <t> | |||
| Failure to follow the relevant DNS RFCs has multiple adverse | Failure to follow the guidance in relevant DNS RFCs has multiple adverse | |||
| consequences. Some are caused directly by the non-compliant | consequences. Some are caused directly by the non-compliant | |||
| behaviour and others as a result of work-arounds forced on | behaviour and others as a result of workarounds forced on | |||
| recursive servers. Addressing known issues now will reduce | recursive servers. Addressing known issues now will reduce | |||
| future interoperability issues as the DNS protocol continues | future interoperability issues as the DNS protocol continues | |||
| to evolve and clients make use of newly-introduced DNS | to evolve and clients make use of newly introduced DNS | |||
| features. In particular the base DNS specification | features. In particular, the base DNS specification | |||
| <xref target="RFC1034"/>, <xref target="RFC1035"/> and the | <xref target="RFC1034" format="default"/> <xref target="RFC1035" format= | |||
| EDNS specification <xref target="RFC6891"/>, when implemented, | "default"/> and the | |||
| EDNS specification <xref target="RFC6891" format="default"/>, when imple | ||||
| mented, | ||||
| need to be followed. | need to be followed. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Some examples of known consequences include: | Some examples of known consequences include the following: | |||
| <list style="symbols"> | </t> | |||
| <t> | <ul spacing="normal"> | |||
| <li> | ||||
| The AD (Authenticated Data) bit in a response | The AD (Authenticated Data) bit in a response | |||
| cannot be trusted to mean anything as some servers | cannot be trusted to mean anything, as some servers | |||
| incorrectly copy the flag bit from the request to the | incorrectly copy the flag bit from the request to the | |||
| response <xref target="RFC1035"/>, <xref target="RFC4035"/>. | response <xref target="RFC1035" format="default"/> <xref | |||
| target="RFC4035" format="default"/>. | ||||
| The use of the AD bit in requests is defined in | The use of the AD bit in requests is defined in | |||
| <xref target="RFC6840"/>. | <xref target="RFC6840" format="default"/>. | |||
| </t> | </li> | |||
| <t> | <li> | |||
| Widespread non-response to EDNS queries has led to | Widespread non-response to EDNS queries has led to | |||
| recursive servers having to assume that EDNS is not | recursive servers having to assume that EDNS is not | |||
| supported and that fallback to plain DNS is required, | supported and that fallback to plain DNS is required, | |||
| potentially causing DNSSEC validation failures. | potentially causing DNSSEC validation failures. | |||
| </t> | </li> | |||
| <t> | <li> | |||
| Widespread non-response to EDNS options requires | Widespread non-response to EDNS options requires | |||
| recursive servers to decide whether to probe | recursive servers to decide whether to probe | |||
| to see if it is the specific EDNS option or the use of | to see if it is the specific EDNS option or the use of | |||
| EDNS in general that is causing the non response. In | EDNS in general that is causing the non-response. In | |||
| the limited amount of time required to resolve a query | the limited amount of time required to resolve a query | |||
| before the client times out this is not possible. | before the client times out, this is not possible. | |||
| </t> | </li> | |||
| <t> | <li> | |||
| Incorrectly returning FORMERR to an EDNS option being | Incorrectly returning FORMERR to an EDNS option being | |||
| present leads to the recursive server not being able | present leads to the recursive server not being able | |||
| to determine if the server is just broken in the handling | to determine if the server is just broken in the handling | |||
| of the EDNS option or doesn't support EDNS at all. | of the EDNS option or if it doesn't support EDNS at all. | |||
| </t> | </li> | |||
| <t> | <li> | |||
| Mishandling of unknown query types has contributed | Mishandling of unknown query types has contributed | |||
| to the abandonment of the transition of the SPF type. | to the abandonment of the transition of the SPF type. | |||
| </t> | </li> | |||
| <t> | <li> | |||
| Mishandling of unknown query types has slowed up the | Mishandling of unknown query types has slowed up the | |||
| development of DANE and resulted in additional rules | development of DNS-Based Authentication of Named Entities (DANE) | |||
| and resulted in additional rules | ||||
| being specified to reduce the probability of interacting | being specified to reduce the probability of interacting | |||
| with a broken server when making TLSA queries. | with a broken server when making TLSA queries. | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| </t> | ||||
| <t> | <t> | |||
| The consequences of servers not following the RFCs will | The consequences of servers not following the RFCs will | |||
| only grow if measures are not put in place to remove non | only grow if measures are not put in place to remove non-compliant | |||
| compliant servers from the ecosystem. Working around issues | servers from the ecosystem. Working around issues | |||
| due to non-compliance with RFCs is not sustainable. | due to non-compliance with RFCs is not sustainable. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Most (if not all) of these consequences could have been | Most (if not all) of these consequences could have been | |||
| avoided if action had been taken to remove non-compliant | avoided if action had been taken to remove non-compliant | |||
| servers as soon as people were aware of them, i.e. to actively | servers as soon as people were aware of them, i.e., to actively | |||
| seek out broken implementations and servers and inform their | seek out broken implementations and servers and inform their | |||
| developers and operators that they need to fix their servers. | developers and operators that they need to fix their servers. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="query-kinds" title="Common kinds of queries that result in | <section anchor="query-kinds" numbered="true" toc="default"> | |||
| no or bad responses."> | <name>Common Kinds of Queries That Result in No or Bad Responses</name> | |||
| <t> | <t> | |||
| This section is broken down into Basic DNS requests and EDNS requests. | This section is broken down into Basic DNS requests and EDNS requests. | |||
| </t> | </t> | |||
| <section title="Basic DNS Queries"> | <section numbered="true" toc="default"> | |||
| <section anchor="existence" title="Zone Existence"> | <name>Basic DNS Queries</name> | |||
| <section anchor="existence" numbered="true" toc="default"> | ||||
| <name>Zone Existence</name> | ||||
| <t> | <t> | |||
| If a zone is delegated to a server, that server should | If a zone is delegated to a server, that server should | |||
| respond to an SOA query for that zone with an SOA record. | respond to a SOA query for that zone with an SOA record. | |||
| Failing to respond at all is always incorrect, regardless | Failing to respond at all is always incorrect, regardless | |||
| of the configuration of the server. Responding with | of the configuration of the server. Responding with | |||
| anything other than an SOA record in the Answer section | anything other than an SOA record in the answer section | |||
| indicates a bad delegation. | indicates a bad delegation. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="unknown" title="Unknown / Unsupported Type Queries"> | <section anchor="unknown" numbered="true" toc="default"> | |||
| <name>Unknown/Unsupported Type Queries</name> | ||||
| <t> | <t> | |||
| Some servers fail to respond to unknown or unsupported | Some servers fail to respond to unknown or unsupported | |||
| types. If a server receives a query for a type that | types. If a server receives a query for a type that | |||
| it doesn't recognise, or doesn't implement, it is | it doesn't recognise, or doesn't implement, it is | |||
| expected to return the appropriate response as if it | expected to return the appropriate response as if it | |||
| did recognise the type but does not have any data for | did recognise the type but does not have any data for | |||
| that type: either NOERROR, or NXDOMAIN. The exceptions | that type, i.e., either NOERROR or NXDOMAIN. The exceptions | |||
| to this are queries for Meta-RR types which may return | to this are queries for Meta-RR types, which may return | |||
| NOTIMP. | NOTIMP. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="dns-flags" title="DNS Flags"> | <section anchor="dns-flags" numbered="true" toc="default"> | |||
| <name>DNS Flags</name> | ||||
| <t> | <t> | |||
| Some servers fail to respond to DNS queries with various | Some servers fail to respond to DNS queries with various | |||
| DNS flags set, regardless of whether they are defined or | DNS flags set, regardless of whether they are defined or | |||
| still reserved. At the time of writing there are servers | still reserved. At the time of writing, there are servers | |||
| that fail to respond to queries with the AD flag set to 1 | that fail to respond to queries with the AD flag set to 1 | |||
| and servers that fail to respond to queries with the last | and servers that fail to respond to queries with the last | |||
| reserved flag set. | reserved flag set. | |||
| </t> | </t> | |||
| <t> | <t>Servers should respond to such queries. If the server does not | |||
| Servers should respond to such queries. If the server does | know the meaning of a flag, it must not copy it to the response | |||
| not know the meaning of a flag it must not copy it to the | (<xref target="RFC1035" sectionFormat="of" section="4.1.1"/>). If | |||
| response <xref target="RFC1035"/> Section 4.1.1. If the server | the server does not understand the meaning of a request, it should | |||
| does not understand the meaning of a request it should reply | reply with a FORMERR response with unknown flags set to zero.</t> | |||
| with a FORMERR response with unknown flags set to zero. | <section anchor="recursion" numbered="true" toc="default"> | |||
| </t> | <name>Recursive Queries</name> | |||
| <section anchor="recursion" title="Recursive Queries"> | ||||
| <t> | <t> | |||
| A non-recursive server is supposed to respond to recursive | A non-recursive server is supposed to respond to recursive | |||
| queries as if the RD bit is not set <xref target="RFC1034"/>. | queries as if the Recursion Desired (RD) bit is not set <xref | |||
| target="RFC1034" format="default"/>. | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="opcode" title="Unknown DNS opcodes"> | <section anchor="opcode" numbered="true" toc="default"> | |||
| <name>Unknown DNS Opcodes</name> | ||||
| <t> | <t> | |||
| The use of previously undefined opcodes is to be expected. | The use of previously undefined opcodes is to be expected. | |||
| Since the DNS was first defined two new opcodes have been | Since the DNS was first defined, two new opcodes have been | |||
| added, UPDATE and NOTIFY. | added, UPDATE and NOTIFY. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| NOTIMP is the expected rcode to an unknown or unimplemented | NOTIMP is the expected rcode to an unknown or unimplemented | |||
| opcode. | opcode. | |||
| </t> | </t><aside> | |||
| <t> | <t> | |||
| Note: while new opcodes will most probably use the current | NOTE: while new opcodes will most probably use the current | |||
| layout structure for the rest of the message there is no | layout structure for the rest of the message, there is no | |||
| requirement that anything other than the DNS header match. | requirement that anything other than the DNS header match. | |||
| </t> | </t></aside> | |||
| </section> | </section> | |||
| <section anchor="tcp" title="TCP Queries"> | <section anchor="tcp" numbered="true" toc="default"> | |||
| <name>TCP Queries</name> | ||||
| <t> | <t> | |||
| All DNS servers are supposed to respond to queries over | All DNS servers are supposed to respond to queries over | |||
| TCP <xref target="RFC7766"/>. While firewalls should not | TCP <xref target="RFC7766" format="default"/>. While firewalls shou | |||
| block TCP connection attempts, those that do they should | ld not | |||
| block TCP connection attempts, those that do should | ||||
| cleanly terminate the connection by sending TCP RESET | cleanly terminate the connection by sending TCP RESET | |||
| or sending ICMP/ICMPv6 Administratively Prohibited | or sending ICMP/ICMPv6 Administratively Prohibited | |||
| messages. Dropping TCP connections introduces excessive | messages. Dropping TCP connections introduces excessive | |||
| delays to the resolution process. | delays to the resolution process. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="EDNS Queries"> | <section numbered="true" toc="default"> | |||
| <name>EDNS Queries</name> | ||||
| <t> | <t> | |||
| EDNS queries are specified in <xref target="RFC6891"/>. | EDNS queries are specified in <xref target="RFC6891" format="default" />. | |||
| </t> | </t> | |||
| <section anchor="edns-independent" title="EDNS Queries - Version Indepen | <section anchor="edns-independent" numbered="true" toc="default"> | |||
| dent"> | <name>EDNS Queries: Version Independent</name> | |||
| <t> | <t> | |||
| Identifying servers that fail to respond to EDNS queries | Identifying servers that fail to respond to EDNS queries | |||
| can be done by first confirming that the server responds | can be done by first confirming that the server responds | |||
| to regular DNS queries, followed by a series of otherwise | to regular DNS queries, followed by a series of otherwise | |||
| identical queries using EDNS, then making the original | identical queries using EDNS, then making the original | |||
| query again. A series of EDNS queries is needed as at | query again. A series of EDNS queries is needed, as at | |||
| least one DNS implementation responds to the first EDNS | least one DNS implementation responds to the first EDNS | |||
| query with FORMERR but fails to respond to subsequent | query with FORMERR but fails to respond to subsequent | |||
| queries from the same address for a period until a | queries from the same address for a period until a | |||
| regular DNS query is made. The EDNS query should specify | regular DNS query is made. The EDNS query should specify | |||
| a UDP buffer size of 512 bytes to avoid false classification | a UDP buffer size of 512 bytes to avoid false classification | |||
| of not supporting EDNS due to response packet size. | of not supporting EDNS due to response packet size. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If the server responds to the first and last queries | If the server responds to the first and last queries | |||
| but fails to respond to most or all of the EDNS queries, | but fails to respond to most or all of the EDNS queries, | |||
| it is probably faulty. The test should be repeated a | it is probably faulty. The test should be repeated a | |||
| number of times to eliminate the likelihood of a false | number of times to eliminate the likelihood of a false | |||
| positive due to packet loss. | positive due to packet loss. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Firewalls may also block larger EDNS responses but there | Firewalls may also block larger EDNS responses, but there | |||
| is no easy way to check authoritative servers to see | is no easy way to check authoritative servers to see | |||
| if the firewall is mis-configured. | if the firewall is misconfigured. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="edns-specific" title="EDNS Queries - Version Specific"> | <section anchor="edns-specific" numbered="true" toc="default"> | |||
| <name>EDNS Queries: Version Specific</name> | ||||
| <t> | <t> | |||
| Some servers respond correctly to EDNS version 0 queries | Some servers respond correctly to EDNS version 0 queries | |||
| but fail to respond to EDNS queries with version numbers | but fail to respond to EDNS queries with version numbers | |||
| that are higher than zero. Servers should respond with | that are higher than zero. Servers should respond with | |||
| BADVERS to EDNS queries with version numbers that they | BADVERS to EDNS queries with version numbers that they | |||
| do not support. | do not support. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Some servers respond correctly to EDNS version 0 queries | Some servers respond correctly to EDNS version 0 queries | |||
| but fail to set QR=1 when responding to EDNS versions | but fail to set QR=1 when responding to EDNS versions | |||
| they do not support. Such responses may be discarded | they do not support. Such responses may be discarded | |||
| as invalid (as QR is not 1) or treated as requests (when the | as invalid (as QR is not 1) or treated as requests (when the | |||
| source port of the original request was port 53). | source port of the original request was port 53). | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="edns-options" title="EDNS Options"> | <section anchor="edns-options" numbered="true" toc="default"> | |||
| <name>EDNS Options</name> | ||||
| <t> | <t> | |||
| Some servers fail to respond to EDNS queries with EDNS | Some servers fail to respond to EDNS queries with EDNS | |||
| options set. The original EDNS specification left this | options set. The original EDNS specification left this | |||
| behaviour undefined <xref target="RFC2671"/>, but the | behaviour undefined <xref target="RFC2671" format="default"/>, but t | |||
| correct behaviour was clarified in <xref target="RFC6891"/>. | he | |||
| correct behaviour was clarified in <xref target="RFC6891" format="de | ||||
| fault"/>. | ||||
| Unknown EDNS options are supposed to be ignored by the server. | Unknown EDNS options are supposed to be ignored by the server. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="edns-flags" title="EDNS Flags"> | <section anchor="edns-flags" numbered="true" toc="default"> | |||
| <name>EDNS Flags</name> | ||||
| <t> | <t> | |||
| Some servers fail to respond to EDNS queries with EDNS | Some servers fail to respond to EDNS queries with EDNS | |||
| flags set. Servers should ignore EDNS flags they do not | flags set. Servers should ignore EDNS flags they do not | |||
| understand and must not add them to the response <xref | understand and must not add them to the response <xref target="RFC68 | |||
| target="RFC6891"/>. | 91" format="default"/>. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="truncated-edns" title="Truncated EDNS Responses"> | <section anchor="truncated-edns" numbered="true" toc="default"> | |||
| <name>Truncated EDNS Responses</name> | ||||
| <t> | <t> | |||
| Some EDNS aware servers fail to include an OPT record when a | Some EDNS-aware servers fail to include an OPT record when a | |||
| truncated response is sent. An OPT record is supposed to be | truncated response is sent. An OPT record is supposed to be | |||
| included in a truncated response <xref target="RFC6891"/>. | included in a truncated response <xref target="RFC6891" format="defa ult"/>. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Some EDNS aware servers fail to honour the advertised EDNS | Some EDNS-aware servers fail to honour the advertised EDNS | |||
| UDP buffer size and send over-sized responses | UDP buffer size and send oversized responses | |||
| <xref target="RFC6891"/>. Servers must send UDP responses | <xref target="RFC6891" format="default"/>. Servers must send UDP re | |||
| sponses | ||||
| no larger than the advertised EDNS UDP buffer size. | no larger than the advertised EDNS UDP buffer size. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="dobit" title="DO=1 Handling"> | <section anchor="dobit" numbered="true" toc="default"> | |||
| <name>DO=1 Handling</name> | ||||
| <t> | <t> | |||
| Some nameservers incorrectly only return an EDNS response | Some nameservers incorrectly only return an EDNS response | |||
| when the DO bit <xref target="RFC3225"/> is 1 in the | when the DNSSEC OK (DO) bit <xref target="RFC3225" format="default"/ > is 1 in the | |||
| query. Servers that support EDNS should always respond to | query. Servers that support EDNS should always respond to | |||
| EDNS requests with EDNS responses. | EDNS requests with EDNS responses. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Some nameservers fail to copy the DO bit to the response | Some nameservers fail to copy the DO bit to the response | |||
| despite clearly supporting DNSSEC by returning an RRSIG | despite clearly supporting DNSSEC by returning an RRSIG | |||
| records to EDNS queries with DO=1. Nameservers that support | records to EDNS queries with DO=1. Nameservers that support | |||
| DNSSEC are expected to copy the DO bit from the request to | DNSSEC are expected to copy the DO bit from the request to | |||
| the response. | the response. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="tcp-edns" title="EDNS over TCP"> | <section anchor="tcp-edns" numbered="true" toc="default"> | |||
| <name>EDNS over TCP</name> | ||||
| <t> | <t> | |||
| Some EDNS aware servers incorrectly limit the TCP response | Some EDNS-aware servers incorrectly limit the TCP response | |||
| sizes to the advertised UDP response size. This breaks DNS | sizes to the advertised UDP response size. This breaks DNS | |||
| resolution to clients where the response sizes exceed the | resolution to clients where the response sizes exceed the | |||
| advertised UDP response size despite the server and the client | advertised UDP response size despite the server and the client | |||
| being capable of sending and receiving larger TCP responses | being capable of sending and receiving larger TCP responses, | |||
| respectively. It effectively defeats setting TC=1 in UDP | respectively. It effectively defeats setting TC=1 in UDP | |||
| responses. | responses. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="Firewalls and Load Balancers"> | <section numbered="true" toc="default"> | |||
| <name>Firewalls and Load Balancers</name> | ||||
| <t> | <t> | |||
| Firewalls and load balancers can affect the externally | Firewalls and load balancers can affect the externally | |||
| visible behaviour of a nameserver. Tests for conformance | visible behaviour of a nameserver. Tests for conformance | |||
| should to be done from outside of any firewall so that the | should to be done from outside of any firewall so that the | |||
| system is tested as a whole. | system is tested as a whole. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Firewalls and load balancers should not drop DNS packets | Firewalls and load balancers should not drop DNS packets | |||
| that they don't understand. They should either pass | that they don't understand. They should either pass | |||
| the packets or generate an appropriate error response. | the packets or generate an appropriate error response. | |||
| skipping to change at line 427 ¶ | skipping to change at line 434 ¶ | |||
| <t> | <t> | |||
| Requests for unknown query classes are normal client behaviour | Requests for unknown query classes are normal client behaviour | |||
| and should not be construed as an attack. Nameservers have | and should not be construed as an attack. Nameservers have | |||
| always been expected to be able to handle such queries. | always been expected to be able to handle such queries. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Requests with unknown opcodes are normal client behaviour | Requests with unknown opcodes are normal client behaviour | |||
| and should not be construed as an attack. Nameservers have | and should not be construed as an attack. Nameservers have | |||
| always been expected to be able to handle such queries. | always been expected to be able to handle such queries. | |||
| </t> | </t> | |||
| <t> | <t>Requests with unassigned flags set (DNS or EDNS) are expected client | |||
| Requests with unassigned flags set (DNS or EDNS) are expected | behaviour and should not be construed as an attack. The behaviour for | |||
| client behaviour and should not be construed as an attack. | unassigned flags is to ignore them in the request and to not set them in | |||
| The behaviour for unassigned flags is to ignore them in the | the response. Dropping DNS/EDNS packets with unassigned flags makes it | |||
| request and to not set them in the response. Dropping DNS | difficult to deploy extensions that make use of them due to the need to | |||
| / EDNS packets with unassigned flags makes it difficult to | reconfigure and update firewalls.</t> | |||
| deploy extensions that make use of them due to the need to | ||||
| reconfigure and update firewalls. | ||||
| </t> | ||||
| <t> | <t> | |||
| Requests with unknown EDNS options are expected client | Requests with unknown EDNS options are expected client | |||
| behaviour and should not be construed as an attack. The | behaviour and should not be construed as an attack. The | |||
| correct behaviour for unknown EDNS options is to ignore | correct behaviour for unknown EDNS options is to ignore | |||
| their presence when constructing a reply. | their presence when constructing a reply. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Requests with unknown EDNS versions are expected client | Requests with unknown EDNS versions are expected client | |||
| behaviour and should not be construed as an attack. The | behaviour and should not be construed as an attack. The | |||
| correct behaviour for unknown EDNS versions is to return | correct behaviour for unknown EDNS versions is to return | |||
| skipping to change at line 466 ¶ | skipping to change at line 470 ¶ | |||
| </t> | </t> | |||
| <t> | <t> | |||
| DNS, and EDNS in particular, are designed to allow clients to | DNS, and EDNS in particular, are designed to allow clients to | |||
| be able to use new features against older servers without | be able to use new features against older servers without | |||
| having to validate every option. Indiscriminate blocking | having to validate every option. Indiscriminate blocking | |||
| of messages breaks that design. | of messages breaks that design. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| However, there may be times when a nameserver mishandles | However, there may be times when a nameserver mishandles | |||
| messages with a particular flag, EDNS option, EDNS version | messages with a particular flag, EDNS option, EDNS version | |||
| field, opcode, type or class field or combination thereof | field, opcode, type or class field, or combination thereof | |||
| to the point where the integrity of the nameserver is | to the point where the integrity of the nameserver is | |||
| compromised. Firewalls should offer the ability to selectively | compromised. Firewalls should offer the ability to selectively | |||
| reject messages using an appropriately constructed response | reject messages using an appropriately constructed response | |||
| based on all these fields while awaiting a fix from the | based on all these fields while awaiting a fix from the | |||
| nameserver vendor. Returning FORMERR or REFUSED are two | nameserver vendor. Returning FORMERR or REFUSED are two | |||
| potential error codes to return. | potential error codes to return. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="scrubbing" title="Packet Scrubbing Services"> | <section anchor="scrubbing" numbered="true" toc="default"> | |||
| <name>Packet Scrubbing Services</name> | ||||
| <t> | <t> | |||
| Packet scrubbing services are used to filter out undesired traffic, | Packet scrubbing services are used to filter out undesired traffic, | |||
| including but not limited to, denial of service traffic. This is | including but not limited to denial-of-service traffic. This is | |||
| often done using heuristic analysis of the traffic. | often done using heuristic analysis of the traffic. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Packet scrubbing services can affect the externally visible behaviour | Packet scrubbing services can affect the externally visible behaviour | |||
| of a nameserver in a similar way to firewalls. If an operator | of a nameserver in a similar way to firewalls. If an operator | |||
| uses a packet scrubbing service, they should check that legitimate | uses a packet scrubbing service, they should check that legitimate | |||
| queries are not being blocked. | queries are not being blocked. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Packet scrubbing services, unlike firewalls, are also turned on | Packet scrubbing services, unlike firewalls, are also turned on | |||
| and off in response to denial of service attacks. One needs | and off in response to denial-of-service attacks. One needs | |||
| to take care when choosing a scrubbing service. | to take care when choosing a scrubbing service. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Ideally, Operators should run these tests against a packet scrubbing | Ideally, operators should run these tests against a packet scrubbing | |||
| service to ensure that these tests are not seen as attack | service to ensure that these tests are not seen as attack | |||
| vectors. | vectors. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Whole Answer Caches"> | <section numbered="true" toc="default"> | |||
| <name>Whole Answer Caches</name> | ||||
| <t> | <t> | |||
| Whole answer caches take a previously constructed answer | Whole answer caches take a previously constructed answer | |||
| and return it to a subsequent query for the same question. | and return it to a subsequent query for the same question. | |||
| However, they can return the wrong response if they do not | However, they can return the wrong response if they do not | |||
| take all of the relevant attributes of the query into account. | take all of the relevant attributes of the query into account. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| In addition to the standard tuple of <qname,qtype,qclass> | In addition to the standard tuple of <qname,qtype,qclass>, | |||
| a non-exhaustive set of attributes that must be considered | a non-exhaustive set of attributes that must be considered | |||
| include: RD, AD, CD, OPT record, DO, EDNS buffer size, EDNS | include: RD, AD, CD, OPT record, DO, EDNS buffer size, EDNS | |||
| version, EDNS options, and transport. | version, EDNS options, and transport. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="response" title="Response Code Selection"> | <section anchor="response" numbered="true" toc="default"> | |||
| <name>Response Code Selection</name> | ||||
| <t> | <t> | |||
| Choosing the correct response code when responding to DNS | Choosing the correct response code when responding to DNS | |||
| queries is important. Response codes should be chosen | queries is important. Response codes should be chosen | |||
| considering how clients will handle them. | considering how clients will handle them. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| For unimplemented opcodes NOTIMP is the expected response code. | For unimplemented opcodes, NOTIMP is the expected response code. | |||
| Note: Newly implemented opcodes may change the message format by | Note: newly implemented opcodes may change the message format by | |||
| extending the header, changing the structure of the records, | extending the header, changing the structure of the records, | |||
| etc. Servers are not expected to be able to parse these, | etc. Servers are not expected to be able to parse these | |||
| and should respond with a response code of NOTIMP rather | and should respond with a response code of NOTIMP rather | |||
| than FORMERR (which would be expected if there was a parse error | than FORMERR (which would be expected if there was a parse error | |||
| with an known opcode). | with a known opcode). | |||
| </t> | </t> | |||
| <t> | <t> | |||
| For unimplemented type codes, and in the absence of other | For unimplemented type codes, and in the absence of other | |||
| errors, the only valid response is NoError if the qname | errors, the only valid response is NOERROR if the qname | |||
| exists, and NameError (NXDOMAIN) otherwise. For Meta-RRs | exists and NXDOMAIN otherwise. | |||
| NOTIMP may be returned instead. | ||||
| </t> | For Meta-RRs, NOTIMP may be returned instead. | |||
| <t> | ||||
| If a zone cannot be loaded because it contains unimplemented | ||||
| type codes that are not encoded as unknown record types | ||||
| according to <xref target="RFC3597"/> then the expected | ||||
| response is SERVFAIL as the whole zone should be rejected | ||||
| <xref target="RFC1035"> Section 5.2</xref>. If a zone loads then | ||||
| <xref target="RFC1034"> Section 4.3.2</xref> applies. | ||||
| </t> | </t> | |||
| <t>If a zone cannot be loaded because it contains unimplemented type | ||||
| codes that are not encoded as unknown record types according to <xref | ||||
| target="RFC3597" format="default"/>, then the expected response is | ||||
| SERVFAIL, as the whole zone should be rejected (<xref target="RFC1035" | ||||
| sectionFormat="of" section="5.2"></xref>). If a zone loads, then <xref | ||||
| target="RFC1034" sectionFormat="of" section="4.3.2"></xref> applies.</t> | ||||
| <t> | <t> | |||
| If the server supports EDNS and receives a query with an | If the server supports EDNS and receives a query with an | |||
| unsupported EDNS version, the correct response is BADVERS | unsupported EDNS version, the correct response is BADVERS | |||
| <xref target="RFC6891"/>. | <xref target="RFC6891" format="default"/>. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If the server does not support EDNS at all, FORMERR is | If the server does not support EDNS at all, FORMERR is | |||
| the expected error code. That said a minimal EDNS | the expected error code. That said, a minimal EDNS | |||
| server implementation requires parsing the OPT records | server implementation requires parsing the OPT records | |||
| and responding with an empty OPT record in the additional | and responding with an empty OPT record in the additional | |||
| section in most cases. There is no need to interpret any | section in most cases. There is no need to interpret any | |||
| EDNS options present in the request as unsupported EDNS | EDNS options present in the request, as unsupported EDNS | |||
| options are expected to be ignored <xref target="RFC6891"/>. | options are expected to be ignored <xref target="RFC6891" format="defaul | |||
| Additionally EDNS flags can be ignored. The only part of the | t"/>. | |||
| Additionally, EDNS flags can be ignored. The only part of the | ||||
| OPT record that needs to be examined is the version field | OPT record that needs to be examined is the version field | |||
| to determine if BADVERS needs to be sent or not. | to determine if BADVERS needs to be sent or not. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="testing" title="Testing"> | <section anchor="testing" numbered="true" toc="default"> | |||
| <name>Testing</name> | ||||
| <t> | <t> | |||
| Testing is divided into two sections: "Basic DNS", which all | Testing is divided into two sections: "Basic DNS", which all | |||
| servers should meet, and "Extended DNS", which should be met | servers should meet, and "Extended DNS", which should be met | |||
| by all servers that support EDNS (a server is deemed to | by all servers that support EDNS (a server is deemed to | |||
| support EDNS if it gives a valid EDNS response to any EDNS | support EDNS if it gives a valid EDNS response to any EDNS | |||
| query). If a server does not support EDNS it should still | query). If a server does not support EDNS, it should still | |||
| respond to all the tests, albeit with error responses. | respond to all the tests, albeit with error responses. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| These tests query for records at the apex of a zone that the | These tests query for records at the apex of a zone that the | |||
| server is nominally configured to serve. All tests should | server is nominally configured to serve. All tests should | |||
| use the same zone. | use the same zone. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| It is advisable to run all of the tests below in parallel | It is advisable to run all of the tests below in parallel | |||
| so as to minimise the delays due to multiple timeouts when | so as to minimise the delays due to multiple timeouts when | |||
| the servers do not respond. There are 16 queries directed | the servers do not respond. There are 16 queries directed | |||
| to each nameserver (assuming no packet loss) testing different | to each nameserver (assuming no packet loss) testing different | |||
| aspects of Basic DNS and Extended DNS. | aspects of Basic DNS and Extended DNS. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The tests below use dig from BIND 9.11.0 <xref target="ISC"/>. | The tests below use dig from BIND 9.11.0 <xref target="ISC" format="defa ult"/>. | |||
| Replace $zone with the name of the zone being used for testing. | Replace $zone with the name of the zone being used for testing. | |||
| Replace $server with the name or address of the server being tested. | Replace $server with the name or address of the server being tested. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| When testing recursive servers set RD=1 and choose a zone | When testing, recursive servers set RD=1 and choose a zone | |||
| name that is known to exist and is not being served by the | name that is known to exist and is not being served by the | |||
| recursive server. The root zone (".") is often a good | recursive server. The root zone (".") is often a good | |||
| candidate as it is DNSSEC signed. RD=1, rather than RD=0, | candidate, as it is DNSSEC signed. RD=1, rather than RD=0, | |||
| should be present in the responses for all test involving | should be present in the responses for all test involving | |||
| the opcode QUERY. Non-authoritative answers (AA=0) are | the opcode QUERY. Non-authoritative answers (AA=0) are | |||
| expected when talking to a recursive server. AD=1 is only | expected when talking to a recursive server. AD=1 is only | |||
| expected if the server is validating responses and | expected if the server is validating responses and | |||
| one or both AD=1 or DO=1 is set in the request otherwise | one or both AD=1 or DO=1 is set in the request, otherwise | |||
| AD=0 is expected. | AD=0 is expected. | |||
| </t> | </t> | |||
| <section anchor="testing-basic" title="Testing - Basic DNS"> | <section anchor="testing-basic" numbered="true" toc="default"> | |||
| <name>Testing: Basic DNS</name> | ||||
| <t> | <t> | |||
| This first set of tests cover basic DNS server behaviour | This first set of tests cover Basic DNS server behaviour | |||
| and all servers should pass these tests. | and all servers should pass these tests. | |||
| </t> | </t> | |||
| <section title="Is The Server Configured For The Zone?"> | <section numbered="true" toc="default"> | |||
| <name>Is the server configured for the zone?</name> | ||||
| <t> | <t> | |||
| Ask for the SOA record of the configured zone. This | Ask for the SOA record of the configured zone. This | |||
| query is made with no DNS flag bits set and without | query is made with no DNS flag bits set and without | |||
| EDNS. | EDNS. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| We expect the SOA record for the zone to be returned | We expect the SOA record for the zone to be returned | |||
| in the answer section, the rcode to be set to NOERROR, and | in the answer section, the rcode to be set to NOERROR, and | |||
| the AA and QR bits to be set in the header; RA may | the Authoritative Answer (AA) and Query/Response (QR) bits to be | |||
| also be set <xref target="RFC1034"/>. We do not expect | set in the header; the Recursion Available (RA) bits may also be | |||
| an OPT record to be returned <xref target="RFC6891"/>. | set <xref target="RFC1034" format="default"/>. We | |||
| </t> | do not expect an OPT record to be returned <xref target="RFC6891" | |||
| <t> | format="default"/>.</t> | |||
| <figure> | <t keepWithNext="true"> | |||
| <preamble> | ||||
| Verify the server is configured for the zone: | Verify the server is configured for the zone: | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +noedns +noad +norec soa $zone @$server | dig +noedns +noad +norec soa $zone @$server | |||
| expect: status: NOERROR | expect: status: NOERROR | |||
| expect: the SOA record to be present in the answer section | expect: the SOA record to be present in the answer section | |||
| expect: flag: aa to be present | expect: flag: aa to be present | |||
| expect: flag: rd to NOT be present | expect: flag: rd to NOT be present | |||
| expect: flag: ad to NOT be present | expect: flag: ad to NOT be present | |||
| expect: the OPT record to NOT be present | expect: the OPT record to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </t> | ||||
| </section> | </section> | |||
| <section title="Testing Unknown Types"> | <section numbered="true" toc="default"> | |||
| <name>Testing Unknown Types</name> | ||||
| <t> | <t> | |||
| Identifying servers that fail to respond to unknown or | Identifying servers that fail to respond to unknown or | |||
| unsupported types can be done by making an initial DNS | unsupported types can be done by making an initial DNS | |||
| query for an A record, making a number of queries for an | query for an A record, making a number of queries for an | |||
| unallocated type, then making a query for an A record | unallocated type, then making a query for an A record | |||
| again. IANA maintains a registry of allocated types. | again. IANA maintains a registry of allocated types <xref | |||
| target="IANA-DNS"/>. | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| If the server responds to the first and last queries but | If the server responds to the first and last queries but | |||
| fails to respond to the queries for the unallocated type, | fails to respond to the queries for the unallocated type, | |||
| it is probably faulty. The test should be repeated a | it is probably faulty. The test should be repeated a | |||
| number of times to eliminate the likelihood of a false | number of times to eliminate the likelihood of a false | |||
| positive due to packet loss. | positive due to packet loss. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Ask for the TYPE1000 RRset at the configured zone's | Ask for the TYPE1000 RRset at the configured zone's | |||
| name. This query is made with no DNS flag bits set and | name. This query is made with no DNS flag bits set and | |||
| without EDNS. TYPE1000 has been chosen for this purpose | without EDNS. TYPE1000 has been chosen for this purpose, | |||
| as IANA is unlikely to allocate this type in the near | as IANA is unlikely to allocate this type in the near | |||
| future and it is not in a range reserved for private | future and it is not in a range reserved for private | |||
| use <xref target="RFC6895"/>. Any unallocated type code | use <xref target="RFC6895" format="default"/>. Any unallocated type code | |||
| could be chosen for this test. | could be chosen for this test. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| We expect no records to be returned in the answer | We expect no records to be returned in the answer | |||
| section, the rcode to be set to NOERROR, and the AA and | section, the rcode to be set to NOERROR, and the AA and | |||
| QR bits to be set in the header; RA may also be set | QR bits to be set in the header; RA may also be set | |||
| <xref target="RFC1034"/>. We do not expect an OPT record | <xref target="RFC1034" format="default"/>. We do not expect an OPT | |||
| to be returned <xref target="RFC6891"/>. | record | |||
| to be returned <xref target="RFC6891" format="default"/>. | ||||
| </t> | </t> | |||
| <t> | <t keepWithNext="true"> | |||
| <figure> | ||||
| <preamble> | ||||
| Check that queries for an unknown type work: | Check that queries for an unknown type work: | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +noedns +noad +norec type1000 $zone @$server | dig +noedns +noad +norec type1000 $zone @$server | |||
| expect: status: NOERROR | expect: status: NOERROR | |||
| expect: an empty answer section. | expect: an empty answer section. | |||
| expect: flag: aa to be present | expect: flag: aa to be present | |||
| expect: flag: rd to NOT be present | expect: flag: rd to NOT be present | |||
| expect: flag: ad to NOT be present | expect: flag: ad to NOT be present | |||
| expect: the OPT record to NOT be present | expect: the OPT record to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </t> | ||||
| </section> | </section> | |||
| <section title="Testing Header Bits"> | <section numbered="true" toc="default"> | |||
| <section title="Testing CD=1 Queries"> | <name>Testing Header Bits</name> | |||
| <section numbered="true" toc="default"> | ||||
| <name>Testing CD=1 Queries</name> | ||||
| <t> | <t> | |||
| Ask for the SOA record of the configured zone. | Ask for the SOA record of the configured zone. | |||
| This query is made with only the CD DNS flag bit set, | This query is made with only the CD DNS flag bit set, | |||
| all other DNS bits clear, and without EDNS. | with all other DNS bits clear, and without EDNS. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| We expect the SOA record for the zone to be returned | We expect the SOA record for the zone to be returned | |||
| in the answer section, the rcode to be set to NOERROR, | in the answer section, the rcode to be set to NOERROR, | |||
| and the AA and QR bits to be set in the header. We | and the AA and QR bits to be set in the header. We | |||
| do not expect an OPT record to be returned. | do not expect an OPT record to be returned. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If the server supports DNSSEC, CD should be set in | If the server supports DNSSEC, CD should be set in | |||
| the response <xref target="RFC4035"/> otherwise CD | the response <xref target="RFC4035" format="default"/>; otherwise, | |||
| should be clear <xref target="RFC1034"/>. | CD | |||
| should be clear <xref target="RFC1034" format="default"/>. | ||||
| </t> | </t> | |||
| <t> | <t keepWithNext="true"> | |||
| <figure> | ||||
| <preamble> | ||||
| Check that queries with CD=1 work: | Check that queries with CD=1 work: | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +noedns +noad +norec +cd soa $zone @$server | dig +noedns +noad +norec +cd soa $zone @$server | |||
| expect: status: NOERROR | expect: status: NOERROR | |||
| expect: the SOA record to be present in the answer section | expect: the SOA record to be present in the answer section | |||
| expect: flag: aa to be present | expect: flag: aa to be present | |||
| expect: flag: rd to NOT be present | expect: flag: rd to NOT be present | |||
| expect: flag: ad to NOT be present | expect: flag: ad to NOT be present | |||
| expect: the OPT record to NOT be present | expect: the OPT record to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </t> | ||||
| </section> | </section> | |||
| <section title="Testing AD=1 Queries"> | <section numbered="true" toc="default"> | |||
| <t> | <name>Testing AD=1 Queries</name> | |||
| Ask for the SOA record of the configured zone. This | <t>Ask for the SOA record of the configured zone. This query is | |||
| query is made with only the AD DNS flag bit set and | made with only the AD DNS flag bit set, with all other DNS bits clear | |||
| all other DNS bits clear and without EDNS. | , | |||
| </t> | and without EDNS.</t> | |||
| <t> | <t> | |||
| We expect the SOA record for the zone to be returned | We expect the SOA record for the zone to be returned | |||
| in the answer section, the rcode to be set to NOERROR, | in the answer section, the rcode to be set to NOERROR, | |||
| and the AA and QR bits to be set in the header. We | and the AA and QR bits to be set in the header. We | |||
| do not expect an OPT record to be returned. The | do not expect an OPT record to be returned. The | |||
| purpose of this query is to detect blocking of queries | purpose of this query is to detect blocking of queries | |||
| with the AD bit present, not the specific value of | with the AD bit present, not the specific value of | |||
| AD in the response. | AD in the response. | |||
| </t> | </t> | |||
| <t> | <t keepWithNext="true"> | |||
| <figure> | ||||
| <preamble> | ||||
| Check that queries with AD=1 work: | Check that queries with AD=1 work: | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +noedns +norec +ad soa $zone @$server | dig +noedns +norec +ad soa $zone @$server | |||
| expect: status: NOERROR | expect: status: NOERROR | |||
| expect: the SOA record to be present in the answer section | expect: the SOA record to be present in the answer section | |||
| expect: flag: aa to be present | expect: flag: aa to be present | |||
| expect: flag: rd to NOT be present | expect: flag: rd to NOT be present | |||
| expect: the OPT record to NOT be present | expect: the OPT record to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| <postamble> | <t keepWithPrevious="true"> | |||
| AD use in queries is defined in <xref target="RFC6840"/>. | AD use in queries is defined in <xref target="RFC6840" format= | |||
| </postamble> | "default"/>. | |||
| </figure> | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Testing Reserved Bit"> | <section numbered="true" toc="default"> | |||
| <name>Testing Reserved Bit</name> | ||||
| <t> | <t> | |||
| Ask for the SOA record of the configured zone. This | Ask for the SOA record of the configured zone. This | |||
| query is made with only the final reserved DNS flag | query is made with only the final reserved DNS flag | |||
| bit set and all other DNS bits clear and without EDNS. | bit set, with all other DNS bits clear, and without EDNS. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| We expect the SOA record for the zone to be returned | We expect the SOA record for the zone to be returned | |||
| in the answer section, the rcode to be set to NOERROR, | in the answer section, the rcode to be set to NOERROR, | |||
| and the AA and QR bits to be set in the header; RA | and the AA and QR bits to be set in the header; RA | |||
| may be set. The final reserved bit must not be set | may be set. The final reserved bit must not be set | |||
| <xref target="RFC1034"/>. We do not expect an OPT | <xref target="RFC1034" format="default"/>. We do not expect an OP | |||
| record to be returned <xref target="RFC6891"/>. | T | |||
| record to be returned <xref target="RFC6891" format="default"/>. | ||||
| </t> | </t> | |||
| <t> | <t keepWithNext="true"> | |||
| <figure> | ||||
| <preamble> | ||||
| Check that queries with the last unassigned DNS | Check that queries with the last unassigned DNS | |||
| header flag work and that the flag bit is not | header flag work and that the flag bit is not | |||
| copied to the response: | copied to the response: | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type="" ><![CDATA[ | |||
| dig +noedns +noad +norec +zflag soa $zone @$server | dig +noedns +noad +norec +zflag soa $zone @$server | |||
| expect: status: NOERROR | expect: status: NOERROR | |||
| expect: the SOA record to be present in the answer section | expect: the SOA record to be present in the answer section | |||
| expect: MBZ to NOT be in the response (see below) | expect: MBZ to NOT be in the response (see below) | |||
| expect: flag: aa to be present | expect: flag: aa to be present | |||
| expect: flag: rd to NOT be present | expect: flag: rd to NOT be present | |||
| expect: flag: ad to NOT be present | expect: flag: ad to NOT be present | |||
| expect: the OPT record to NOT be present | expect: the OPT record to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| <postamble> | <t keepWithPrevious="true"> MBZ (Must Be Zero) is a dig-specific | |||
| MBZ (Must Be Zero) is a dig-specific indication that | indication that the flag bit has been incorrectly copied. See | |||
| the flag bit has been incorrectly copied. See Section | <xref target="RFC1035" sectionFormat="of" section="4.1.1"/>:</t> | |||
| 4.1.1, <xref target="RFC1035"/> "Z Reserved for | <dl newline="false"> | |||
| future use. Must be zero in all queries and | <dt>"Z</dt> | |||
| responses." | <dd>Reserved for future use. Must be zero in all queries and responses."</dd> | |||
| </postamble> | </dl> | |||
| </figure> | ||||
| </t> | ||||
| </section> | </section> | |||
| <section title="Testing Recursive Queries"> | <section numbered="true" toc="default"> | |||
| <name>Testing Recursive Queries</name> | ||||
| <t> | <t> | |||
| Ask for the SOA record of the configured zone. This | Ask for the SOA record of the configured zone. This | |||
| query is made with only the RD DNS flag bit set and | query is made with only the RD DNS flag bit set and | |||
| without EDNS. | without EDNS. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| We expect the SOA record for the zone to be returned | We expect the SOA record for the zone to be returned | |||
| in the answer section, the rcode to be set to NOERROR, and | in the answer section, the rcode to be set to NOERROR, and | |||
| the AA, QR and RD bits to be set in the header; RA | the AA, QR and RD bits to be set in the header; RA | |||
| may also be set <xref target="RFC1034"/>. We do not | may also be set <xref target="RFC1034" format="default"/>. We do | |||
| expect an OPT record to be returned <xref target="RFC6891"/>. | not | |||
| expect an OPT record to be returned <xref target="RFC6891" format= | ||||
| "default"/>. | ||||
| </t> | </t> | |||
| <t> | <t keepWithNext="true"> | |||
| <figure> | ||||
| <preamble> | ||||
| Check that recursive queries work: | Check that recursive queries work: | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +noedns +noad +rec soa $zone @$server | dig +noedns +noad +rec soa $zone @$server | |||
| expect: status: NOERROR | expect: status: NOERROR | |||
| expect: the SOA record to be present in the answer section | expect: the SOA record to be present in the answer section | |||
| expect: flag: aa to be present | expect: flag: aa to be present | |||
| expect: flag: rd to be present | expect: flag: rd to be present | |||
| expect: flag: ad to NOT be present | expect: flag: ad to NOT be present | |||
| expect: the OPT record to NOT be present | expect: the OPT record to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </t> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="Testing Unknown Opcodes"> | <section numbered="true" toc="default"> | |||
| <name>Testing Unknown Opcodes</name> | ||||
| <t> | <t> | |||
| Construct a DNS message that consists of only a DNS | Construct a DNS message that consists of only a DNS | |||
| header with opcode set to 15 (currently not allocated), | header with opcode set to 15 (currently not allocated), | |||
| no DNS header bits set and empty question, answer, | no DNS header bits set, and empty question, answer, | |||
| authority and additional sections. | authority, and additional sections. </t> | |||
| </t> | <t keepWithNext="true"> | |||
| <t> | ||||
| <figure> | ||||
| <preamble> | ||||
| Check that new opcodes are handled: | Check that new opcodes are handled: | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +noedns +noad +opcode=15 +norec +header-only @$server | dig +noedns +noad +opcode=15 +norec +header-only @$server | |||
| expect: status: NOTIMP | expect: status: NOTIMP | |||
| expect: opcode: 15 | expect: opcode: 15 | |||
| expect: all sections to be empty | expect: all sections to be empty | |||
| expect: flag: aa to NOT be present | expect: flag: aa to NOT be present | |||
| expect: flag: rd to NOT be present | expect: flag: rd to NOT be present | |||
| expect: flag: ad to NOT be present | expect: flag: ad to NOT be present | |||
| expect: the OPT record to NOT be present | expect: the OPT record to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </t> | ||||
| </section> | </section> | |||
| <section title="Testing TCP"> | <section numbered="true" toc="default"> | |||
| <name>Testing TCP</name> | ||||
| <t> | <t> | |||
| Whether a server accepts TCP connections can be tested | Whether a server accepts TCP connections can be tested | |||
| by first checking that it responds to UDP queries to | by first checking that it responds to UDP queries to | |||
| confirm that it is up and operating, then attempting the | confirm that it is up and operating, then attempting the | |||
| same query over TCP. An additional query should be made | same query over TCP. An additional query should be made | |||
| over UDP if the TCP connection attempt fails to confirm | over UDP if the TCP connection attempt fails to confirm | |||
| that the server under test is still operating. | that the server under test is still operating. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Ask for the SOA record of the configured zone. This | Ask for the SOA record of the configured zone. This | |||
| query is made with no DNS flag bits set and without | query is made with no DNS flag bits set and without | |||
| EDNS. This query is to be sent using TCP. | EDNS. This query is to be sent using TCP. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| We expect the SOA record for the zone to be returned | We expect the SOA record for the zone to be returned | |||
| in the answer section, the rcode to be set to NOERROR, and | in the answer section, the rcode to be set to NOERROR, and | |||
| the AA and QR bits to be set in the header; RA may | the AA and QR bits to be set in the header; RA may | |||
| also be set <xref target="RFC1034"/>. We do not expect | also be set <xref target="RFC1034" format="default"/>. We do not ex | |||
| an OPT record to be returned <xref target="RFC6891"/>. | pect | |||
| an OPT record to be returned <xref target="RFC6891" format="default" | ||||
| />. | ||||
| </t> | </t> | |||
| <t> | <t keepWithNext="true"> | |||
| <figure> | ||||
| <preamble> | ||||
| Check that TCP queries work: | Check that TCP queries work: | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +noedns +noad +norec +tcp soa $zone @$server | dig +noedns +noad +norec +tcp soa $zone @$server | |||
| expect: status: NOERROR | expect: status: NOERROR | |||
| expect: the SOA record to be present in the answer section | expect: the SOA record to be present in the answer section | |||
| expect: flag: aa to be present | expect: flag: aa to be present | |||
| expect: flag: rd to NOT be present | expect: flag: rd to NOT be present | |||
| expect: flag: ad to NOT be present | expect: flag: ad to NOT be present | |||
| expect: the OPT record to NOT be present | expect: the OPT record to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| <postamble> | <t keepWithPrevious="true"> | |||
| The requirement that TCP be supported is defined | The requirement that TCP be supported is defined | |||
| in <xref target="RFC7766"/>. | in <xref target="RFC7766" format="default"/>. | |||
| </postamble> | ||||
| </figure> | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="testing-edns" title="Testing - Extended DNS"> | <section anchor="testing-edns" numbered="true" toc="default"> | |||
| <name>Testing: Extended DNS</name> | ||||
| <t> | <t> | |||
| The next set of tests cover various aspects of EDNS | The next set of tests cover various aspects of EDNS | |||
| behaviour. If any of these tests succeed (indicating | behaviour. If any of these tests succeed (indicating | |||
| at least some EDNS support) then all of them should | at least some EDNS support), then all of them should | |||
| succeed. There are servers that support EDNS but fail | succeed. There are servers that support EDNS but fail | |||
| to handle plain EDNS queries correctly so a plain EDNS | to handle plain EDNS queries correctly, so a plain EDNS | |||
| query is not a good indicator of lack of EDNS support. | query is not a good indicator of lack of EDNS support. | |||
| </t> | </t> | |||
| <section title="Testing Minimal EDNS"> | <section numbered="true" toc="default"> | |||
| <name>Testing Minimal EDNS</name> | ||||
| <t> | <t> | |||
| Ask for the SOA record of the configured zone. This | Ask for the SOA record of the configured zone. This | |||
| query is made with no DNS flag bits set. EDNS version | query is made with no DNS flag bits set. EDNS version | |||
| 0 is used without any EDNS options or EDNS flags set. | 0 is used without any EDNS options or EDNS flags set. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| We expect the SOA record for the zone to be returned | We expect the SOA record for the zone to be returned | |||
| in the answer section, the rcode to be set to NOERROR, and | in the answer section, the rcode to be set to NOERROR, and | |||
| the AA and QR bits to be set in the header; RA may | the AA and QR bits to be set in the header; RA may | |||
| also be set <xref target="RFC1034"/>. We expect | also be set <xref target="RFC1034" format="default"/>. We expect | |||
| an OPT record to be returned. There should be no EDNS | an OPT record to be returned. There should be no EDNS | |||
| flags present in the response. The EDNS version field | flags present in the response. The EDNS version field | |||
| should be 0 and there should be no EDNS options present | should be 0, and there should be no EDNS options present | |||
| <xref target="RFC6891"/>. | <xref target="RFC6891" format="default"/>. | |||
| </t> | </t> | |||
| <t> | <t keepWithNext="true"> | |||
| <figure> | ||||
| <preamble> | ||||
| Check that plain EDNS queries work: | Check that plain EDNS queries work: | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +nocookie +edns=0 +noad +norec soa $zone @$server | dig +nocookie +edns=0 +noad +norec soa $zone @$server | |||
| expect: status: NOERROR | expect: status: NOERROR | |||
| expect: the SOA record to be present in the answer section | expect: the SOA record to be present in the answer section | |||
| expect: an OPT record to be present in the additional section | expect: an OPT record to be present in the additional section | |||
| expect: EDNS Version 0 in response | expect: EDNS Version 0 in response | |||
| expect: flag: aa to be present | expect: flag: aa to be present | |||
| expect: flag: ad to NOT be present | expect: flag: ad to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| <postamble> | <t keepWithPrevious="true"> | |||
| +nocookie disables sending a EDNS COOKIE option which | +nocookie disables sending an EDNS COOKIE option, which | |||
| is otherwise enabled by default in BIND 9.11.0 (and | is otherwise enabled by default in BIND 9.11.0 (and | |||
| later). | later). | |||
| </postamble> | ||||
| </figure> | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Testing EDNS Version Negotiation"> | <section numbered="true" toc="default"> | |||
| <name>Testing EDNS Version Negotiation</name> | ||||
| <t> | <t> | |||
| Ask for the SOA record of a zone the server is nominally | Ask for the SOA record of a zone the server is nominally | |||
| configured to serve. This query is made with no DNS flag | configured to serve. This query is made with no DNS flag | |||
| bits set. EDNS version 1 is used without any EDNS options | bits set. EDNS version 1 is used without any EDNS options | |||
| or EDNS flags set. | or EDNS flags set. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| We expect the SOA record for the zone to NOT be returned | We expect the SOA record for the zone to NOT be returned | |||
| in the answer section with the extended rcode set to | in the answer section with the extended rcode set to | |||
| BADVERS and the QR bit to be set in the header; RA | BADVERS and the QR bit to be set in the header; RA | |||
| may also be set <xref target="RFC1034"/>. We expect | may also be set <xref target="RFC1034" format="default"/>. We expec t | |||
| an OPT record to be returned. There should be no EDNS | an OPT record to be returned. There should be no EDNS | |||
| flags present in the response. The EDNS version field | flags present in the response. The EDNS version field | |||
| should be 0 in the response as no other EDNS version | should be 0 in the response, as no other EDNS version | |||
| has as yet been specified <xref target="RFC6891"/>. | has as yet been specified <xref target="RFC6891" format="default"/>. | |||
| </t> | </t> | |||
| <t> | <t keepWithNext="true"> | |||
| <figure> | ||||
| <preamble> | ||||
| Check that EDNS version 1 queries work (EDNS supported): | Check that EDNS version 1 queries work (EDNS supported): | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +nocookie +edns=1 +noednsneg +noad +norec soa $zone @$server | dig +nocookie +edns=1 +noednsneg +noad +norec soa $zone @$server | |||
| expect: status: BADVERS | expect: status: BADVERS | |||
| expect: the SOA record to NOT be present in the answer section | expect: the SOA record to NOT be present in the answer section | |||
| expect: an OPT record to be present in the additional section | expect: an OPT record to be present in the additional section | |||
| expect: EDNS Version 0 in response | expect: EDNS Version 0 in response | |||
| expect: flag: aa to NOT be present | expect: flag: aa to NOT be present | |||
| expect: flag: ad to NOT be present | expect: flag: ad to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| <postamble> | <t keepWithPrevious="true"> | |||
| +noednsneg has been set as dig supports EDNS version | +noednsneg has been set, as dig supports EDNS version | |||
| negotiation and we want to see only the response to the | negotiation, and we want to see only the response to the | |||
| initial EDNS version 1 query. | initial EDNS version 1 query. | |||
| </postamble> | ||||
| </figure> | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Testing Unknown EDNS Options"> | <section numbered="true" toc="default"> | |||
| <name>Testing Unknown EDNS Options</name> | ||||
| <t> | <t> | |||
| Ask for the SOA record of the configured zone. This | Ask for the SOA record of the configured zone. This | |||
| query is made with no DNS flag bits set. EDNS version | query is made with no DNS flag bits set. EDNS version | |||
| 0 is used without any EDNS flags. An EDNS option is | 0 is used without any EDNS flags. An EDNS option is | |||
| present with a value that has not yet been assigned by | present with a value that has not yet been assigned by | |||
| IANA. We have picked an unassigned code of 100 for | IANA. We have picked an unassigned code of 100 for | |||
| the example below. Any unassigned EDNS option code | the example below. Any unassigned EDNS option code | |||
| could have been choosen for this test. | could have been chosen for this test. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| We expect the SOA record for the zone to be returned | We expect the SOA record for the zone to be returned | |||
| in the answer section, the rcode to be set to NOERROR, and | in the answer section, the rcode to be set to NOERROR, and | |||
| the AA and QR bits to be set in the header; RA may | the AA and QR bits to be set in the header; RA may | |||
| also be set <xref target="RFC1034"/>. We expect | also be set <xref target="RFC1034" format="default"/>. We expect | |||
| an OPT record to be returned. There should be no EDNS | an OPT record to be returned. There should be no EDNS | |||
| flags present in the response. The EDNS version field | flags present in the response. The EDNS version field | |||
| should be 0 as EDNS versions other than 0 are yet to | should be 0, as EDNS versions other than 0 are yet to | |||
| be specified and there should be no EDNS options present | be specified, and there should be no EDNS options present, | |||
| as unknown EDNS options are supposed to be ignored by the | as unknown EDNS options are supposed to be ignored by the | |||
| server <xref target="RFC6891"/> Section 6.1.2. | server (<xref target="RFC6891" sectionFormat="of" section="6.1.1"/>) . | |||
| </t> | </t> | |||
| <t> | <t keepWithNext="true"> | |||
| <figure> | ||||
| <preamble> | ||||
| Check that EDNS queries with an unknown option work (EDNS suppor ted): | Check that EDNS queries with an unknown option work (EDNS suppor ted): | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +nocookie +edns=0 +noad +norec +ednsopt=100 soa $zone @$server | dig +nocookie +edns=0 +noad +norec +ednsopt=100 soa $zone @$server | |||
| expect: status: NOERROR | expect: status: NOERROR | |||
| expect: the SOA record to be present in the answer section | expect: the SOA record to be present in the answer section | |||
| expect: an OPT record to be present in the additional section | expect: an OPT record to be present in the additional section | |||
| expect: OPT=100 to NOT be present | expect: OPT=100 to NOT be present | |||
| expect: EDNS Version 0 in response | expect: EDNS Version 0 in response | |||
| expect: flag: aa to be present | expect: flag: aa to be present | |||
| expect: flag: ad to NOT be present | expect: flag: ad to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </t> | ||||
| </section> | </section> | |||
| <section title="Testing Unknown EDNS Flags"> | <section numbered="true" toc="default"> | |||
| <name>Testing Unknown EDNS Flags</name> | ||||
| <t> | <t> | |||
| Ask for the SOA record of the configured zone. This | Ask for the SOA record of the configured zone. This | |||
| query is made with no DNS flag bits set. EDNS version | query is made with no DNS flag bits set. EDNS version | |||
| 0 is used without any EDNS options. An unassigned EDNS | 0 is used without any EDNS options. An unassigned EDNS | |||
| flag bit is set (0x40 in this case). | flag bit is set (0x40 in this case). | |||
| </t> | </t> | |||
| <t> | <t> | |||
| We expect the SOA record for the zone to be returned | We expect the SOA record for the zone to be returned | |||
| in the answer section, the rcode to be set to NOERROR, and | in the answer section, the rcode to be set to NOERROR, and | |||
| the AA and QR bits to be set in the header; RA may | the AA and QR bits to be set in the header; RA may | |||
| also be set <xref target="RFC1034"/>. We expect | also be set <xref target="RFC1034" format="default"/>. We expect | |||
| an OPT record to be returned. There should be no EDNS | an OPT record to be returned. There should be no EDNS | |||
| flags present in the response as unknown EDNS flags are | flags present in the response, as unknown EDNS flags are | |||
| supposed to be ignored. The EDNS version field | supposed to be ignored. The EDNS version field | |||
| should be 0 and there should be no EDNS options present | should be 0, and there should be no EDNS options present | |||
| <xref target="RFC6891"/>. | <xref target="RFC6891" format="default"/>. | |||
| </t> | </t> | |||
| <t> | <t keepWithNext="true"> | |||
| <figure> | ||||
| <preamble> | ||||
| Check that EDNS queries with unknown flags work (EDNS supported) : | Check that EDNS queries with unknown flags work (EDNS supported) : | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +nocookie +edns=0 +noad +norec +ednsflags=0x40 soa $zone @$server | dig +nocookie +edns=0 +noad +norec +ednsflags=0x40 soa $zone @$server | |||
| expect: status: NOERROR | expect: status: NOERROR | |||
| expect: the SOA record to be present in the answer section | expect: the SOA record to be present in the answer section | |||
| expect: an OPT record to be present in the additional section | expect: an OPT record to be present in the additional section | |||
| expect: MBZ not to be present | expect: MBZ not to be present | |||
| expect: EDNS Version 0 in response | expect: EDNS Version 0 in response | |||
| expect: flag: aa to be present | expect: flag: aa to be present | |||
| expect: flag: ad to NOT be present | expect: flag: ad to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| <postamble> | <t keepWithPrevious="true"> | |||
| MBZ (Must Be Zero) is a dig-specific indication that | MBZ (Must Be Zero) is a dig-specific indication that | |||
| a flag bit has been incorrectly copied as per | a flag bit has been incorrectly copied, as per | |||
| Section 6.1.4, <xref target="RFC6891"/>. | <xref target="RFC6891" sectionFormat="of" section="6.1.4"/>. | |||
| </postamble> | ||||
| </figure> | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Testing EDNS Version Negotiation With Unknown EDNS Flags | <section numbered="true" toc="default"> | |||
| "> | <name>Testing EDNS Version Negotiation with Unknown EDNS Flags</name> | |||
| <t> | <t> | |||
| Ask for the SOA record of the configured zone. This | Ask for the SOA record of the configured zone. This | |||
| query is made with no DNS flag bits set. EDNS version | query is made with no DNS flag bits set. EDNS version | |||
| 1 is used without any EDNS options. An unassigned EDNS | 1 is used without any EDNS options. An unassigned EDNS | |||
| flag bit is set (0x40 in this case). | flag bit is set (0x40 in this case). | |||
| </t> | </t> | |||
| <t> | <t> | |||
| We expect the SOA record for the zone to NOT be returned | We expect the SOA record for the zone to NOT be returned | |||
| in the answer section with the extended rcode set to | in the answer section with the extended rcode set to | |||
| BADVERS and the QR bit to be set in the header; RA | BADVERS and the QR bit to be set in the header; RA | |||
| may also be set <xref target="RFC1034"/>. We expect | may also be set <xref target="RFC1034" format="default"/>. We expec t | |||
| an OPT record to be returned. There should be no EDNS | an OPT record to be returned. There should be no EDNS | |||
| flags present in the response as unknown EDNS flags are | flags present in the response, as unknown EDNS flags are | |||
| supposed to be ignored. The EDNS version field should | supposed to be ignored. The EDNS version field should | |||
| be 0 as EDNS versions other than 0 are yet to be | be 0, as EDNS versions other than 0 are yet to be | |||
| specified and there should be no EDNS options present | specified, and there should be no EDNS options present | |||
| <xref target="RFC6891"/>. | <xref target="RFC6891" format="default"/>. | |||
| </t> | </t> | |||
| <t> | <t keepWithNext="true"> | |||
| <figure> | ||||
| <preamble> | ||||
| Check that EDNS version 1 queries with unknown flags work (EDNS supported): | Check that EDNS version 1 queries with unknown flags work (EDNS supported): | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +nocookie +edns=1 +noednsneg +noad +norec +ednsflags=0x40 soa \ | dig +nocookie +edns=1 +noednsneg +noad +norec +ednsflags=0x40 soa \ | |||
| $zone @$server | $zone @$server | |||
| expect: status: BADVERS | expect: status: BADVERS | |||
| expect: SOA record to NOT be present | expect: SOA record to NOT be present | |||
| expect: an OPT record to be present in the additional section | expect: an OPT record to be present in the additional section | |||
| expect: MBZ not to be present | expect: MBZ not to be present | |||
| expect: EDNS Version 0 in response | expect: EDNS Version 0 in response | |||
| expect: flag: aa to NOT be present | expect: flag: aa to NOT be present | |||
| expect: flag: ad to NOT be present | expect: flag: ad to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </t> | ||||
| </section> | </section> | |||
| <section title="Testing EDNS Version Negotiation With Unknown EDNS Optio | <section numbered="true" toc="default"> | |||
| ns"> | <name>Testing EDNS Version Negotiation with Unknown EDNS Options</name | |||
| > | ||||
| <t> | <t> | |||
| Ask for the SOA record of the configured zone. This | Ask for the SOA record of the configured zone. This | |||
| query is made with no DNS flag bits set. EDNS version | query is made with no DNS flag bits set. EDNS version | |||
| 1 is used. An unknown EDNS option is present. We have | 1 is used. An unknown EDNS option is present. We have | |||
| picked an unassigned code of 100 for the example below. | picked an unassigned code of 100 for the example below. | |||
| Any unassigned EDNS option code could have been chosen for | Any unassigned EDNS option code could have been chosen for | |||
| this test. | this test. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| We expect the SOA record for the zone to NOT be returned | We expect the SOA record for the zone to NOT be returned | |||
| in the answer section with the extended rcode set to | in the answer section with the extended rcode set to | |||
| BADVERS and the QR bit to be set in the header; RA | BADVERS and the QR bit to be set in the header; RA | |||
| may also be set <xref target="RFC1034"/>. We expect | may also be set <xref target="RFC1034" format="default"/>. We expec t | |||
| an OPT record to be returned. There should be no EDNS | an OPT record to be returned. There should be no EDNS | |||
| flags present in the response. The EDNS version field | flags present in the response. The EDNS version field | |||
| should be 0 as EDNS versions other than 0 are yet | should be 0, as EDNS versions other than 0 are yet | |||
| to be specified and there should be no EDNS options | to be specified, and there should be no EDNS options | |||
| present <xref target="RFC6891"/>. | present <xref target="RFC6891" format="default"/>. | |||
| </t> | </t> | |||
| <t> | <t keepWithNext="true"> | |||
| <figure> | ||||
| <preamble> | ||||
| Check that EDNS version 1 queries with unknown options work (EDN S supported): | Check that EDNS version 1 queries with unknown options work (EDN S supported): | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +nocookie +edns=1 +noednsneg +noad +norec +ednsopt=100 soa \ | dig +nocookie +edns=1 +noednsneg +noad +norec +ednsopt=100 soa \ | |||
| $zone @$server | $zone @$server | |||
| expect: status: BADVERS | expect: status: BADVERS | |||
| expect: SOA record to NOT be present | expect: SOA record to NOT be present | |||
| expect: an OPT record to be present in the additional section | expect: an OPT record to be present in the additional section | |||
| expect: OPT=100 to NOT be present | expect: OPT=100 to NOT be present | |||
| expect: EDNS Version 0 in response | expect: EDNS Version 0 in response | |||
| expect: flag: aa to NOT be present | expect: flag: aa to NOT be present | |||
| expect: flag: ad to NOT be present | expect: flag: ad to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </t> | ||||
| </section> | </section> | |||
| <section title="Testing Truncated Responses"> | <section numbered="true" toc="default"> | |||
| <name>Testing Truncated Responses</name> | ||||
| <t> | <t> | |||
| Ask for the DNSKEY records of the configured zone, which | Ask for the DNSKEY records of the configured zone, which | |||
| must be a DNSSEC signed zone. This query is made with | must be a DNSSEC signed zone. This query is made with | |||
| no DNS flag bits set. EDNS version 0 is used without | no DNS flag bits set. EDNS version 0 is used without | |||
| any EDNS options. The only EDNS flag set is DO. The | any EDNS options. The only EDNS flag set is DO. The | |||
| EDNS UDP buffer size is set to 512. The intention of | EDNS UDP buffer size is set to 512. The intention of | |||
| this query is to elicit a truncated response from the | this query is to elicit a truncated response from the | |||
| server. Most signed DNSKEY responses are bigger than | server. Most signed DNSKEY responses are bigger than | |||
| 512 bytes. This test will not give a valid result if | 512 bytes. This test will not give a valid result if | |||
| the zone is not signed. | the zone is not signed. | |||
| </t> | </t> | |||
| <t>We expect a response, the rcode to be set to NOERROR, and the AA | ||||
| and QR bits to be set. AD may be set in the response if the server | ||||
| supports DNSSEC; otherwise it should be clear; TC and RA may also be | ||||
| set <xref target="RFC1035" format="default"/> <xref target="RFC4035" | ||||
| format="default"/>. We expect an OPT record to be present in the | ||||
| response. There should be no EDNS flags other than DO present in | ||||
| the response. The EDNS version field should be 0, and there should | ||||
| be no EDNS options present <xref target="RFC6891" | ||||
| format="default"/>.</t> | ||||
| <t> | <t> | |||
| We expect a response, the rcode to be set to NOERROR, and | If TC is not set, it is not possible to confirm that the | |||
| the AA and QR bits to be set, AD may be set in the | ||||
| response if the server supports DNSSEC otherwise it | ||||
| should be clear; TC and RA may also be set <xref | ||||
| target="RFC1035"/> <xref target="RFC4035"/>. We expect | ||||
| an OPT record to be present in the response. There | ||||
| should be no EDNS flags other than DO present in the | ||||
| response. The EDNS version field should be 0 and | ||||
| there should be no EDNS options present <xref | ||||
| target="RFC6891"/>. | ||||
| </t> | ||||
| <t> | ||||
| If TC is not set it is not possible to confirm that the | ||||
| server correctly adds the OPT record to the truncated | server correctly adds the OPT record to the truncated | |||
| responses or not. | responses or not. | |||
| </t> | </t> | |||
| <t> | <sourcecode name="" type=""><![CDATA[ | |||
| <figure> | ||||
| <artwork> | ||||
| dig +norec +dnssec +bufsize=512 +ignore dnskey $zone @$server | dig +norec +dnssec +bufsize=512 +ignore dnskey $zone @$server | |||
| expect: NOERROR | expect: NOERROR | |||
| expect: OPT record with version set to 0 | expect: OPT record with version set to 0 | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </t> | ||||
| </section> | </section> | |||
| <section title="Testing DO=1 Handling"> | <section numbered="true" toc="default"> | |||
| <name>Testing DO=1 Handling</name> | ||||
| <t> | <t> | |||
| Ask for the SOA record of the configured zone, which | Ask for the SOA record of the configured zone, which | |||
| does not need to be DNSSEC signed. This query is made | does not need to be DNSSEC signed. This query is made | |||
| with no DNS flag bits set. EDNS version 0 is used | with no DNS flag bits set. EDNS version 0 is used | |||
| without any EDNS options. The only EDNS flag set is | without any EDNS options. The only EDNS flag set is | |||
| DO. | DO. | |||
| </t> | </t> | |||
| <t> | <t>We expect the SOA record for the zone to be returned in the | |||
| We expect the SOA record for the zone to be returned | answer section, the rcode to be set to NOERROR, and the AA and QR | |||
| in the answer section, the rcode to be set to NOERROR, and | bits to be set in the response. AD may be set in the response if the | |||
| the AA and QR bits to be set in the response, AD may | server supports DNSSEC, otherwise it should be clear; RA may also be | |||
| be set in the response if the server supports DNSSEC | set <xref target="RFC1034" format="default"/>. We expect an OPT | |||
| otherwise it should be clear; RA may also be set <xref | record to be returned. There should be no EDNS flags other than DO | |||
| target="RFC1034"/>. We expect an OPT record to be | present in the response, which should be present if the server | |||
| returned. There should be no EDNS flags other than DO | supports DNSSEC. The EDNS version field should be 0, and there | |||
| present in the response which should be present if the | should be no EDNS options present <xref target="RFC6891" | |||
| server supports DNSSEC. The EDNS version field should | format="default"/>.</t> | |||
| be 0 and there should be no EDNS options present | <t keepWithNext="true"> | |||
| <xref target="RFC6891"/>. | ||||
| </t> | ||||
| <t> | ||||
| <figure> | ||||
| <preamble> | ||||
| Check that DO=1 queries work (EDNS supported): | Check that DO=1 queries work (EDNS supported): | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +nocookie +edns=0 +noad +norec +dnssec soa $zone @$server | dig +nocookie +edns=0 +noad +norec +dnssec soa $zone @$server | |||
| expect: status: NOERROR | expect: status: NOERROR | |||
| expect: the SOA record to be present in the answer section | expect: the SOA record to be present in the answer section | |||
| expect: an OPT record to be present in the additional section | expect: an OPT record to be present in the additional section | |||
| expect: DO=1 to be present if an RRSIG is in the response | expect: DO=1 to be present if an RRSIG is in the response | |||
| expect: EDNS Version 0 in response | expect: EDNS Version 0 in response | |||
| expect: flag: aa to be present | expect: flag: aa to be present | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </t> | ||||
| </section> | </section> | |||
| <section title="Testing EDNS Version Negotiation With DO=1"> | <section numbered="true" toc="default"> | |||
| <name>Testing EDNS Version Negotiation with DO=1</name> | ||||
| <t> | <t> | |||
| Ask for the SOA record of the configured zone, which does | Ask for the SOA record of the configured zone, which does | |||
| not need to be DNSSEC signed. This query is made with no | not need to be DNSSEC signed. This query is made with no | |||
| DNS flag bits set. EDNS version 1 is used without any EDNS | DNS flag bits set. EDNS version 1 is used without any EDNS | |||
| options. The only EDNS flag set is DO. | options. The only EDNS flag set is DO. | |||
| </t> | </t> | |||
| <t> | <t>We expect the SOA record for the zone NOT to be returned in the ans | |||
| We expect the SOA record for the zone to NOT be returned | wer | |||
| in the answer section, the rcode to be set to NOERROR, ; | section, the extended rcode to be set to BADVERS, and the QR bit to be set in | |||
| the QR bit and possibly the RA bit to be set <xref | the header; RA may also be set <xref target="RFC1034" | |||
| target="RFC1034"/>. We expect an OPT record to | format="default"/>. | |||
| be returned. There should be no EDNS flags other than | ||||
| DO present in the response which should be there if | We expect an OPT record to be returned. There | |||
| the server supports DNSSEC. The EDNS version field | should be no EDNS flags other than DO present in the response, which | |||
| should be 0 and there should be no EDNS options | should be there if the server supports DNSSEC. The EDNS version | |||
| present <xref target="RFC6891"/>. | field should be 0, and there should be no EDNS options present <xref | |||
| </t> | target="RFC6891" format="default"/>.</t> | |||
| <t> | <t keepWithNext="true"> | |||
| <figure> | ||||
| <preamble> | ||||
| Check that EDNS version 1, DO=1 queries work (EDNS supported): | Check that EDNS version 1, DO=1 queries work (EDNS supported): | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +nocookie +edns=1 +noednsneg +noad +norec +dnssec soa \ | dig +nocookie +edns=1 +noednsneg +noad +norec +dnssec soa \ | |||
| $zone @$server | $zone @$server | |||
| expect: status: BADVERS | expect: status: BADVERS | |||
| expect: SOA record to NOT be present | expect: SOA record to NOT be present | |||
| expect: an OPT record to be present in the additional section | expect: an OPT record to be present in the additional section | |||
| expect: DO=1 to be present if the EDNS version 0 DNSSEC query test | expect: DO=1 to be present if the EDNS version 0 DNSSEC query test | |||
| returned DO=1 | returned DO=1 | |||
| expect: EDNS Version 0 in response | expect: EDNS Version 0 in response | |||
| expect: flag: aa to NOT be present | expect: flag: aa to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </t> | ||||
| </section> | </section> | |||
| <section title="Testing With Multiple Defined EDNS Options"> | <section numbered="true" toc="default"> | |||
| <t> | <name>Testing with Multiple Defined EDNS Options</name> | |||
| Ask for the SOA record of the configured zone. This | <t>Ask for the SOA record of the configured zone. This query is | |||
| query is made with no DNS flag bits set. EDNS version | made with no DNS flag bits set. EDNS version 0 is used. A number | |||
| 0 is used. A number of defined EDNS options are present | of defined EDNS options are present (NSID <xref target="RFC5001" | |||
| (NSID <xref target="RFC5001"/>, DNS COOKIE <xref | format="default"/>, DNS COOKIE <xref target="RFC7873" | |||
| target="RFC7873"/>, EDNS Client Subnet <xref | format="default"/>, EDNS Client Subnet <xref target="RFC7871" | |||
| target="RFC7871"/> and EDNS Expire <xref target="RFC7314"/>). | format="default"/>, and EDNS Expire <xref target="RFC7314" | |||
| </t> | format="default"/>).</t> | |||
| <t> | <t> | |||
| We expect the SOA record for the zone to be returned | We expect the SOA record for the zone to be returned | |||
| in the answer section, the rcode to be set to NOERROR, and | in the answer section, the rcode to be set to NOERROR, and | |||
| the AA and QR bits to be set in the header; RA may | the AA and QR bits to be set in the header; RA may | |||
| also be set <xref target="RFC1034"/>. We expect an OPT | also be set <xref target="RFC1034" format="default"/>. We expect an OPT | |||
| record to be returned. There should be no EDNS flags | record to be returned. There should be no EDNS flags | |||
| present in the response. The EDNS version field should | present in the response. The EDNS version field should | |||
| be 0. Any of the requested EDNS options supported | be 0. Any of the requested EDNS options supported | |||
| by the server and permitted server configuration may | by the server and permitted server configuration may | |||
| be returned <xref target="RFC6891"/>. | be returned <xref target="RFC6891" format="default"/>. | |||
| </t> | </t> | |||
| <t> | <t keepWithNext="true"> | |||
| <figure> | ||||
| <preamble> | ||||
| Check that EDNS queries with multiple defined EDNS options work: | Check that EDNS queries with multiple defined EDNS options work: | |||
| </preamble> | </t> | |||
| <artwork> | <sourcecode name="" type=""><![CDATA[ | |||
| dig +edns=0 +noad +norec +cookie +nsid +expire +subnet=0.0.0.0/0 \ | dig +edns=0 +noad +norec +cookie +nsid +expire +subnet=0.0.0.0/0 \ | |||
| soa $zone @$server | soa $zone @$server | |||
| expect: status: NOERROR | expect: status: NOERROR | |||
| expect: the SOA record to be present in the answer section | expect: the SOA record to be present in the answer section | |||
| expect: an OPT record to be present in the additional section | expect: an OPT record to be present in the additional section | |||
| expect: EDNS Version 0 in response | expect: EDNS Version 0 in response | |||
| expect: flag: aa to be present | expect: flag: aa to be present | |||
| expect: flag: ad to NOT be present | expect: flag: ad to NOT be present | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </t> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="When EDNS Is Not Supported"> | <section numbered="true" toc="default"> | |||
| <name>When EDNS Is Not Supported</name> | ||||
| <t> | <t> | |||
| If EDNS is not supported by the nameserver, we expect a | If EDNS is not supported by the nameserver, we expect a | |||
| response to each of the above queries. That response may | response to each of the above queries. That response may | |||
| be a FORMERR error response or the OPT record may just | be a FORMERR error response, or the OPT record may just | |||
| be ignored. | be ignored. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Some nameservers only return a EDNS response when a | Some nameservers only return an EDNS response when a | |||
| particular EDNS option or flag (e.g. DO=1) is present in | particular EDNS option or flag (e.g., DO=1) is present in | |||
| the request. This behaviour is not compliant behaviour | the request. This behaviour is not compliant behaviour | |||
| and may hide other incorrect behaviour from the above | and may hide other incorrect behaviour from the above | |||
| tests. Re-testing with the triggering option / flag | tests. Retesting with the triggering option/flag | |||
| present will expose this misbehaviour. | present will expose this misbehaviour. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="remediation" title="Remediation"> | <section anchor="remediation" numbered="true" toc="default"> | |||
| <name>Remediation</name> | ||||
| <t> | <t> | |||
| Nameserver operators are generally expected to test their | Nameserver operators are generally expected to test their | |||
| own infrastructure for compliance to standards. The above | own infrastructure for compliance to standards. The above | |||
| tests should be run when new systems are brought online, | tests should be run when new systems are brought online | |||
| and should be repeated periodically to ensure continued | and should be repeated periodically to ensure continued | |||
| interoperability. | interoperability. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Domain registrants who do not maintain their own DNS | Domain registrants who do not maintain their own DNS | |||
| infrastructure are entitled to a DNS service that conforms | infrastructure are entitled to a DNS service that conforms | |||
| to standards and interoperates well. Registrants who become | to standards and interoperates well. Registrants who become | |||
| aware that their DNS operator does not have a well maintained | aware that their DNS operator does not have a well-maintained | |||
| or compliant infrastructure should insist that their service | or compliant infrastructure should insist that their service | |||
| provider correct issues, and switch providers if they do | provider correct issues and switch providers if they do | |||
| not. | not. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| In the event that an operator experiences problems due to | In the event that an operator experiences problems due to | |||
| the behaviour of nameservers outside their control, the | the behaviour of nameservers outside their control, the | |||
| above tests will help in narrowing down the precise issue(s) | above tests will help in narrowing down the precise issue(s), | |||
| which can then be reported to the relevant party. | which can then be reported to the relevant party. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If contact information for the operator of a misbehaving | If contact information for the operator of a misbehaving | |||
| nameserver is not already known, the following methods of | nameserver is not already known, the following methods of | |||
| communication could be considered: | communication could be considered: | |||
| <list style="symbols"> | </t> | |||
| <t> | <ul spacing="normal"> | |||
| <li> | ||||
| the RNAME of the zone authoritative for the name of the | the RNAME of the zone authoritative for the name of the | |||
| misbehaving server | misbehaving server | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| the RNAME of zones for which the offending server is | the RNAME of zones for which the offending server is | |||
| authoritative | authoritative | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| administrative or technical contacts listed in the | administrative or technical contacts listed in the | |||
| registration information for the parent domain of the | registration information for the parent domain of the | |||
| name of the misbehaving server, or for zones for which | name of the misbehaving server or for zones for which | |||
| the nameserver is authoritative | the nameserver is authoritative | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| the registrar or registry for such zones | the registrar or registry for such zones | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | DNS-specific, operational fora (e.g., mailing lists) | |||
| DNS-specific operational fora (e.g. mailing lists) | </li> | |||
| </t> | </ul> | |||
| </list> | ||||
| </t> | ||||
| <t> | <t> | |||
| Operators of parent zones may wish to regularly test the | Operators of parent zones may wish to regularly test the | |||
| authoritative nameservers of their child zones. However, | authoritative nameservers of their child zones. However, | |||
| parent operators can have widely varying capabilities in | parent operators can have widely varying capabilities in | |||
| terms of notification or remediation depending on whether | terms of notification or remediation depending on whether | |||
| they have a direct relationship with the child operator. | they have a direct relationship with the child operator. | |||
| Many TLD registries, for example, cannot directly contact | Many Top-Level Domain (TLD) registries, for example, cannot directly con | |||
| tact | ||||
| their registrants and may instead need to communicate through | their registrants and may instead need to communicate through | |||
| the relevant registrar. In such cases it may be most | the relevant registrar. In such cases, it may be most | |||
| efficient for registrars to take on the responsibility for | efficient for registrars to take on the responsibility for | |||
| testing the name ervers of their registrants, since they | testing the nameservers of their registrants, since they | |||
| have a direct relationship. | have a direct relationship. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| When notification is not effective at correcting problems | When notification is not effective at correcting problems | |||
| with a misbehaving nameserver, parent operators can choose | with a misbehaving nameserver, parent operators can choose | |||
| to remove NS record sets (and glue records below) that refer | to remove NS record sets (and glue records below) that refer | |||
| to the faulty server until the servers are fixed. This should | to the faulty server until the servers are fixed. This should | |||
| only be done as a last resort and with due consideration, as | only be done as a last resort and with due consideration, as | |||
| removal of a delegation can have unanticipated side effects. | removal of a delegation can have unanticipated side effects. | |||
| For example, other parts of the DNS tree may depend on names | For example, other parts of the DNS tree may depend on names | |||
| below the removed zone cut, and the parent operator may find | below the removed zone cut, and the parent operator may find | |||
| themselves responsible for causing new DNS failures to occur. | themselves responsible for causing new DNS failures to occur. | |||
| skipping to change at line 1404 ¶ | skipping to change at line 1346 ¶ | |||
| When notification is not effective at correcting problems | When notification is not effective at correcting problems | |||
| with a misbehaving nameserver, parent operators can choose | with a misbehaving nameserver, parent operators can choose | |||
| to remove NS record sets (and glue records below) that refer | to remove NS record sets (and glue records below) that refer | |||
| to the faulty server until the servers are fixed. This should | to the faulty server until the servers are fixed. This should | |||
| only be done as a last resort and with due consideration, as | only be done as a last resort and with due consideration, as | |||
| removal of a delegation can have unanticipated side effects. | removal of a delegation can have unanticipated side effects. | |||
| For example, other parts of the DNS tree may depend on names | For example, other parts of the DNS tree may depend on names | |||
| below the removed zone cut, and the parent operator may find | below the removed zone cut, and the parent operator may find | |||
| themselves responsible for causing new DNS failures to occur. | themselves responsible for causing new DNS failures to occur. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="seccon" numbered="true" toc="default"> | ||||
| <section anchor="seccon" title="Security Considerations"> | <name>Security Considerations</name> | |||
| <t> | <t> | |||
| Testing protocol compliance can potentially result in false | Testing protocol compliance can potentially result in false | |||
| reports of attempts to attack services from Intrusion Detection | reports of attempts to attack services from Intrusion Detection | |||
| Services and firewalls. All of the tests are well-formed | Services and firewalls. All of the tests are well-formed | |||
| (though not necessarily common) DNS queries. None of the tests | (though not necessarily common) DNS queries. None of the tests | |||
| listed above should cause any harm to a protocol-compliant | listed above should cause any harm to a protocol-compliant | |||
| server. | server. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Relaxing firewall settings to ensure EDNS compliance could | Relaxing firewall settings to ensure EDNS compliance could | |||
| potentially expose a critical implementation flaw in the | potentially expose a critical implementation flaw in the | |||
| nameserver. Nameservers should be tested for conformance | nameserver. Nameservers should be tested for conformance | |||
| before relaxing firewall settings. | before relaxing firewall settings. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| When removing delegations for non-compliant servers there | When removing delegations for non-compliant servers, there | |||
| can be a knock on effect on other zones that require these | can be a knock-on effect on other zones that require these | |||
| zones to be operational for the nameservers addresses to be | zones to be operational for the nameservers addresses to be | |||
| resolved. | resolved. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="iana" title="IANA Considerations"> | <section anchor="iana" numbered="true" toc="default"> | |||
| <t> | <name>IANA Considerations</name> | |||
| There are no actions for IANA. | <t>This document has no IANA actions.</t> | |||
| </t> | ||||
| </section> | ||||
| <section title="Acknowledgements"> | ||||
| <t> | ||||
| The contributions of the following are gratefully acknowledged: | ||||
| </t> | ||||
| <t> | ||||
| Matthew Pounsett, Tim Wicinski. | ||||
| </t> | ||||
| </section> | </section> | |||
| </middle> | </middle> | |||
| <back> | <back> | |||
| <references title="Normative References"> | <references> | |||
| &rfc1034; &rfc1035; &rfc3225; &rfc4035; | <name>References</name> | |||
| &rfc6840; &rfc6895; &rfc6891; &rfc7766; | <references> | |||
| </references> | <name>Normative References</name> | |||
| <references title="Informative References"> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| &rfc2671; &rfc3597; | ence.RFC.1034.xml"/> | |||
| &rfc5001; &rfc7314; &rfc7871; &rfc7873; | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <reference anchor="ISC" target="https://www.isc.org/"> | ence.RFC.1035.xml"/> | |||
| <front> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <title>Internet Systems Consortuim</title> | ence.RFC.3225.xml"/> | |||
| <author/> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <date/> | ence.RFC.4035.xml"/> | |||
| </front> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| </reference> | ence.RFC.6840.xml"/> | |||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.6895.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.6891.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.7766.xml"/> | ||||
| </references> | ||||
| <references> | ||||
| <name>Informative References</name> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.2671.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.3597.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.5001.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.7314.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.7871.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.7873.xml"/> | ||||
| <reference anchor="ISC" target="https://www.isc.org/"> | ||||
| <front> | ||||
| <title>Internet Systems Consortuim</title> | ||||
| <author/> | ||||
| <date/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="IANA-DNS" | ||||
| target="https://www.iana.org/assignments/dns-parameters/"> | ||||
| <front> | ||||
| <title>Domain Name System (DNS) Parameters</title> | ||||
| <author><organization>IANA</organization></author> | ||||
| </front> | ||||
| </reference> | ||||
| </references> | ||||
| </references> | </references> | |||
| <section numbered="false" toc="default"> | ||||
| <name>Acknowledgements</name> | ||||
| <t>The contributions of <contact fullname="Matthew Pounsett"/> and | ||||
| <contact fullname="Tim Wicinski"/> are gratefully acknowledged.</t> | ||||
| </section> | ||||
| </back> | </back> | |||
| </rfc> | </rfc> | |||
| End of changes. 240 change blocks. | ||||
| 557 lines changed or deleted | 535 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||