1*00b67f09SDavid van Moolenbroek# Copyright (C) 2012, 2013 Internet Systems Consortium, Inc. ("ISC") 2*00b67f09SDavid van Moolenbroek# 3*00b67f09SDavid van Moolenbroek# Permission to use, copy, modify, and/or distribute this software for any 4*00b67f09SDavid van Moolenbroek# purpose with or without fee is hereby granted, provided that the above 5*00b67f09SDavid van Moolenbroek# copyright notice and this permission notice appear in all copies. 6*00b67f09SDavid van Moolenbroek# 7*00b67f09SDavid van Moolenbroek# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 8*00b67f09SDavid van Moolenbroek# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 9*00b67f09SDavid van Moolenbroek# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 10*00b67f09SDavid van Moolenbroek# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 11*00b67f09SDavid van Moolenbroek# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 12*00b67f09SDavid van Moolenbroek# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 13*00b67f09SDavid van Moolenbroek# PERFORMANCE OF THIS SOFTWARE. 14*00b67f09SDavid van Moolenbroek 15*00b67f09SDavid van Moolenbroek 16*00b67f09SDavid van Moolenbroek# test response rate limiting 17*00b67f09SDavid van Moolenbroek 18*00b67f09SDavid van MoolenbroekSYSTEMTESTTOP=.. 19*00b67f09SDavid van Moolenbroek. $SYSTEMTESTTOP/conf.sh 20*00b67f09SDavid van Moolenbroek 21*00b67f09SDavid van Moolenbroek#set -x 22*00b67f09SDavid van Moolenbroek 23*00b67f09SDavid van Moolenbroekns1=10.53.0.1 # root, defining the others 24*00b67f09SDavid van Moolenbroekns2=10.53.0.2 # test server 25*00b67f09SDavid van Moolenbroekns3=10.53.0.3 # secondary test server 26*00b67f09SDavid van Moolenbroekns7=10.53.0.7 # whitelisted client 27*00b67f09SDavid van Moolenbroek 28*00b67f09SDavid van MoolenbroekUSAGE="$0: [-x]" 29*00b67f09SDavid van Moolenbroekwhile getopts "x" c; do 30*00b67f09SDavid van Moolenbroek case $c in 31*00b67f09SDavid van Moolenbroek x) set -x;; 32*00b67f09SDavid van Moolenbroek *) echo "$USAGE" 1>&2; exit 1;; 33*00b67f09SDavid van Moolenbroek esac 34*00b67f09SDavid van Moolenbroekdone 35*00b67f09SDavid van Moolenbroekshift `expr $OPTIND - 1 || true` 36*00b67f09SDavid van Moolenbroekif test "$#" -ne 0; then 37*00b67f09SDavid van Moolenbroek echo "$USAGE" 1>&2 38*00b67f09SDavid van Moolenbroek exit 1 39*00b67f09SDavid van Moolenbroekfi 40*00b67f09SDavid van Moolenbroek# really quit on control-C 41*00b67f09SDavid van Moolenbroektrap 'exit 1' 1 2 15 42*00b67f09SDavid van Moolenbroek 43*00b67f09SDavid van Moolenbroek 44*00b67f09SDavid van Moolenbroekret=0 45*00b67f09SDavid van Moolenbroeksetret () { 46*00b67f09SDavid van Moolenbroek ret=1 47*00b67f09SDavid van Moolenbroek echo "$*" 48*00b67f09SDavid van Moolenbroek} 49*00b67f09SDavid van Moolenbroek 50*00b67f09SDavid van Moolenbroek 51*00b67f09SDavid van Moolenbroek# Wait until soon after the start of a second to make results consistent. 52*00b67f09SDavid van Moolenbroek# The start of a second credits a rate limit. 53*00b67f09SDavid van Moolenbroek# This would be far easier in C or by assuming a modern version of perl. 54*00b67f09SDavid van Moolenbroeksec_start () { 55*00b67f09SDavid van Moolenbroek START=`date` 56*00b67f09SDavid van Moolenbroek while true; do 57*00b67f09SDavid van Moolenbroek NOW=`date` 58*00b67f09SDavid van Moolenbroek if test "$START" != "$NOW"; then 59*00b67f09SDavid van Moolenbroek return 60*00b67f09SDavid van Moolenbroek fi 61*00b67f09SDavid van Moolenbroek $PERL -e 'select(undef, undef, undef, 0.05)' || true 62*00b67f09SDavid van Moolenbroek done 63*00b67f09SDavid van Moolenbroek} 64*00b67f09SDavid van Moolenbroek 65*00b67f09SDavid van Moolenbroek 66*00b67f09SDavid van Moolenbroek# turn off ${HOME}/.digrc 67*00b67f09SDavid van MoolenbroekHOME=/dev/null; export HOME 68*00b67f09SDavid van Moolenbroek 69*00b67f09SDavid van Moolenbroek# $1=result name $2=domain name $3=dig options 70*00b67f09SDavid van Moolenbroekdigcmd () { 71*00b67f09SDavid van Moolenbroek OFILE=$1; shift 72*00b67f09SDavid van Moolenbroek DIG_DOM=$1; shift 73*00b67f09SDavid van Moolenbroek ARGS="+nosearch +time=1 +tries=1 +ignore -p 5300 $* $DIG_DOM @$ns2" 74*00b67f09SDavid van Moolenbroek #echo I:dig $ARGS 1>&2 75*00b67f09SDavid van Moolenbroek START=`date +%y%m%d%H%M.%S` 76*00b67f09SDavid van Moolenbroek RESULT=`$DIG $ARGS 2>&1 | tee $OFILE=TEMP \ 77*00b67f09SDavid van Moolenbroek | sed -n -e '/^;; AUTHORITY/,/^$/d' \ 78*00b67f09SDavid van Moolenbroek -e '/^;; ADDITIONAL/,/^$/d' \ 79*00b67f09SDavid van Moolenbroek -e 's/^[^;].* \([^ ]\{1,\}\)$/\1/p' \ 80*00b67f09SDavid van Moolenbroek -e 's/;; flags.* tc .*/TC/p' \ 81*00b67f09SDavid van Moolenbroek -e 's/;; .* status: NXDOMAIN.*/NXDOMAIN/p' \ 82*00b67f09SDavid van Moolenbroek -e 's/;; .* status: SERVFAIL.*/SERVFAIL/p' \ 83*00b67f09SDavid van Moolenbroek -e 's/;; connection timed out.*/drop/p' \ 84*00b67f09SDavid van Moolenbroek -e 's/;; communications error to.*/drop/p' \ 85*00b67f09SDavid van Moolenbroek | tr -d '\n'` 86*00b67f09SDavid van Moolenbroek mv "$OFILE=TEMP" "$OFILE=$RESULT" 87*00b67f09SDavid van Moolenbroek touch -t $START "$OFILE=$RESULT" 88*00b67f09SDavid van Moolenbroek} 89*00b67f09SDavid van Moolenbroek 90*00b67f09SDavid van Moolenbroek 91*00b67f09SDavid van Moolenbroek# $1=number of tests $2=target domain $3=dig options 92*00b67f09SDavid van MoolenbroekQNUM=1 93*00b67f09SDavid van Moolenbroekburst () { 94*00b67f09SDavid van Moolenbroek BURST_LIMIT=$1; shift 95*00b67f09SDavid van Moolenbroek BURST_DOM_BASE="$1"; shift 96*00b67f09SDavid van Moolenbroek while test "$BURST_LIMIT" -ge 1; do 97*00b67f09SDavid van Moolenbroek CNT=`expr "00$QNUM" : '.*\(...\)'` 98*00b67f09SDavid van Moolenbroek eval BURST_DOM="$BURST_DOM_BASE" 99*00b67f09SDavid van Moolenbroek FILE="dig.out-$BURST_DOM-$CNT" 100*00b67f09SDavid van Moolenbroek digcmd $FILE $BURST_DOM $* & 101*00b67f09SDavid van Moolenbroek QNUM=`expr $QNUM + 1` 102*00b67f09SDavid van Moolenbroek BURST_LIMIT=`expr "$BURST_LIMIT" - 1` 103*00b67f09SDavid van Moolenbroek done 104*00b67f09SDavid van Moolenbroek} 105*00b67f09SDavid van Moolenbroek 106*00b67f09SDavid van Moolenbroek 107*00b67f09SDavid van Moolenbroek# $1=domain $2=IP address $3=# of IP addresses $4=TC $5=drop 108*00b67f09SDavid van Moolenbroek# $6=NXDOMAIN $7=SERVFAIL or other errors 109*00b67f09SDavid van Moolenbroekck_result() { 110*00b67f09SDavid van Moolenbroek BAD= 111*00b67f09SDavid van Moolenbroek wait 112*00b67f09SDavid van Moolenbroek ADDRS=`ls dig.out-$1-*=$2 2>/dev/null | wc -l` 113*00b67f09SDavid van Moolenbroek # count simple truncated and truncated NXDOMAIN as TC 114*00b67f09SDavid van Moolenbroek TC=`ls dig.out-$1-*=TC dig.out-$1-*=NXDOMAINTC 2>/dev/null | wc -l` 115*00b67f09SDavid van Moolenbroek DROP=`ls dig.out-$1-*=drop 2>/dev/null | wc -l` 116*00b67f09SDavid van Moolenbroek # count NXDOMAIN and truncated NXDOMAIN as NXDOMAIN 117*00b67f09SDavid van Moolenbroek NXDOMAIN=`ls dig.out-$1-*=NXDOMAIN dig.out-$1-*=NXDOMAINTC 2>/dev/null \ 118*00b67f09SDavid van Moolenbroek | wc -l` 119*00b67f09SDavid van Moolenbroek SERVFAIL=`ls dig.out-$1-*=SERVFAIL 2>/dev/null | wc -l` 120*00b67f09SDavid van Moolenbroek if test $ADDRS -ne "$3"; then 121*00b67f09SDavid van Moolenbroek setret "I:"$ADDRS" instead of $3 '$2' responses for $1" 122*00b67f09SDavid van Moolenbroek BAD=yes 123*00b67f09SDavid van Moolenbroek fi 124*00b67f09SDavid van Moolenbroek if test $TC -ne "$4"; then 125*00b67f09SDavid van Moolenbroek setret "I:"$TC" instead of $4 truncation responses for $1" 126*00b67f09SDavid van Moolenbroek BAD=yes 127*00b67f09SDavid van Moolenbroek fi 128*00b67f09SDavid van Moolenbroek if test $DROP -ne "$5"; then 129*00b67f09SDavid van Moolenbroek setret "I:"$DROP" instead of $5 dropped responses for $1" 130*00b67f09SDavid van Moolenbroek BAD=yes 131*00b67f09SDavid van Moolenbroek fi 132*00b67f09SDavid van Moolenbroek if test $NXDOMAIN -ne "$6"; then 133*00b67f09SDavid van Moolenbroek setret "I:"$NXDOMAIN" instead of $6 NXDOMAIN responses for $1" 134*00b67f09SDavid van Moolenbroek BAD=yes 135*00b67f09SDavid van Moolenbroek fi 136*00b67f09SDavid van Moolenbroek if test $SERVFAIL -ne "$7"; then 137*00b67f09SDavid van Moolenbroek setret "I:"$SERVFAIL" instead of $7 error responses for $1" 138*00b67f09SDavid van Moolenbroek BAD=yes 139*00b67f09SDavid van Moolenbroek fi 140*00b67f09SDavid van Moolenbroek if test -z "$BAD"; then 141*00b67f09SDavid van Moolenbroek rm -f dig.out-$1-* 142*00b67f09SDavid van Moolenbroek fi 143*00b67f09SDavid van Moolenbroek} 144*00b67f09SDavid van Moolenbroek 145*00b67f09SDavid van Moolenbroek 146*00b67f09SDavid van Moolenbroekckstats () { 147*00b67f09SDavid van Moolenbroek LABEL="$1"; shift 148*00b67f09SDavid van Moolenbroek TYPE="$1"; shift 149*00b67f09SDavid van Moolenbroek EXPECTED="$1"; shift 150*00b67f09SDavid van Moolenbroek C=`sed -n -e "s/[ ]*\([0-9]*\).responses $TYPE for rate limits.*/\1/p" \ 151*00b67f09SDavid van Moolenbroek ns2/named.stats | tail -1` 152*00b67f09SDavid van Moolenbroek C=`expr 0$C + 0` 153*00b67f09SDavid van Moolenbroek if test "$C" -ne $EXPECTED; then 154*00b67f09SDavid van Moolenbroek setret "I:wrong $LABEL $TYPE statistics of $C instead of $EXPECTED" 155*00b67f09SDavid van Moolenbroek fi 156*00b67f09SDavid van Moolenbroek} 157*00b67f09SDavid van Moolenbroek 158*00b67f09SDavid van Moolenbroek 159*00b67f09SDavid van Moolenbroek######### 160*00b67f09SDavid van Moolenbroeksec_start 161*00b67f09SDavid van Moolenbroek 162*00b67f09SDavid van Moolenbroek# Tests of referrals to "." must be done before the hints are loaded 163*00b67f09SDavid van Moolenbroek# or with "additional-from-cache no" 164*00b67f09SDavid van Moolenbroekburst 5 a1.tld3 +norec 165*00b67f09SDavid van Moolenbroek# basic rate limiting 166*00b67f09SDavid van Moolenbroekburst 3 a1.tld2 167*00b67f09SDavid van Moolenbroek# 1 second delay allows an additional response. 168*00b67f09SDavid van Moolenbroeksleep 1 169*00b67f09SDavid van Moolenbroekburst 10 a1.tld2 170*00b67f09SDavid van Moolenbroek# Request 30 different qnames to try a wildcard. 171*00b67f09SDavid van Moolenbroekburst 30 'x$CNT.a2.tld2' 172*00b67f09SDavid van Moolenbroek# These should be counted and limited but are not. See RT33138. 173*00b67f09SDavid van Moolenbroekburst 10 'y.x$CNT.a2.tld2' 174*00b67f09SDavid van Moolenbroek 175*00b67f09SDavid van Moolenbroek# IP TC drop NXDOMAIN SERVFAIL 176*00b67f09SDavid van Moolenbroek# referrals to "." 177*00b67f09SDavid van Moolenbroekck_result a1.tld3 '' 2 1 2 0 0 178*00b67f09SDavid van Moolenbroek# check 13 results including 1 second delay that allows an additional response 179*00b67f09SDavid van Moolenbroekck_result a1.tld2 192.0.2.1 3 4 6 0 0 180*00b67f09SDavid van Moolenbroek 181*00b67f09SDavid van Moolenbroek# Check the wild card answers. 182*00b67f09SDavid van Moolenbroek# The parent name of the 30 requests is counted. 183*00b67f09SDavid van Moolenbroekck_result 'x*.a2.tld2' 192.0.2.2 2 10 18 0 0 184*00b67f09SDavid van Moolenbroek 185*00b67f09SDavid van Moolenbroek# These should be limited but are not. See RT33138. 186*00b67f09SDavid van Moolenbroekck_result 'y.x*.a2.tld2' 192.0.2.2 10 0 0 0 0 187*00b67f09SDavid van Moolenbroek 188*00b67f09SDavid van Moolenbroek######### 189*00b67f09SDavid van Moolenbroeksec_start 190*00b67f09SDavid van Moolenbroek 191*00b67f09SDavid van Moolenbroekburst 10 'x.a3.tld3' 192*00b67f09SDavid van Moolenbroekburst 10 'y$CNT.a3.tld3' 193*00b67f09SDavid van Moolenbroekburst 10 'z$CNT.a4.tld2' 194*00b67f09SDavid van Moolenbroek 195*00b67f09SDavid van Moolenbroek# 10 identical recursive responses are limited 196*00b67f09SDavid van Moolenbroekck_result 'x.a3.tld3' 192.0.3.3 2 3 5 0 0 197*00b67f09SDavid van Moolenbroek 198*00b67f09SDavid van Moolenbroek# 10 different recursive responses are not limited 199*00b67f09SDavid van Moolenbroekck_result 'y*.a3.tld3' 192.0.3.3 10 0 0 0 0 200*00b67f09SDavid van Moolenbroek 201*00b67f09SDavid van Moolenbroek# 10 different NXDOMAIN responses are limited based on the parent name. 202*00b67f09SDavid van Moolenbroek# We count 13 responses because we count truncated NXDOMAIN responses 203*00b67f09SDavid van Moolenbroek# as both truncated and NXDOMAIN. 204*00b67f09SDavid van Moolenbroekck_result 'z*.a4.tld2' x 0 3 5 5 0 205*00b67f09SDavid van Moolenbroek 206*00b67f09SDavid van Moolenbroek$RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p 9953 -s $ns2 stats 207*00b67f09SDavid van Moolenbroekckstats first dropped 36 208*00b67f09SDavid van Moolenbroekckstats first truncated 21 209*00b67f09SDavid van Moolenbroek 210*00b67f09SDavid van Moolenbroek 211*00b67f09SDavid van Moolenbroek######### 212*00b67f09SDavid van Moolenbroeksec_start 213*00b67f09SDavid van Moolenbroek 214*00b67f09SDavid van Moolenbroekburst 10 a5.tld2 +tcp 215*00b67f09SDavid van Moolenbroekburst 10 a6.tld2 -b $ns7 216*00b67f09SDavid van Moolenbroekburst 10 a7.tld4 217*00b67f09SDavid van Moolenbroekburst 2 a8.tld2 AAAA 218*00b67f09SDavid van Moolenbroekburst 2 a8.tld2 TXT 219*00b67f09SDavid van Moolenbroekburst 2 a8.tld2 SPF 220*00b67f09SDavid van Moolenbroek 221*00b67f09SDavid van Moolenbroek# IP TC drop NXDOMAIN SERVFAIL 222*00b67f09SDavid van Moolenbroek# TCP responses are not rate limited 223*00b67f09SDavid van Moolenbroekck_result a5.tld2 192.0.2.5 10 0 0 0 0 224*00b67f09SDavid van Moolenbroek 225*00b67f09SDavid van Moolenbroek# whitelisted client is not rate limited 226*00b67f09SDavid van Moolenbroekck_result a6.tld2 192.0.2.6 10 0 0 0 0 227*00b67f09SDavid van Moolenbroek 228*00b67f09SDavid van Moolenbroek# Errors such as SERVFAIL are rate limited. 229*00b67f09SDavid van Moolenbroekck_result a7.tld4 x 0 0 8 0 2 230*00b67f09SDavid van Moolenbroek 231*00b67f09SDavid van Moolenbroek# NODATA responses are counted as the same regardless of qtype. 232*00b67f09SDavid van Moolenbroekck_result a8.tld2 '' 2 2 2 0 0 233*00b67f09SDavid van Moolenbroek 234*00b67f09SDavid van Moolenbroek$RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p 9953 -s $ns2 stats 235*00b67f09SDavid van Moolenbroekckstats second dropped 46 236*00b67f09SDavid van Moolenbroekckstats second truncated 23 237*00b67f09SDavid van Moolenbroek 238*00b67f09SDavid van Moolenbroek 239*00b67f09SDavid van Moolenbroek######### 240*00b67f09SDavid van Moolenbroeksec_start 241*00b67f09SDavid van Moolenbroek 242*00b67f09SDavid van Moolenbroek# IP TC drop NXDOMAIN SERVFAIL 243*00b67f09SDavid van Moolenbroek# all-per-second 244*00b67f09SDavid van Moolenbroek# The qnames are all unique but the client IP address is constant. 245*00b67f09SDavid van MoolenbroekQNUM=101 246*00b67f09SDavid van Moolenbroekburst 60 'all$CNT.a9.tld2' 247*00b67f09SDavid van Moolenbroek 248*00b67f09SDavid van Moolenbroekck_result 'a*.a9.tld2' 192.0.2.8 50 0 10 0 0 249*00b67f09SDavid van Moolenbroek 250*00b67f09SDavid van Moolenbroek$RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p 9953 -s $ns2 stats 251*00b67f09SDavid van Moolenbroekckstats final dropped 56 252*00b67f09SDavid van Moolenbroekckstats final truncated 23 253*00b67f09SDavid van Moolenbroek 254*00b67f09SDavid van Moolenbroek 255*00b67f09SDavid van Moolenbroekecho "I:exit status: $ret" 256*00b67f09SDavid van Moolenbroek# exit $ret 257*00b67f09SDavid van Moolenbroek[ $ret -ne 0 ] && echo "I:test failure overridden" 258*00b67f09SDavid van Moolenbroekexit 0 259