1 #!/bin/sh 2 3 # Copyright (C) Internet Systems Consortium, Inc. ("ISC") 4 # 5 # SPDX-License-Identifier: MPL-2.0 6 # 7 # This Source Code Form is subject to the terms of the Mozilla Public 8 # License, v. 2.0. If a copy of the MPL was not distributed with this 9 # file, you can obtain one at https://mozilla.org/MPL/2.0/. 10 # 11 # See the COPYRIGHT file distributed with this work for additional 12 # information regarding copyright ownership. 13 14 set -e 15 16 . ../conf.sh 17 18 DIGOPTS="-p ${PORT} +tries=1 +time=2" 19 20 # Check whether the SOA record for the name provided in $1 can be resolved by 21 # ns1. Return 0 if resolution succeeds as expected; return 1 otherwise. 22 resolution_succeeds() { 23 _ret=0 24 $DIG $DIGOPTS +tcp +tries=3 +time=5 @10.53.0.1 ${1} SOA >dig.out.test$n || _ret=1 25 grep "status: NOERROR" dig.out.test$n >/dev/null || _ret=1 26 return $_ret 27 } 28 29 # Check whether the SOA record for the name provided in $1 can be resolved by 30 # ns1. Return 0 if resolution fails as expected; return 1 otherwise. Note that 31 # both a SERVFAIL response and timing out mean resolution failed, so the exit 32 # code of dig does not influence the result (the exit code for a SERVFAIL 33 # response is 0 while the exit code for not getting a response at all is not 0). 34 resolution_fails() { 35 _servfail=0 36 _timeout=0 37 $DIG $DIGOPTS +tcp +time=5 @10.53.0.1 ${1} TXT >dig.out.test$n || true 38 grep -F "status: SERVFAIL" dig.out.test$n >/dev/null && _servfail=1 39 grep -F "timed out" dig.out.test$n >/dev/null && _timeout=1 40 if [ $_servfail -eq 1 ] || [ $_timeout -eq 1 ]; then 41 return 0 42 else 43 return 1 44 fi 45 } 46 47 status=0 48 n=0 49 50 n=$((n + 1)) 51 echo_i "checking formerr edns server setup ($n)" 52 ret=0 53 $DIG $DIGOPTS +edns @10.53.0.8 ednsformerr soa >dig.out.1.test$n || ret=1 54 grep "status: FORMERR" dig.out.1.test$n >/dev/null || ret=1 55 grep "EDNS: version:" dig.out.1.test$n >/dev/null && ret=1 56 $DIG $DIGOPTS +noedns @10.53.0.8 ednsformerr soa >dig.out.2.test$n || ret=1 57 grep "status: NOERROR" dig.out.2.test$n >/dev/null || ret=1 58 grep "EDNS: version:" dig.out.2.test$n >/dev/null && ret=1 59 if [ $ret != 0 ]; then echo_i "failed"; fi 60 status=$((status + ret)) 61 62 n=$((n + 1)) 63 echo_i "checking recursive lookup to formerr edns server succeeds ($n)" 64 ret=0 65 resolution_succeeds ednsformerr. || ret=1 66 if [ $ret != 0 ]; then echo_i "failed"; fi 67 status=$((status + ret)) 68 69 n=$((n + 1)) 70 echo_i "checking notimp edns server setup ($n)" 71 ret=0 72 $DIG $DIGOPTS +edns @10.53.0.9 ednsnotimp soa >dig.out.1.test$n || ret=1 73 grep "status: NOTIMP" dig.out.1.test$n >/dev/null || ret=1 74 grep "EDNS: version:" dig.out.1.test$n >/dev/null && ret=1 75 $DIG $DIGOPTS +noedns @10.53.0.9 ednsnotimp soa >dig.out.2.test$n || ret=1 76 grep "status: NOERROR" dig.out.2.test$n >/dev/null || ret=1 77 grep "EDNS: version:" dig.out.2.test$n >/dev/null && ret=1 78 if [ $ret != 0 ]; then echo_i "failed"; fi 79 status=$((status + ret)) 80 81 n=$((n + 1)) 82 echo_i "checking recursive lookup to notimp edns server fails ($n)" 83 ret=0 84 resolution_fails ednsnotimp. || ret=1 85 if [ $ret != 0 ]; then echo_i "failed"; fi 86 status=$((status + ret)) 87 88 n=$((n + 1)) 89 echo_i "checking refused edns server setup ($n)" 90 ret=0 91 $DIG $DIGOPTS +edns @10.53.0.10 ednsrefused soa >dig.out.1.test$n || ret=1 92 grep "status: REFUSED" dig.out.1.test$n >/dev/null || ret=1 93 grep "EDNS: version:" dig.out.1.test$n >/dev/null && ret=1 94 $DIG $DIGOPTS +noedns @10.53.0.10 ednsrefused soa >dig.out.2.test$n || ret=1 95 grep "status: NOERROR" dig.out.2.test$n >/dev/null || ret=1 96 grep "EDNS: version:" dig.out.2.test$n >/dev/null && ret=1 97 if [ $ret != 0 ]; then echo_i "failed"; fi 98 status=$((status + ret)) 99 100 n=$((n + 1)) 101 echo_i "checking recursive lookup to refused edns server fails ($n)" 102 ret=0 103 resolution_fails ednsrefused. || ret=1 104 if [ $ret != 0 ]; then echo_i "failed"; fi 105 status=$((status + ret)) 106 107 n=$((n + 1)) 108 echo_i "checking drop edns server setup ($n)" 109 ret=0 110 $DIG $DIGOPTS +edns @10.53.0.2 dropedns soa >dig.out.1.test$n && ret=1 111 grep "timed out" dig.out.1.test$n >/dev/null || ret=1 112 grep ";; no servers could be reached" dig.out.1.test$n >/dev/null || ret=1 113 $DIG $DIGOPTS +noedns @10.53.0.2 dropedns soa >dig.out.2.test$n || ret=1 114 grep "status: NOERROR" dig.out.2.test$n >/dev/null || ret=1 115 grep "EDNS: version:" dig.out.2.test$n >/dev/null && ret=1 116 $DIG $DIGOPTS +noedns +tcp @10.53.0.2 dropedns soa >dig.out.3.test$n || ret=1 117 grep "status: NOERROR" dig.out.3.test$n >/dev/null || ret=1 118 grep "EDNS: version:" dig.out.3.test$n >/dev/null && ret=1 119 $DIG $DIGOPTS +edns +tcp @10.53.0.2 dropedns soa >dig.out.4.test$n && ret=1 120 grep "timed out" dig.out.4.test$n >/dev/null || ret=1 121 grep ";; no servers could be reached" dig.out.4.test$n >/dev/null || ret=1 122 if [ $ret != 0 ]; then echo_i "failed"; fi 123 status=$((status + ret)) 124 125 n=$((n + 1)) 126 echo_i "checking recursive lookup to drop edns server fails ($n)" 127 ret=0 128 resolution_fails dropedns. || ret=1 129 if [ $ret != 0 ]; then echo_i "failed"; fi 130 status=$((status + ret)) 131 132 n=$((n + 1)) 133 echo_i "checking drop edns + no tcp server setup ($n)" 134 ret=0 135 $DIG $DIGOPTS +edns @10.53.0.3 dropedns-notcp soa >dig.out.1.test$n && ret=1 136 grep "timed out" dig.out.1.test$n >/dev/null || ret=1 137 grep ";; no servers could be reached" dig.out.1.test$n >/dev/null || ret=1 138 $DIG $DIGOPTS +noedns +tcp @10.53.0.3 dropedns-notcp soa >dig.out.2.test$n && ret=1 139 grep "connection refused" dig.out.2.test$n >/dev/null || ret=1 140 $DIG $DIGOPTS +noedns @10.53.0.3 dropedns-notcp soa >dig.out.3.test$n || ret=1 141 grep "status: NOERROR" dig.out.3.test$n >/dev/null || ret=1 142 grep "EDNS: version:" dig.out.3.test$n >/dev/null && ret=1 143 if [ $ret != 0 ]; then echo_i "failed"; fi 144 status=$((status + ret)) 145 146 n=$((n + 1)) 147 echo_i "checking recursive lookup to drop edns + no tcp server fails ($n)" 148 ret=0 149 resolution_fails dropedns-notcp. || ret=1 150 if [ $ret != 0 ]; then echo_i "failed"; fi 151 status=$((status + ret)) 152 153 n=$((n + 1)) 154 echo_i "checking plain dns server setup ($n)" 155 ret=0 156 $DIG $DIGOPTS +edns @10.53.0.4 plain soa >dig.out.1.test$n || ret=1 157 grep "status: NOERROR" dig.out.1.test$n >/dev/null || ret=1 158 grep "EDNS: version:" dig.out.1.test$n >/dev/null && ret=1 159 $DIG $DIGOPTS +edns +tcp @10.53.0.4 plain soa >dig.out.2.test$n || ret=1 160 grep "status: NOERROR" dig.out.2.test$n >/dev/null || ret=1 161 grep "EDNS: version:" dig.out.2.test$n >/dev/null && ret=1 162 if [ $ret != 0 ]; then echo_i "failed"; fi 163 status=$((status + ret)) 164 165 n=$((n + 1)) 166 echo_i "checking recursive lookup to plain dns server succeeds ($n)" 167 ret=0 168 resolution_succeeds plain. || ret=1 169 if [ $ret != 0 ]; then echo_i "failed"; fi 170 status=$((status + ret)) 171 172 n=$((n + 1)) 173 echo_i "checking plain dns + no tcp server setup ($n)" 174 ret=0 175 $DIG $DIGOPTS +edns @10.53.0.5 plain-notcp soa >dig.out.1.test$n || ret=1 176 grep "status: NOERROR" dig.out.1.test$n >/dev/null || ret=1 177 grep "EDNS: version:" dig.out.1.test$n >/dev/null && ret=1 178 $DIG $DIGOPTS +edns +tcp @10.53.0.5 plain-notcp soa >dig.out.2.test$n && ret=1 179 grep "connection refused" dig.out.2.test$n >/dev/null || ret=1 180 if [ $ret != 0 ]; then echo_i "failed"; fi 181 status=$((status + ret)) 182 183 n=$((n + 1)) 184 echo_i "checking recursive lookup to plain dns + no tcp server succeeds ($n)" 185 ret=0 186 resolution_succeeds plain-notcp. || ret=1 187 if [ $ret != 0 ]; then echo_i "failed"; fi 188 status=$((status + ret)) 189 n=$((n + 1)) 190 191 echo_i "checking edns 512 server setup ($n)" 192 ret=0 193 $DIG $DIGOPTS +edns @10.53.0.6 edns512 txt >dig.out.1.test$n || ret=1 194 grep "status: NOERROR" dig.out.1.test$n >/dev/null || ret=1 195 grep "EDNS: version:" dig.out.1.test$n >/dev/null || ret=1 196 $DIG $DIGOPTS +edns +tcp @10.53.0.6 edns512 txt >dig.out.2.test$n || ret=1 197 grep "status: NOERROR" dig.out.2.test$n >/dev/null || ret=1 198 grep "EDNS: version:" dig.out.2.test$n >/dev/null || ret=1 199 $DIG $DIGOPTS +edns +dnssec @10.53.0.6 edns512 txt >dig.out.3.test$n && ret=1 200 grep "timed out" dig.out.3.test$n >/dev/null || ret=1 201 grep ";; no servers could be reached" dig.out.3.test$n >/dev/null || ret=1 202 $DIG $DIGOPTS +edns +dnssec +bufsize=512 +ignore @10.53.0.6 edns512 soa >dig.out.4.test$n || ret=1 203 grep "status: NOERROR" dig.out.4.test$n >/dev/null || ret=1 204 grep "EDNS: version:" dig.out.4.test$n >/dev/null || ret=1 205 grep "flags:.* tc[ ;]" dig.out.4.test$n >/dev/null || ret=1 206 if [ $ret != 0 ]; then echo_i "failed"; fi 207 status=$((status + ret)) 208 209 n=$((n + 1)) 210 echo_i "checking recursive lookup to edns 512 server succeeds ($n)" 211 ret=0 212 retry_quiet 3 resolution_succeeds edns512. || ret=1 213 if [ $ret != 0 ]; then echo_i "failed"; fi 214 status=$((status + ret)) 215 216 n=$((n + 1)) 217 echo_i "checking edns 512 + no tcp server setup ($n)" 218 ret=0 219 $DIG $DIGOPTS +edns @10.53.0.7 edns512-notcp soa >dig.out.1.test$n || ret=1 220 grep "status: NOERROR" dig.out.1.test$n >/dev/null || ret=1 221 grep "EDNS: version:" dig.out.1.test$n >/dev/null || ret=1 222 $DIG $DIGOPTS +edns +tcp @10.53.0.7 edns512-notcp soa >dig.out.2.test$n && ret=1 223 grep "connection refused" dig.out.2.test$n >/dev/null || ret=1 224 $DIG $DIGOPTS +edns +dnssec @10.53.0.7 edns512-notcp soa >dig.out.3.test$n && ret=1 225 grep "timed out" dig.out.3.test$n >/dev/null || ret=1 226 grep ";; no servers could be reached" dig.out.3.test$n >/dev/null || ret=1 227 $DIG $DIGOPTS +edns +dnssec +bufsize=512 +ignore @10.53.0.7 edns512-notcp soa >dig.out.4.test$n || ret=1 228 grep "status: NOERROR" dig.out.4.test$n >/dev/null || ret=1 229 grep "EDNS: version:" dig.out.4.test$n >/dev/null || ret=1 230 grep "flags:.* tc[ ;]" dig.out.4.test$n >/dev/null || ret=1 231 if [ $ret != 0 ]; then echo_i "failed"; fi 232 status=$((status + ret)) 233 234 n=$((n + 1)) 235 echo_i "checking recursive lookup to edns 512 + no tcp server fails ($n)" 236 ret=0 237 resolution_fails edns512-notcp. || ret=1 238 if [ $ret != 0 ]; then echo_i "failed"; fi 239 status=$((status + ret)) 240 241 n=$((n + 1)) 242 echo_i "checking recursive lookup to edns 512 + no tcp server does not cause query loops ($n)" 243 ret=0 244 sent=$(grep -c -F "sending packet to 10.53.0.7" ns1/named.run) 245 if [ $sent -ge 10 ]; then 246 echo_i "ns1 sent $sent queries to ns7, expected less than 10" 247 ret=1 248 fi 249 if [ $ret != 0 ]; then echo_i "failed"; fi 250 status=$((status + ret)) 251 252 stop_server --use-rndc --port ${CONTROLPORT} ns1 253 cp ns1/named2.conf ns1/named.conf 254 start_server --noclean --restart --port ${PORT} ns1 255 256 n=$((n + 1)) 257 echo_i "checking recursive lookup to edns 512 + no tcp + trust anchor fails ($n)" 258 # retry loop in case the server restart above causes transient failure 259 for try in 0 1 2 3 4 5 6 7 8 9; do 260 ret=0 261 resolution_fails edns512-notcp. || ret=1 262 [ "$ret" -eq 0 ] && break 263 sleep 1 264 done 265 if [ $ret != 0 ]; then echo_i "failed"; fi 266 status=$((status + ret)) 267 268 echo_i "exit status: $status" 269 [ $status -eq 0 ] || exit 1 270