1 1.1 christos % DIFFERENCES NSD 3 and other name servers. 2 1.1 christos \documentclass[twoside,titlepage,english]{nlnetlabs} 3 1.1 christos \newcites{rfc}{RFC references} 4 1.1 christos 5 1.1 christos \def\nlnetlabsno{2006-004} 6 1.1 christos 7 1.3 christos \rcsdetails{Id} 8 1.1 christos % Prints RCS details at the bottom of the page. 9 1.1 christos 10 1.1 christos \title{Response Differences between\\ NSD and other DNS Servers} 11 1.1 christos \author{ 12 1.1 christos %This escape is needed. Because of wrapping by hyperref 13 1.1 christos \texorpdfstring{ 14 1.1 christos Jelte Jansen\thanks{\href{mailto:jelte (a] nlnetlabs.nl}{jelte (a] nlnetlabs.nl}}, 15 1.1 christos \textsl{NLnet Labs}\\ 16 1.1 christos Wouter Wijngaards\thanks{\href{mailto:wouter (a] nlnetlabs.nl}{wouter (a] nlnetlabs.nl}}, 17 1.1 christos \textsl{NLnet Labs} 18 1.1 christos } 19 1.1 christos {Jelte Jansen, Wouter C.A. Wijngaards} 20 1.1 christos } 21 1.1 christos \date{ 22 1.1 christos \today 23 1.1 christos } 24 1.1 christos 25 1.1 christos \begin{document} 26 1.1 christos \flushbottom 27 1.1 christos \maketitle{} 28 1.1 christos 29 1.1 christos \begin{abstract} 30 1.1 christos This note describes observed differences in responses between NSD and 31 1.1 christos other DNS server implementations. NSD 3.0.0 is compared to NSD 2.3.6, 32 1.1 christos BIND 8.4.7 and BIND 9.3.2. Differences in answers to captured queries from 33 1.1 christos resolvers are tallied and analyzed. No interoperability problems are found. 34 1.1 christos \end{abstract} 35 1.1 christos 36 1.1 christos 37 1.1 christos \tableofcontents 38 1.1 christos \newpage 39 1.1 christos 40 1.1 christos \section{Introduction} 41 1.1 christos 42 1.1 christos The NSD name server is compared to other DNS server implementations 43 1.1 christos in order to assess server interoperability. 44 1.1 christos The goal is to observe differences in the answers that the name servers 45 1.1 christos provide. These differences are categorized and counted. 46 1.1 christos 47 1.1 christos We used BIND 8 and BIND 9 versions to compare against. Also regression 48 1.1 christos tests have been run on our testlab, comparing NSD 2 versus NSD 3. 49 1.1 christos 50 1.1 christos Our method uses a set of queries captured from production name servers. 51 1.1 christos These queries are sent over UDP to a name server set up to serve a 52 1.1 christos particular zone. Then the responses from the name server are recorded. 53 1.1 christos For every query, the different answers provided by the server 54 1.1 christos implementations are compared. 55 1.1 christos 56 1.1 christos Unparseable answers and no answers from the servers are handled 57 1.1 christos identically by the comparison software. This is not a problem because 58 1.1 christos both BIND and NSD are mature and stable DNS implementations, all answers 59 1.1 christos they send are parseable. Only in a very few cases, where the query is 60 1.1 christos very badly formed, no answers are sent back. 61 1.1 christos 62 1.1 christos The differences are found by replaying captured DNS query traces from 63 1.1 christos the NL TLD and from the root zone against different name servers. The 64 1.1 christos differences in the answers are then analyzed, by first performing a 65 1.1 christos byte-comparison on the packets. If the packets are binary different, 66 1.1 christos the contents are parsed, thus removing differences in domain name 67 1.1 christos compression, and normalized (sorted, lowercase) in presentation. If the 68 1.1 christos results do not match after normalization, then a list of difference 69 1.1 christos categories is consulted. The difference is classified as the first 70 1.1 christos category that matches. If a difference in answers does not match any 71 1.1 christos category, then the process stops and the user is notified. All the 72 1.1 christos differences are categorized for the traces we present. 73 1.1 christos 74 1.1 christos In addition, we gratefully made use of the PROTOS DNS tool developed 75 1.1 christos at the University of Oulu which they made publicly available at 76 1.1 christos \href{http://www.ee.oulu.fi/research/ouspg/protos/testing/c09/dns} 77 1.1 christos {the protos webpage}\footnote{http://www.ee.oulu.fi/research/ouspg/protos/testing/c09/dns} 78 1.1 christos and played the queries against the authoritative name servers. 79 1.1 christos We fixed a packet parsing error in NSD3-prerelease and both NSD3 and 80 1.1 christos BIND 9.3.2 remained running and responsive. 81 1.1 christos 82 1.1 christos Additionally we used the faulty DNS query traces in the wiki-ethereal 83 1.1 christos repository. These can be found in \href{http://wiki.ethereal.com/SampleCaptures} 84 1.1 christos {the ethereal wiki}\footnote{http://wiki.ethereal.com/SampleCaptures}. 85 1.1 christos These traces posed no problem for BIND and NSD, mostly FORMERR answers. 86 1.1 christos 87 1.1 christos A previous document DIFFERENCES between BIND 8.4.4 and NSD 2.0.0 can be found 88 1.1 christos in the NSD 2.x package. 89 1.1 christos 90 1.1 christos In the places where differences have been found between BIND and NSD, 91 1.1 christos in the authors' opinion, no interoperability problems result for resolvers. 92 1.1 christos 93 1.1 christos 94 1.1 christos \section{Response differences between BIND 9.3.2 and NSD 3.0.0} 95 1.1 christos 96 1.1 christos In this section the response differences between BIND 9.3.2 and NSD 3.0.0 97 1.1 christos are presented and analyzed. We start in Section~\ref{root_b932nsd3} and 98 1.1 christos Section~\ref{nl_b932nsd3} with presenting 99 1.1 christos the difference statistics for two test traces. Then in 100 1.1 christos Section~\ref{sec:features} and Section~\ref{sec:funcdiff} 101 1.1 christos the difference categories are explained in more detail. 102 1.1 christos 103 1.1 christos 104 1.1 christos \subsection{Comparison of responses to root queries} 105 1.1 christos \label{root_b932nsd3} 106 1.1 christos 107 1.1 christos Comparison between NSD 3.0.0 and BIND 9.3.2 for a root trace. 108 1.1 christos 109 1.1 christos \begin{tabular}{lrr} 110 1.1 christos {\em difference} & {\em packets} & {\em \%diff} \\ 111 1.1 christos d-additional (\ref{d-additional}) & 455607 & 59.19\% \\ 112 1.1 christos n-clrdobit (\ref{n-clrdobit}) & 208389 & 27.07\% \\ 113 1.1 christos b-soattl (\ref{b-soattl}) & 101707 & 13.21\% \\ 114 1.1 christos n-update (\ref{n-update}) & 1858 & 0.24\% \\ 115 1.1 christos d-hostname (\ref{d-hostname}) & 1032 & 0.13\% \\ 116 1.1 christos d-formerrquery (\ref{d-formerrquery}) & 773 & 0.10\% \\ 117 1.1 christos b-class0 (\ref{b-class0}) & 264 & 0.03\% \\ 118 1.1 christos d-refusedquery (\ref{d-refusedquery}) & 79 & 0.01\% \\ 119 1.1 christos d-notify (\ref{d-notify}) & 18 & 0.00\% \\ 120 1.1 christos b-mailb (\ref{b-mailb}) & 7 & 0.00\% \\ 121 1.1 christos n-tcinquery (\ref{n-tcinquery}) & 6 & 0.00\% \\ 122 1.1 christos b-classany-nxdomain (\ref{b-classany-nxdomain}) & 5 & 0.00\% \\ 123 1.1 christos d-badqueryflags (\ref{d-badqueryflags}) & 4 & 0.00\% \\ 124 1.1 christos n-ixfr-notimpl (\ref{n-ixfr-notimpl}) & 3 & 0.00\% \\ 125 1.1 christos d-version (\ref{d-version}) & 1 & 0.00\% \\ 126 1.1 christos Total number of differences: & 769753 & 100\% \\ 127 1.1 christos Number of packets the same after normalization:&1474863 \\ 128 1.1 christos Number of packets exactly the same on the wire:& 59161 \\ 129 1.1 christos Total number of packets inspected: &2244616 \\ 130 1.1 christos \end{tabular} 131 1.1 christos 132 1.1 christos For each type of difference the number of packets in the trace that 133 1.1 christos match that difference are shown. The section where that difference 134 1.1 christos is analyzed is shown in parenthesis after the difference name. 135 1.1 christos The percentage of differences 136 1.1 christos explained by the difference category is listed. Adding up the packets 137 1.1 christos that are different gives the total number of differences, or 100\% 138 1.1 christos of the differences. 139 1.1 christos 140 1.1 christos The number of packets after normalization includes the number of 141 1.1 christos packets that are the same on the wire. 142 1.1 christos The total number of query packets is displayed at the bottom of the table. 143 1.1 christos 144 1.1 christos 145 1.1 christos \subsection{Comparison of responses to NL TLD queries} 146 1.1 christos \label{nl_b932nsd3} 147 1.1 christos 148 1.1 christos Comparison between NSD 3.0.0 and BIND 9.3.2, for a trace for .nl. 149 1.1 christos 150 1.1 christos \begin{tabular}{lrr} 151 1.1 christos {\em difference} & {\em packets} & {\em \%diff} \\ 152 1.1 christos d-unknown-opcode (\ref{d-unknown-opcode}) & 2541 & 26.44\% \\ 153 1.1 christos b-badquery-badanswer (\ref{b-badquery-badanswer}) & 1817 & 18.91\% \\ 154 1.1 christos n-clrdobit (\ref{n-clrdobit}) & 1495 & 15.56\% \\ 155 1.1 christos b-soattl (\ref{b-soattl}) & 1120 & 11.65\% \\ 156 1.1 christos n-update (\ref{n-update}) & 990 & 10.30\% \\ 157 1.1 christos d-badqueryflags (\ref{d-badqueryflags}) & 847 & 8.81\% \\ 158 1.1 christos d-hostname (\ref{d-hostname}) & 531 & 5.52\% \\ 159 1.1 christos d-notify (\ref{d-notify}) & 98 & 1.02\% \\ 160 1.1 christos b-upwards-ref (\ref{b-upwards-ref}) & 78 & 0.81\% \\ 161 1.1 christos n-clrcdbit (\ref{n-clrcdbit}) & 63 & 0.66\% \\ 162 1.1 christos d-version (\ref{d-version}) & 22 & 0.23\% \\ 163 1.1 christos b-noglue-nsquery (\ref{b-noglue-nsquery}) & 8 & 0.08\% \\ 164 1.1 christos b8-badedns0 (\ref{b8-badedns0}) & 1 & 0.01\% \\ 165 1.1 christos Total number of differences: & 9611 & 100\% \\ 166 1.1 christos Number of packets the same after normalization: & 90389 \\ 167 1.1 christos Number of packets exactly the same on the wire: & 52336 \\ 168 1.1 christos Total number of packets inspected: & 100000 \\ 169 1.1 christos \end{tabular} 170 1.1 christos 171 1.1 christos \subsection{Features} 172 1.1 christos \label{sec:features} 173 1.1 christos 174 1.1 christos In this section we enumerate a number of differences between 175 1.1 christos BIND 9.3.2 and NSD 3.0.0 that cannot be immediately explained 176 1.1 christos as design choices. These features could be seen as bugs in software 177 1.1 christos or protocol specs, except that they do not lead to interoperability 178 1.1 christos problems. 179 1.1 christos 180 1.1 christos 181 1.1 christos \subsubsection{n-clrdobit - NSD clears DO bit in response} 182 1.1 christos \label{n-clrdobit} 183 1.1 christos 184 1.1 christos NSD clears the DO bit in answers to queries with the DO bit. BIND copies the 185 1.1 christos DO bit to the answer. 186 1.1 christos 187 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 188 1.1 christos 189 1.1 christos In RFC4035\cite{rfc4035} the DO bit is not specified for answers. In the examples section 190 1.1 christos of that RFC the DO bit is shown for signed dig responses, although this could 191 1.1 christos refer to the query or the answer. NSD clears the DO bit for all answers, a 192 1.1 christos decision based on speed: the EDNS record sent back by NSD is precompiled and 193 1.1 christos not modified during answer processing. 194 1.1 christos 195 1.1 christos 196 1.1 christos \subsubsection{n-clrcdbit - NSD clears CD bit in response} 197 1.1 christos \label{n-clrcdbit} 198 1.1 christos 199 1.1 christos NSD clears the CD bit in answers to queries with the CD bit. BIND copies the 200 1.1 christos CD bit to the answer. 201 1.1 christos 202 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 203 1.1 christos 204 1.1 christos RFC 4035\cite{rfc4035} asserts that the CD bit must be cleared for 205 1.1 christos authoritative answers. The CD bit should be copied into the answer 206 1.1 christos by recursive servers. BIND copies the CD bit for some formerr queries. 207 1.1 christos 208 1.1 christos 209 1.1 christos \subsubsection{b-class0 - CLASS0 formerr in BIND} 210 1.1 christos \label{b-class0} 211 1.1 christos 212 1.1 christos For CLASS0, you can get either FORMERR, from BIND or REFUSED, from NSD. 213 1.1 christos 214 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 215 1.1 christos 216 1.1 christos Difference in interpretation of the RFCs, a CLASS value of 0 is interpreted 217 1.1 christos as a syntax error by BIND but as another valid class (that is not served) 218 1.1 christos by NSD. Resolvers are unaffected for CLASS IN. 219 1.1 christos 220 1.1 christos 221 1.1 christos \subsubsection{n-tcinquery - TC bit in query is formerr for NSD} 222 1.1 christos \label{n-tcinquery} 223 1.1 christos 224 1.1 christos NSD returns FORMERR if tc bit is set in query. 225 1.1 christos 226 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 227 1.1 christos 228 1.1 christos Queries cannot be longer than 512 octets, since the DNS header is short 229 1.1 christos and the query DNS name has a maximum length of 255 octets. Thus 230 1.1 christos TC (TrunCation) cannot happen. Only one question per query packet is 231 1.1 christos answered by NSD, this is a design decision. 232 1.1 christos 233 1.1 christos Some update, ixfr request, notify, gss-tsig TKEY sequence queries could 234 1.1 christos theoretically carry longer data in the query from the client. In practice 235 1.1 christos this does not happen, as 255 octet uncompressed names are not used. 236 1.1 christos If this were to happen, the client could attempt a TCP connection 237 1.1 christos immediately instead of setting a TC bit, or use EDNS0 to send longer packets. 238 1.1 christos 239 1.1 christos In this NSD is more strict in validation than BIND. 240 1.1 christos 241 1.1 christos 242 1.1 christos \subsubsection{b-soattl - BIND sets SOA TTL in authority section to 0 for SOA queries} 243 1.1 christos \label{b-soattl} 244 1.1 christos 245 1.1 christos This happens when asking for the SOA for a domain that is not served. 246 1.1 christos 247 1.1 christos \footnotesize 248 1.1 christos \begin{verbatim} 249 1.1 christos Query: 250 1.1 christos ;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 0 251 1.1 christos ;; flags: rd ; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 252 1.1 christos ;; QUESTION SECTION: 253 1.1 christos ;; foo.bar. IN SOA 254 1.1 christos \end{verbatim} 255 1.1 christos \normalsize 256 1.1 christos 257 1.1 christos 258 1.1 christos Answer from BIND 9.3.2: 259 1.1 christos 260 1.1 christos \footnotesize 261 1.1 christos \begin{verbatim} 262 1.1 christos ;; ->>HEADER<<- opcode: QUERY, rcode: NXDOMAIN, id: 6097 263 1.1 christos ;; flags: qr aa rd ; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 264 1.1 christos ;; QUESTION SECTION: 265 1.1 christos ;; foo.bar. IN SOA 266 1.1 christos 267 1.1 christos ;; ANSWER SECTION: 268 1.1 christos 269 1.1 christos ;; AUTHORITY SECTION: 270 1.1 christos . 0 IN SOA A.ROOT-SERVERS.NET. NSTLD.VERISIGN-GRS.COM. ( 271 1.1 christos 2006072801 1800 900 604800 86400) 272 1.1 christos 273 1.1 christos ;; ADDITIONAL SECTION: 274 1.1 christos 275 1.1 christos ;; Query time: 10 msec 276 1.1 christos ;; SERVER: 127.0.0.1 277 1.1 christos ;; WHEN: Wed Aug 23 13:52:36 2006 278 1.1 christos ;; MSG SIZE rcvd: 100 279 1.1 christos \end{verbatim} 280 1.1 christos \normalsize 281 1.1 christos 282 1.1 christos Answer from NSD 3: 283 1.1 christos 284 1.1 christos \footnotesize 285 1.1 christos \begin{verbatim} 286 1.1 christos ;; ->>HEADER<<- opcode: QUERY, rcode: NXDOMAIN, id: 26095 287 1.1 christos ;; flags: qr aa rd ; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 288 1.1 christos ;; QUESTION SECTION: 289 1.1 christos ;; foo.bar. IN SOA 290 1.1 christos 291 1.1 christos ;; ANSWER SECTION: 292 1.1 christos 293 1.1 christos ;; AUTHORITY SECTION: 294 1.1 christos . 86400 IN SOA a.root-servers.net. nstld.verisign-grs.com. ( 295 1.1 christos 2006072801 1800 900 604800 86400) 296 1.1 christos 297 1.1 christos ;; ADDITIONAL SECTION: 298 1.1 christos 299 1.1 christos ;; Query time: 60 msec 300 1.1 christos ;; SERVER: 127.0.0.1 301 1.1 christos ;; WHEN: Wed Aug 23 13:53:30 2006 302 1.1 christos ;; MSG SIZE rcvd: 100 303 1.1 christos \end{verbatim} 304 1.1 christos \normalsize 305 1.1 christos 306 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 307 1.1 christos 308 1.1 christos BIND conforms to internet-draft draft-andrews-dnsext-soa-discovery which 309 1.1 christos has at the moment of code development not (yet) been published as RFC. 310 1.1 christos NSD conforms to the RFCs. 311 1.1 christos 312 1.1 christos 313 1.1 christos \subsubsection{b-classany-nxdomain - BIND gives an auth answer for class ANY nxdomain} 314 1.1 christos \label{b-classany-nxdomain} 315 1.1 christos 316 1.1 christos A difference in behaviour for CLASS=ANY queries. For existing domains both 317 1.1 christos BIND and NSD reply with AA bit cleared. For not existing domains (nxdomain) 318 1.1 christos NSD replies with AA bit cleared. BIND replies with AA bit on and includes a 319 1.1 christos SOA (CLASS=IN) for the zone, as for an authoritative nxdomain. 320 1.1 christos 321 1.1 christos Query: 322 1.1 christos 323 1.1 christos \footnotesize 324 1.1 christos \begin{verbatim} 325 1.1 christos ;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 13328 326 1.1 christos ;; flags: ; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 327 1.1 christos ;; QUESTION SECTION: 328 1.1 christos ;; nslabs.ruO. ANY MX 329 1.1 christos \end{verbatim} 330 1.1 christos \normalsize 331 1.1 christos 332 1.1 christos Answer from BIND 9.3.2: 333 1.1 christos 334 1.1 christos \footnotesize 335 1.1 christos \begin{verbatim} 336 1.1 christos ;; ->>HEADER<<- opcode: QUERY, rcode: NXDOMAIN, id: 13328 337 1.1 christos ;; flags: qr aa ; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 338 1.1 christos ;; QUESTION SECTION: 339 1.1 christos ;; nslabs.ruo. ANY MX 340 1.1 christos 341 1.1 christos ;; ANSWER SECTION: 342 1.1 christos 343 1.1 christos ;; AUTHORITY SECTION: 344 1.1 christos . 86400 IN SOA a.root-servers.net. nstld.verisign-grs.com. ( 345 1.1 christos 2006072801 1800 900 604800 86400) 346 1.1 christos 347 1.1 christos ;; ADDITIONAL SECTION: 348 1.1 christos 349 1.1 christos ;; Query time: 0 msec 350 1.1 christos ;; WHEN: Wed Aug 23 13:58:51 2006 351 1.1 christos ;; MSG SIZE rcvd: 103 352 1.1 christos \end{verbatim} 353 1.1 christos \normalsize 354 1.1 christos 355 1.1 christos Answer from NSD 3: 356 1.1 christos 357 1.1 christos \footnotesize 358 1.1 christos \begin{verbatim} 359 1.1 christos ;; ->>HEADER<<- opcode: QUERY, rcode: NXDOMAIN, id: 13328 360 1.1 christos ;; flags: qr ; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 361 1.1 christos ;; QUESTION SECTION: 362 1.1 christos ;; nslabs.ruo. ANY MX 363 1.1 christos 364 1.1 christos ;; ANSWER SECTION: 365 1.1 christos 366 1.1 christos ;; AUTHORITY SECTION: 367 1.1 christos 368 1.1 christos ;; ADDITIONAL SECTION: 369 1.1 christos 370 1.1 christos ;; Query time: 0 msec 371 1.1 christos ;; WHEN: Wed Aug 23 13:58:51 2006 372 1.1 christos ;; MSG SIZE rcvd: 28 373 1.1 christos \end{verbatim} 374 1.1 christos \normalsize 375 1.1 christos 376 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 377 1.1 christos 378 1.1 christos Feature of BIND where it answers authoritatively for CLASS ANY 379 1.1 christos nxdomain queries. 380 1.1 christos 381 1.1 christos 382 1.1 christos \subsubsection{b-badquery-badanswer - BIND replies with bad answer for 383 1.1 christos some bad queries} 384 1.1 christos \label{b-badquery-badanswer} 385 1.1 christos 386 1.1 christos BIND replies with an answer packet that cannot be parsed, or does 387 1.1 christos not answer at all. NSD always generates 388 1.1 christos an answer, with the appropriate RCODE (mostly NOTIMPL and FORMERR, but 389 1.1 christos also NXDOMAIN to NOTIFY queries). All these queries are malformed in 390 1.1 christos some way. 391 1.1 christos 392 1.1 christos A (very simple) example of a query without an answer 393 1.1 christos is a query packet of 18 zero bytes. For some queries no answer 394 1.1 christos only happens when BIND is presented with a trace of queries, not for 395 1.1 christos a single query. 396 1.1 christos 397 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 398 1.1 christos 399 1.1 christos BIND includes (part of) the unparseable question into the answer, or 400 1.1 christos some internal state of BIND is affected by earlier queries. 401 1.1 christos 402 1.1 christos NSD manages to answer the malformed query. Note that NSD does not answer 403 1.1 christos queries that are too short, or that have the QR bit set. NSD tries to be 404 1.1 christos as liberal in what it accepts as possible. 405 1.1 christos 406 1.1 christos 407 1.1 christos \subsection{Functionality Differences} 408 1.1 christos \label{sec:funcdiff} 409 1.1 christos 410 1.1 christos The next group of differences are due to the fact that NSD does not 411 1.1 christos implement some functionality that is requested by resolvers. This 412 1.1 christos is a design choice and should not cause resolver problems at all, 413 1.1 christos since responses to those requests are within protocol specs. 414 1.1 christos 415 1.1 christos 416 1.1 christos \subsubsection{d-notify - different NOTIFY errors} 417 1.1 christos \label{d-notify} 418 1.1 christos 419 1.1 christos BIND and NSD give different errors for notify queries. The servers are started 420 1.1 christos without any configuration for access control on notify. For notify messages 421 1.1 christos aimed at a zone that is served, BIND 9.3.2 returns a NOERROR answer, and 422 1.1 christos NSD 3 returns NOTAUTH. For notify messages on a zone that is not served 423 1.1 christos (in-addr.arpa.) BIND 9.3.2 returns NOTAUTH and NSD 3 returns NXDOMAIN. 424 1.1 christos 425 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 426 1.1 christos 427 1.1 christos Default configuration differs between the two packages. NSD is more strict. 428 1.1 christos Error codes are different, the tools that send notifies are not affected. 429 1.1 christos 430 1.1 christos 431 1.1 christos \subsubsection{n-update - NSD does not implement dynamic update} 432 1.1 christos \label{n-update} 433 1.1 christos 434 1.1 christos For UPDATE, you can get either REFUSED/NXRRSET/other RCODE from BIND 9.3.2 or 435 1.1 christos NOTIMPL from nsd3. 436 1.1 christos 437 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 438 1.1 christos 439 1.1 christos NSD does not implement dynamic update. 440 1.1 christos 441 1.1 christos 442 1.1 christos \subsubsection{b-mailb - BIND does not implement MAILB} 443 1.1 christos \label{b-mailb} 444 1.1 christos 445 1.1 christos For MAILB, you can get either NOTIMPL(BIND 9) or NOERROR/NXDOMAIN(NSD 3). 446 1.1 christos 447 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 448 1.1 christos 449 1.1 christos BIND does not implement queries for the MAILB type. NSD treats it as 450 1.1 christos one of the RRTYPEs. MAILB is obsoleted by RFCs, the MX type is 451 1.1 christos used to transfer mail information now. 452 1.1 christos 453 1.1 christos 454 1.1 christos \subsubsection{d-version - BIND returns servfail on version.server queries} 455 1.1 christos \label{d-version} 456 1.1 christos 457 1.1 christos NSD returns version.server query, BIND returns servfail. 458 1.1 christos 459 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 460 1.1 christos 461 1.1 christos Both NSD and BIND return version.bind queries of the chaos class. 462 1.1 christos These queries differ in the version number they return, of course. 463 1.1 christos BIND does not return version.server queries. This is a design decision 464 1.1 christos on the part of NSD to return version.server queries with the same answer. 465 1.1 christos 466 1.1 christos 467 1.1 christos \subsubsection{d-additional - Different additional section on truncated answers} 468 1.1 christos \label{d-additional} 469 1.1 christos 470 1.1 christos NSD and BIND return different additional sections on truncated answers 471 1.1 christos to queries from the root. These answers are 480+ bytes long. 472 1.1 christos 473 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 474 1.1 christos 475 1.1 christos Not all the A and AAAA data fits into the additional section of the answer. 476 1.1 christos BIND includes different names than NSD does, and BIND is observed to sometimes 477 1.1 christos include one more AAAA record, less A records in the additional section. 478 1.1 christos Resolvers should be unaffected. 479 1.1 christos 480 1.1 christos 481 1.1 christos \subsubsection{d-refusedquery - BIND includes query section in REFUSED answers} 482 1.1 christos \label{d-refusedquery} 483 1.1 christos 484 1.1 christos BIND includes the query sent for REFUSED answers. NSD replies with only 485 1.1 christos the DNS header section. 486 1.1 christos 487 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 488 1.1 christos 489 1.1 christos The resolver must inspect the query ID. The error code provides sufficient 490 1.1 christos information. Sending the header makes NSD replies smaller and thus more 491 1.1 christos resilient to DoS attacks. 492 1.1 christos 493 1.1 christos 494 1.1 christos \subsubsection{d-hostname - BIND adds a NS record for hostname.bind} 495 1.1 christos \label{d-hostname} 496 1.1 christos 497 1.1 christos BIND includes an additional RR in the authority section of the reply: 498 1.1 christos \footnotesize 499 1.1 christos \begin{verbatim} 500 1.1 christos hostname.bind. 0 CH NS hostname.bind. 501 1.1 christos \end{verbatim} 502 1.1 christos \normalsize 503 1.1 christos 504 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 505 1.1 christos 506 1.1 christos The RR seems useless. NSD does not include it. 507 1.1 christos 508 1.1 christos 509 1.1 christos \subsubsection{n-ixfr-notimpl - NSD does not implement IXFR} 510 1.1 christos \label{n-ixfr-notimpl} 511 1.1 christos 512 1.1 christos To queries for IXFR BIND responds with a valid answer (the latest SOA) 513 1.1 christos and NSD responds with NOTIMPL error. 514 1.1 christos 515 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 516 1.1 christos 517 1.1 christos NSD 3.0.0 does not implement IXFR. It returns NOTIMPL by design. 518 1.1 christos 519 1.1 christos 520 1.1 christos \subsubsection{d-formerrquery - BIND includes query section in FORMERR answers} 521 1.1 christos \label{d-formerrquery} 522 1.1 christos 523 1.1 christos BIND includes the query sent for FORMERR answers. NSD replies with only 524 1.1 christos the DNS header section. For some queries, NSD includes an EDNS record in 525 1.1 christos the reply if there was a recognizable EDNS record in the query. 526 1.1 christos 527 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 528 1.1 christos 529 1.1 christos The resolver must inspect the query ID. The error code provides sufficient 530 1.1 christos information. Sending the header makes NSD replies smaller and thus more 531 1.1 christos resilient to DoS attacks. 532 1.1 christos 533 1.1 christos 534 1.1 christos \subsubsection{d-badqueryflags - BIND includes query section in FORMERR answers} 535 1.1 christos \label{d-badqueryflags} 536 1.1 christos 537 1.1 christos BIND includes the query section in reply to unparseable queries. NSD does not. 538 1.1 christos 539 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 540 1.1 christos 541 1.1 christos Same as d-formerrquery (\ref{d-formerrquery}), but the implementation of the comparison 542 1.1 christos software could not parse the query either, thus a separate label. 543 1.1 christos 544 1.1 christos 545 1.1 christos \subsubsection{d-unknown-class - BIND includes query section in answers to unknown class} 546 1.1 christos \label{d-unknown-class} 547 1.1 christos 548 1.1 christos For queries with an unknown class in the query, BIND includes the query section 549 1.1 christos in the answer. NSD does not. 550 1.1 christos 551 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 552 1.1 christos 553 1.1 christos Same as d-formerrquery (\ref{d-formerrquery}), but for a different error. 554 1.1 christos 555 1.1 christos 556 1.1 christos \subsubsection{d-unknown-opcode - NSD returns NOTIMPL for unknown opcode} 557 1.1 christos \label{d-unknown-opcode} 558 1.1 christos 559 1.1 christos For queries that are bad packets, with malformed RRs, with an unknown opcode, 560 1.1 christos BIND returns a FORMERR, but NSD gives up after checking the opcode and 561 1.1 christos returns NOTIMPL. NSD copies the flags from the query, and turns on the 562 1.1 christos QR (query response) bit, BIND zeroes some of the flags. 563 1.1 christos 564 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 565 1.1 christos 566 1.1 christos NOTIMPL is appropriate since NSD does not implement whatever functionality 567 1.1 christos is being looked for. 568 1.1 christos 569 1.1 christos 570 1.1 christos \subsubsection{b-upwards-ref - BIND returns root delegation} 571 1.1 christos \label{b-upwards-ref} 572 1.1 christos 573 1.1 christos For queries to a domain that is not served, which can only have arrived at 574 1.1 christos this server due to a lame delegation, BIND returns a root delegation. NSD 575 1.1 christos returns SERVFAIL. 576 1.1 christos 577 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 578 1.1 christos 579 1.1 christos By design, NSD does not know the root-servers. NSD is unable to reply as 580 1.1 christos the zone is not configured, hence the SERVFAIL. This is also discussed in 581 1.1 christos the REQUIREMENTS document for NSD. 582 1.1 christos 583 1.1 christos 584 1.1 christos \subsubsection{b-noglue-nsquery - BIND returns no glue for NS queries} 585 1.1 christos \label{b-noglue-nsquery} 586 1.1 christos 587 1.1 christos For queries for the NS records of the zone, BIND does not include glue 588 1.1 christos for the NS records. NSD includes glue for the NS servers that lie within 589 1.1 christos the zone. 590 1.1 christos 591 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 592 1.1 christos 593 1.1 christos The glue saves a followup query. 594 1.1 christos 595 1.1 christos 596 1.1 christos \subsubsection{d-noquestion - different error on no question} 597 1.1 christos \label{d-noquestion} 598 1.1 christos 599 1.1 christos For queries without a question section the error code differs. 600 1.1 christos NSD considers it a FORMERR. BIND returns REFUSED. 601 1.1 christos 602 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 603 1.1 christos 604 1.1 christos Error code not specified for this corner case. No problems for resolvers. 605 1.1 christos 606 1.1 christos 607 1.1 christos \subsubsection{b-uchar - BIND returns FORMERR on strange characters} 608 1.1 christos \label{b-uchar} 609 1.1 christos 610 1.1 christos BIND returns FORMERR on strange characters in the query, such as 611 1.1 christos 0x00, 0xff, 0xe4, 0x20, 0x40 and so on. 612 1.1 christos 613 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 614 1.1 christos 615 1.1 christos NSD does not give a formerr on these queries, it processes them. 616 1.1 christos NSD normalizes names to lower case. Otherwise leaves them untouched. 617 1.1 christos BIND preserves case in answers. Choice made in REQUIREMENTS for NSD, 618 1.1 christos also see RFC1035\cite{rfc1035} 2.3.3. 619 1.1 christos 620 1.1 christos 621 1.1 christos \section{Response differences between NSD 2.3.6 and NSD 3.0.0} 622 1.1 christos 623 1.1 christos The differences between NSD 2.3.6 and NSD 3.0.0 are listed below. All are due 624 1.1 christos to version number changes and new features in NSD 3. 625 1.1 christos 626 1.1 christos 627 1.1 christos \subsection{Comparison of responses in root trace} 628 1.1 christos 629 1.1 christos Differences between NSD 2.3.6 and NSD 3.0.0 for a root trace. 630 1.1 christos Note that apart from the 26 packets that are different, all responses are 631 1.1 christos binary the same on the wire between the two versions of NSD. 632 1.1 christos 633 1.1 christos \begin{tabular}{lrr} 634 1.1 christos {\em difference} & {\em packets} & {\em \%diff} \\ 635 1.1 christos n-notify (\ref{n-notify}) & 19 & 73.08\% \\ 636 1.1 christos n-ixfr (\ref{n-ixfr}) & 3 & 11.54\% \\ 637 1.1 christos version.bind (\ref{nsd-version}) & 3 & 11.54\% \\ 638 1.1 christos version.server (\ref{nsd-version}) & 1 & 3.85\% \\ 639 1.1 christos Total number of differences: & 26 & 100\% \\ 640 1.1 christos Number of packets the same after normalization:&2244590 \\ 641 1.1 christos Number of packets exactly the same on the wire:&2244590 \\ 642 1.1 christos Total number of packets inspected: &2244616 \\ 643 1.1 christos \end{tabular} 644 1.1 christos 645 1.1 christos 646 1.1 christos \subsection{Comparison of responses in NL TLD trace} 647 1.1 christos 648 1.1 christos Differences between NSD 2.3.6 and NSD 3.0.0 for a nl. trace. 649 1.1 christos Note that apart from the 311 packets that are different, all responses are 650 1.1 christos binary the same on the wire between the two versions of NSD. 651 1.1 christos 652 1.1 christos \begin{tabular}{lrr} 653 1.1 christos {\em difference} & {\em packets} & {\em \%diff} \\ 654 1.1 christos n-notify (\ref{n-notify}) & 289 & 92.93\% \\ 655 1.1 christos version.bind (\ref{nsd-version}) & 22 & 7.07\% \\ 656 1.1 christos Total number of differences: & 311 & 100\% \\ 657 1.1 christos Number of packets the same after normalization:& 99689 \\ 658 1.1 christos Number of packets exactly the same on the wire:& 99689 \\ 659 1.1 christos Total number of packets inspected: &100000 \\ 660 1.1 christos \end{tabular} 661 1.1 christos 662 1.1 christos 663 1.1 christos \subsection{Version number - version.bind and version.server} 664 1.1 christos \label{nsd-version} 665 1.1 christos 666 1.1 christos To queries for version.bind and version.server the different implementations 667 1.1 christos return a different version number, as they should. 668 1.1 christos 669 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 670 1.1 christos 671 1.1 christos Expected. Correct version numbers are returned. 672 1.1 christos 673 1.1 christos 674 1.1 christos \subsection{n-notify - notify not implemented in NSD 2} 675 1.1 christos \label{n-notify} 676 1.1 christos 677 1.1 christos Notifications are handled differently. NSD 2 returns NOTIMPL error code, 678 1.1 christos while NSD 3 returns NOTAUTH or NXDOMAIN error codes. 679 1.1 christos 680 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 681 1.1 christos 682 1.1 christos Default config denies all notify queries for NSD 3. These answers are correct 683 1.1 christos for non-existing and not authorized domains. 684 1.1 christos 685 1.1 christos 686 1.1 christos \subsection{n-ixfr - IXFR error FORMERR in NSD 2} 687 1.1 christos \label{n-ixfr} 688 1.1 christos 689 1.1 christos To IXFR query questions different error codes are given. The NSD 2 690 1.1 christos gives FORMERR (due to the RR in the authority section). NSD 3 returns 691 1.1 christos NOTIMPL. 692 1.1 christos 693 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 694 1.1 christos 695 1.1 christos Neither version of NSD implements IXFR. It is more appropriate to 696 1.1 christos return the NOTIMPL error code in that case. Bugfix in NSD. 697 1.1 christos 698 1.1 christos 699 1.1 christos \section{Response differences between BIND 8 and NSD 3.0.0} 700 1.1 christos 701 1.1 christos In this section the response differences between BIND 8.4.7 and NSD 3.0.0 702 1.1 christos are categorized and analyzed. 703 1.1 christos 704 1.1 christos 705 1.1 christos \subsection{Comparison of responses in root trace} 706 1.1 christos 707 1.1 christos The differences between BIND 8.4.7 and NSD 3.0.0 when presented 708 1.1 christos with queries for the root zone are below. 709 1.1 christos 710 1.1 christos \begin{tabular}{lrr} 711 1.1 christos {\em difference} & {\em packets} & {\em \%diff} \\ 712 1.1 christos n-clrcdbit (\ref{n-clrcdbit}) & 516372 &84.39\% \\ 713 1.1 christos d-hostname (\ref{d-hostname}) & 53431 &8.73\% \\ 714 1.1 christos d-additional (\ref{d-additional}) & 32526 &5.32\% \\ 715 1.1 christos b8-nodata-ttlminup (\ref{b8-nodata-ttlminup}) & 4611 &0.75\% \\ 716 1.1 christos n-update (\ref{n-update}) & 1856 &0.30\% \\ 717 1.1 christos d-version (\ref{d-version}) & 1033 &0.17\% \\ 718 1.1 christos b8-auth-any (\ref{b8-auth-any}) & 519 &0.08\% \\ 719 1.1 christos b8-badedns0 (\ref{b8-badedns0}) & 492 &0.08\% \\ 720 1.1 christos d-unknown-class (\ref{d-unknown-class}) & 482 &0.08\% \\ 721 1.1 christos b-badquery-badanswer (\ref{b-badquery-badanswer}) & 451 &0.07\% \\ 722 1.1 christos b-class0 (\ref{b-class0}) & 97 &0.02\% \\ 723 1.1 christos d-notify (\ref{d-notify}) & 18 &0.00\% \\ 724 1.1 christos b8-ignore-tc-query (\ref{b8-ignore-tc-query}) & 6 &0.00\% \\ 725 1.1 christos b8-badquery-ignored (\ref{b8-badquery-ignored}) & 4 &0.00\% \\ 726 1.1 christos n-ixfr-notimpl (\ref{n-ixfr-notimpl}) & 3 &0.00\% \\ 727 1.1 christos b-soattl (\ref{b-soattl}) & 1 &0.00\% \\ 728 1.1 christos Total number of differences: & 611902 &100\% \\ 729 1.1 christos Number of packets the same after normalization:&1632714 \\ 730 1.1 christos Number of packets exactly the same on the wire:& 2299 \\ 731 1.1 christos Total number of packets inspected: &2244616 \\ 732 1.1 christos \end{tabular} 733 1.1 christos 734 1.1 christos 735 1.1 christos \subsection{Comparison of responses in NL TLD trace} 736 1.1 christos 737 1.1 christos The differences between BIND 8.4.7 and NSD 3.0.0 when presented 738 1.1 christos with queries for the .nl zone are below. 739 1.1 christos 740 1.1 christos \begin{tabular}{lrr} 741 1.1 christos {\em difference} & {\em packets} & {\em \%diff} \\ 742 1.1 christos n-clrcdbit (\ref{n-clrcdbit}) & 2857 &33.53\% \\ 743 1.1 christos d-unknown-opcode (\ref{d-unknown-opcode}) & 2692 &31.59\% \\ 744 1.1 christos n-update (\ref{n-update}) & 1283 &15.06\% \\ 745 1.1 christos d-badqueryflags (\ref{d-badqueryflags}) & 841 &9.87\% \\ 746 1.1 christos d-hostname (\ref{d-hostname}) & 531 &6.23\% \\ 747 1.1 christos d-notify (\ref{d-notify}) & 293 &3.44\% \\ 748 1.1 christos d-version (\ref{d-version}) & 22 &0.26\% \\ 749 1.1 christos b-badquery-badanswer (\ref{b-badquery-badanswer}) & 1 &0.01\% \\ 750 1.1 christos b8-badedns0 (\ref{b8-badedns0}) & 1 &0.01\% \\ 751 1.1 christos Total number of differences: &8521 &100\% \\ 752 1.1 christos Number of packets the same after normalization:&91479 \\ 753 1.1 christos Number of packets exactly the same on the wire:&90837 \\ 754 1.1 christos Total number of packets inspected:&100000 \\ 755 1.1 christos \end{tabular} 756 1.1 christos 757 1.1 christos 758 1.1 christos \subsection{b8-nodata-ttlminup - BIND 8 uses minimum TTL from SOA also if bigger} 759 1.1 christos \label{b8-nodata-ttlminup} 760 1.1 christos 761 1.1 christos For NXDOMAIN queries in root-servers.net BIND 8 uses the minimum TTL from 762 1.1 christos the SOA as the TTL of the included SOA RR. However, this minimum TTL is 763 1.1 christos larger than the original TTL of the SOA, both NSD 2.3.6, NSD 3 and BIND 9 764 1.1 christos use the smaller of those two values as the TTL of the included SOA. 765 1.1 christos 766 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 767 1.1 christos 768 1.1 christos Bug in BIND 8 solved in BIND 9. 769 1.1 christos 770 1.1 christos 771 1.1 christos \subsection{b8-badquery-ignored - BIND 8 replies normally for some bad queries} 772 1.1 christos \label{b8-badquery-ignored} 773 1.1 christos 774 1.1 christos BIND8 manages to reply for malformed queries. NSD replies with FORMERR. 775 1.1 christos 776 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 777 1.1 christos 778 1.1 christos The query is bad, formerr is needed. Fixed in BIND9. 779 1.1 christos 780 1.1 christos 781 1.1 christos \subsection{b8-badedns0 - BIND 8 ignores bad EDNS0 queries} 782 1.1 christos \label{b8-badedns0} 783 1.1 christos 784 1.1 christos BIND 8 ignores queries with bad EDNS0 section. It answers the query. 785 1.1 christos NSD replies with FORMERR. 786 1.1 christos 787 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 788 1.1 christos 789 1.1 christos BIND8 is more liberal in accepting broken EDNS0 records. NSD is not. 790 1.1 christos Changed in BIND 9. 791 1.1 christos 792 1.1 christos 793 1.1 christos \subsection{b8-auth-any - BIND 8 includes an authority section on queries for ANY .} 794 1.1 christos \label{b8-auth-any} 795 1.1 christos 796 1.1 christos BIND8 includes an authority section on queries for class ANY . 797 1.1 christos BIND9 and NSD return an empty authority section. 798 1.1 christos 799 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 800 1.1 christos 801 1.1 christos Fixed in BIND9. 802 1.1 christos 803 1.1 christos 804 1.1 christos \subsection{b8-ignore-tc-query - BIND 8 ignores the TC bit in queries} 805 1.1 christos \label{b8-ignore-tc-query} 806 1.1 christos 807 1.1 christos BIND responds to queries that have the TC bit set. NSD gives FORMERR. 808 1.1 christos 809 1.1 christos \vspace{-8pt}\subparagraph{Analysis:} 810 1.1 christos 811 1.1 christos This is like the n-tcinquery (\ref{n-tcinquery}), except where BIND9 returns NXDOMAIN, 812 1.1 christos BIND8 returns the query with qr bit set. This is fixed in BIND9. 813 1.1 christos NSD is less liberal in accepting queries, it returns form error on queries with 814 1.1 christos the TC bit set. 815 1.1 christos 816 1.1 christos \bibliographystyle{nlnetlabs} 817 1.1 christos \bibliography{allbib} 818 1.1 christos 819 1.1 christos \end{document} 820