From 8bddbebab4cf1b4cb50d5c002e05f1838703a25c Mon Sep 17 00:00:00 2001 From: Micheal Espinola Date: Wed, 14 Dec 2022 16:31:53 -0800 Subject: [PATCH 1/6] major changes for compatibility and usability 1. Removed `bc` requirement and use `awk` instead, for systems that do not have `bc` for integer maths 1. Revamp how arrays are built and sanitized 1. Automatically detect and test against self-hosted DNS (checks for port 53 use and adds 127.0.0.1 to the nameserver list) 1. Auto-number resolv.conf nameservers to distinguish listings 1. Revamp internal DNS Provider and Domains 2 Test lists, compensating for bad entries and adding the ability to add comments lines 1. Modify logging to be as compact as reasonably possible. Providers column is now dynamically sized 1. Display corresponding Domains 2 Test list at end so we know which tests were to what --- dnstest.sh | 338 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 265 insertions(+), 73 deletions(-) diff --git a/dnstest.sh b/dnstest.sh index a617d26..65a2bc2 100755 --- a/dnstest.sh +++ b/dnstest.sh @@ -1,104 +1,296 @@ #!/usr/bin/env bash +# shellcheck disable=SC2034,SC2207 +# shellcheck source=/dev/null +# bash /volume1/homes/admin/scripts/bash/dnstest.sh +# CHECK FOR DIG REQUIREMENT +if ! command -v dig &> /dev/null; then + echo + echo "* DIG (Domain Information Gopher) is required for DNS queries, but" + echo " is not found in the PATH. Please install it." + echo + if [ -e "/proc/sys/kernel/syno_hw_version" ]; then + echo " DIG can be installed as a part of the 'SynoCli Network Tools'" + echo " package. This can be installed via the DSM Package Center by" + echo " adding the 'SynoCommunity' Package Source site, located at:" + echo + echo " https://packages.synocommunity.com/" + else + echo " DIG can typically be installed as a part of the 'dnsutils'" + echo " or 'bind-utils' packages. These can be installed via your" + echo " package management system." + fi + echo + echo Exiting... + echo +exit 1 +fi -command -v bc > /dev/null || { echo "error: bc was not found. Please install bc."; exit 1; } -{ command -v drill > /dev/null && dig=drill; } || { command -v dig > /dev/null && dig=dig; } || { echo "error: dig was not found. Please install dnsutils."; exit 1; } - +# BUILD LIST OF NAMESERVERS USED BY THIS HOST +NAMESERVERS=($(grep ^nameserver /etc/resolv.conf | awk 'BEGIN{i=0}{i++;}{print $2 "#" $1 "/" i}')) -NAMESERVERS=`cat /etc/resolv.conf | grep ^nameserver | cut -d " " -f 2 | sed 's/\(.*\)/&#&/'` +# CHECK IF LOCALHOST IS RUNNING DNS ON THE DEFAULT PORT +if LOCALTEST=$(netstat -tulpnW | grep "\:53\b" | grep "tcp\b" | grep "LISTEN"); then +# if [ "$?" -eq "0" ]; then + LOCALDNS=$(echo "$LOCALTEST" | awk -F '/' 'NR==1{ print $2 }') + LOCALHOST=127.0.0.1#"$LOCALDNS" + NAMESERVERS=("${LOCALHOST}" "${NAMESERVERS[@]}") +fi +# SANITIZE NAMESERVERS ARRAY +shopt -s extglob # turn on extended glob +NAMESERVERS=( "${NAMESERVERS[@]/#+([[:blank:]])/}" ) # remove leading space/tab from each element +NAMESERVERS=( "${NAMESERVERS[@]/%+([[:blank:]])/}" ) # remove trailing space/tab from each element +# BUILD LIST OF IPV4 DNS PROVIDERS PROVIDERSV4=" -1.1.1.1#cloudflare -4.2.2.1#level3 -8.8.8.8#google -9.9.9.9#quad9 -80.80.80.80#freenom -208.67.222.123#opendns -199.85.126.20#norton -185.228.168.168#cleanbrowsing -77.88.8.7#yandex -176.103.130.132#adguard -156.154.70.3#neustar -8.26.56.26#comodo -45.90.28.202#nextdns +# NOTABLE IP4 DNS PROVIDERS + 94.140.14.14#AdGuard/1 + 94.140.15.15#AdGuard/2 + 185.228.168.9#CleanBrowsing/1 + 185.228.169.9#CleanBrowsing/2 + 1.1.1.1#Cloudflare/1 + 1.0.0.1#Cloudflare/2 + 8.26.56.26#Comodo/1 + 8.20.247.20#Comodo/2 + 84.200.69.80#DNS.Watch/1 + 84.200.70.40#DNS.Watch/2 + 8.8.8.8#Google/1 + 8.8.4.4#Google/2 + 4.2.2.1#Level3/1 + 4.2.2.2#Level3/2 + 64.6.64.6#Neustar/1 + 64.6.65.6#Neustar/2 + 208.67.222.222#OpenDNS/1 + 208.67.220.220#OpenDNS/2 + 216.146.35.35#OracleDyn/1 + 216.146.36.36#OracleDyn/2 + 9.9.9.9#Quad9/1 + 149.112.112.112#Quad9/2 + +# OTHER IP4 DNS PROVIDERS + 76.76.19.19#AlternateDNS/1 + 76.223.122.150#AlternateDNS/2 + 76.76.2.0#ControlD/1 + 76.76.10.0#ControlD/2 + 103.247.36.36#DNSFilter/1 + 103.247.37.37#DNSFilter/2 + 80.80.80.80#Freenom/1 + 80.80.81.81#Freenom/2 + 45.90.28.243#NextDNS/1 + 45.90.30.243#NextDNS/2 + 199.85.126.10#NortonCS/1 + 199.85.127.10#NortonCS/2 + 195.46.39.39#SafeDNS/1 + 195.46.39.40#SafeDNS/2 + 64.6.64.6#Verisign/1 + 64.6.65.6#Verisign/2 + 77.88.8.8#Yandex/1 + 77.88.8.1#Yandex/2 " +# SORT PROVIDERSV4 ARRAY +IFS=$'\n' PROVIDERSV4=($(sort -t "#" -k 2,2 <<<"${PROVIDERSV4[@]}")); unset IFS +# BUILD LIST OF IPV6 DNS PROVIDERS PROVIDERSV6=" -2606:4700:4700::1111#cloudflare-v6 -2001:4860:4860::8888#google-v6 -2620:fe::fe#quad9-v6 -2620:119:35::35#opendns-v6 -2a0d:2a00:1::1#cleanbrowsing-v6 -2a02:6b8::feed:0ff#yandex-v6 -2a00:5a60::ad1:0ff#adguard-v6 -2610:a1:1018::3#neustar-v6 -" +# NOTABLE IP6 DNS PROVIDERS + 2a10:50c0::ad1:ff#AdGuard/1-v6 + 2a10:50c0::ad2:ff#AdGuard/2-v6 + 2a0d:2a00:1::2#CleanBrowsing/1-v6 + 2a0d:2a00:2::2#CleanBrowsing/2-v6 + 2606:4700:4700::1111#Cloudflare/1-v6 + 2606:4700:4700::1001#Cloudflare/2-v6 +2001:1608:10:25::1c04:b12f#DNS.Watch/1 +2001:1608:10:25::9249:d69b#DNS.Watch/2 + 2001:4860:4860::8888#Google/1-v6 + 2001:4860:4860::8844#Google/2-v6 + 2620:74:1b::1:1#Neustar/1 + 2620:74:1c::2:2#Neustar/2 + 2620:119:35::35#OpenDNS/1-v6 + 2620:119:53::53#OpenDNS/2-v6 + 2620:fe::fe#Quad9/1-v6 + 2620:fe::9#Quad9/2-v6 -# Testing for IPv6 -$dig +short +tries=1 +time=2 +stats @2a0d:2a00:1::1 www.google.com |grep 216.239.38.120 >/dev/null 2>&1 -if [ $? = 0 ]; then - hasipv6="true" -fi +# OTHER IP6 DNS PROVIDERS + 2602:fcbc::ad#AlternateDNS/1-v6 + 2602:fcbc:2::ad#AlternateDNS/2-v6 + 2606:1a40::#ControlD/1-v6 + 2606:1a40:1::#ControlD/2-v6 + 2a07:a8c0::11:b227#NextDNS/1-v6 + 2a07:a8c1::11:b227#NextDNS/2-v6 + 2001:67c:2778::3939#SafeDNS/1-v6 + 2001:67c:2778::3939#SafeDNS/2-v6 + 2a02:6b8::feed:0ff#Yandex/1-v6 + 2a02:6b8:0:1::feed:0ff#Yandex/2-v6 +" +# SORT PROVIDERSV6 ARRAY +IFS=$'\n' PROVIDERSV6=($(sort -t "#" -k 2,2 <<<"${PROVIDERSV6[@]}")); unset IFS -providerstotest=$PROVIDERSV4 +# BUILD LIST OF DOMAINS TO TEST AGAINST +DOMAINS2TEST=" +# TOP 9 WEBSITES 2022 + www.google.com + www.youtube.com + www.facebook.com + www.amazon.com + www.reddit.com + www.apple.com + www.pornhub.com + www.yahoo.com + www.wikipedia.org -if [ "x$1" = "xipv6" ]; then - if [ "x$hasipv6" = "x" ]; then - echo "error: IPv6 support not found. Unable to do the ipv6 test."; exit 1; - fi - providerstotest=$PROVIDERSV6 +# OTHER TOP WEBSITES 2022 +# www.twitter.com +# www.paypal.com +# www.xvideos.com +# www.instagram.com +# www.bing.com +# www.fandom.com +# www.microsoftonline.com +# www.walmart.com +# www.spankbang.com +# www.twitch.tv +# www.tiktok.com +# www.linkedin.com +# www.duckduckgo.com +# www.weather.com +# www.indeed.com +# www.qccerttest.com +# www.quora.com +# www.ebay.com +# www.xnxx.com +# www.cnn.com +# www.espn.com +# www.xhamster.com +# www.etsy.com +# www.nytimes.com +# www.imdb.com +# www.redd.it +# www.usps.com +# www.office.com +# www.microsoft.com +# www.zillow.com +# www.live.com +" +# SORT DOMAINS2TEST ARRAY +IFS=$'\n' DOMAINS2TEST=($(sort -u <<<"${DOMAINS2TEST[@]}")); unset IFS -elif [ "x$1" = "xipv4" ]; then - providerstotest=$PROVIDERSV4 +# SANITIZE DOMAINS2TEST ARRAY +shopt -s extglob # turn on extended glob +DOMAINS2TEST=( "${DOMAINS2TEST[@]/#+([[:blank:]])/}" ) # remove leading space/tab from each element +DOMAINS2TEST=( "${DOMAINS2TEST[@]/%+([[:blank:]])/}" ) # remove trailing space/tab from each element -elif [ "x$1" = "xall" ]; then - if [ "x$hasipv6" = "x" ]; then - providerstotest=$PROVIDERSV4 - else - providerstotest="$PROVIDERSV4 $PROVIDERSV6" - fi +if [ "$1" = "ipv6" ]; then + providerstotest=("${PROVIDERSV6[@]}") +elif [ "$1" = "ipv4" ]; then + providerstotest=("${PROVIDERSV4[@]}") +elif [ "$1" = "all" ]; then + providerstotest=("${PROVIDERSV4[@]}" "${PROVIDERSV6[@]}") else - providerstotest=$PROVIDERSV4 + providerstotest=("${PROVIDERSV4[@]}") fi +if [ "$1" = "host" ]; then + providerstotest=("${NAMESERVERS[@]}") +elif [ "$1" = "-host" ]; then + providerstotest=("${providerstotest[@]}") +else + providerstotest=("${NAMESERVERS[@]}" "${providerstotest[@]}") +fi +# SANITIZE NAMESERVERS ARRAY +shopt -s extglob # turn on extended glob +providerstotest=( "${providerstotest[@]/#+([[:blank:]])/}" ) # remove leading space/tab from each element +providerstotest=( "${providerstotest[@]/%+([[:blank:]])/}" ) # remove trailing space/tab from each element - - -# Domains to test. Duplicated domains are ok -DOMAINS2TEST="www.google.com amazon.com facebook.com www.youtube.com www.reddit.com wikipedia.org twitter.com gmail.com www.google.com whatsapp.com" - +# DETERMINE NAMESERVERS NAME LENGTH ($nsl) +for item in "${providerstotest[@]}"; do +if [[ -n "$item" ]] && [[ ! $item =~ ^#.* ]]; then + pname=${item##*#} + plength[${#pname}]=${item##*#} # use word length as index +fi +done +longest=("${plength[@]: -1}") # select last array element +length=$((${#longest})) +nsl="%-$((${#longest} + 1))s" +echo totaldomains=0 -printf "%-21s" "" -for d in $DOMAINS2TEST; do - totaldomains=$((totaldomains + 1)) - printf "%-8s" "test$totaldomains" +eval printf '$nsl' "Provider" +for d in "${DOMAINS2TEST[@]}"; do +if [[ -n "$d" ]] && [[ ! $d =~ ^#.* ]]; then + totaldomains=$((totaldomains + 1)) + printf "%-4s" "t$totaldomains" +fi +done +printf "%9s\n" "Median ms" +eval printf -- '-%.0s' "{1..$length}" +printf ' %.0s' "" +for d in "${DOMAINS2TEST[@]}"; do +if [[ -n "$d" ]] && [[ ! $d =~ ^#.* ]]; then + printf "%-4s" "---" +fi done -printf "%-8s" "Average" -echo "" +printf "%-4s\n" "---------" +for p in "${providerstotest[@]}"; do +if [[ -n "$p" ]] && [[ ! $p =~ ^#.* ]]; then -for p in $NAMESERVERS $providerstotest; do pip=${p%%#*} pname=${p##*#} ftime=0 + xtime=0 + + eval printf '$nsl' "$pname" + for d in "${DOMAINS2TEST[@]}"; do + if [[ -n "$d" ]] && [[ ! $d =~ ^#.* ]]; then + + ttime=$(dig +tries=1 +timeout=1 @"$pip" "$d" | grep "Query time:" | awk '{ print $4 }') + + + # NSLOOKUP INSTEAD OF DIG + # TEST=$((time (nslookup -timeout=1 -retry=0 www.microsoft.com 89.233.43.71)) 2>&1) + # echo "$TEST" | grep "connection timed out" + # echo "$TEST" | grep "real" + - printf "%-21s" "$pname" - for d in $DOMAINS2TEST; do - ttime=`$dig +tries=1 +time=2 +stats @$pip $d |grep "Query time:" | cut -d : -f 2- | cut -d " " -f 2` - if [ -z "$ttime" ]; then - #let's have time out be 1s = 1000ms - ttime=1000 - elif [ "x$ttime" = "x0" ]; then - ttime=1 - fi - - printf "%-8s" "$ttime ms" - ftime=$((ftime + ttime)) + + if [ -z "$ttime" ]; then + #let's have time out be 1s = 1000ms + ttime=1000 + elif [ "$ttime" = "0" ]; then + ttime=1 + fi + + if [ "$ttime" -ge "1000" ]; then + printf "%-4s" "*" + xtime=$(( xtime+1 )) + else + printf "%-4s" "$ttime" + fi + + ftime=$((ftime + ttime)) + + fi done - avg=`bc -l <<< "scale=2; $ftime/$totaldomains"` + avg=$(awk -v a="$ftime" -v b="$totaldomains" 'BEGIN { printf "%.2f", a/b }' Date: Fri, 28 Apr 2023 05:41:46 -0700 Subject: [PATCH 2/6] Major changes to information format/display 1. Code syntax revisions/compressions 2. Default display optimized for testing 13 domain names for median response times 3. Added more default domains to test 4. Added more default DNS providers to test 5. Automatically display output sorted by fastest median response time 6. Automatically save sorted list to file --- dnstest.sh | 122 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 79 insertions(+), 43 deletions(-) diff --git a/dnstest.sh b/dnstest.sh index 65a2bc2..d39ecdd 100755 --- a/dnstest.sh +++ b/dnstest.sh @@ -37,9 +37,9 @@ if LOCALTEST=$(netstat -tulpnW | grep "\:53\b" | grep "tcp\b" | grep "LISTEN"); NAMESERVERS=("${LOCALHOST}" "${NAMESERVERS[@]}") fi # SANITIZE NAMESERVERS ARRAY -shopt -s extglob # turn on extended glob -NAMESERVERS=( "${NAMESERVERS[@]/#+([[:blank:]])/}" ) # remove leading space/tab from each element -NAMESERVERS=( "${NAMESERVERS[@]/%+([[:blank:]])/}" ) # remove trailing space/tab from each element +shopt -s extglob # turn on extended glob +NAMESERVERS=("${NAMESERVERS[@]/#+([[:blank:]])/}") # remove leading space/tab from each element +NAMESERVERS=("${NAMESERVERS[@]/%+([[:blank:]])/}") # remove trailing space/tab from each element # BUILD LIST OF IPV4 DNS PROVIDERS PROVIDERSV4=" @@ -82,6 +82,8 @@ PROVIDERSV4=" 199.85.127.10#NortonCS/2 195.46.39.39#SafeDNS/1 195.46.39.40#SafeDNS/2 + 91.239.100.100#UncensoredDNS/1 + 89.233.43.71#UncensoredDNS/2 64.6.64.6#Verisign/1 64.6.65.6#Verisign/2 77.88.8.8#Yandex/1 @@ -119,6 +121,8 @@ PROVIDERSV6=" 2a07:a8c1::11:b227#NextDNS/2-v6 2001:67c:2778::3939#SafeDNS/1-v6 2001:67c:2778::3939#SafeDNS/2-v6 + 2001:67c:28a4::#UncensoredDNS/1 + 2a01:3a0:53:53::#UncensoredDNS/2 2a02:6b8::feed:0ff#Yandex/1-v6 2a02:6b8:0:1::feed:0ff#Yandex/2-v6 " @@ -127,81 +131,88 @@ IFS=$'\n' PROVIDERSV6=($(sort -t "#" -k 2,2 <<<"${PROVIDERSV6[@]}")); unset IFS # BUILD LIST OF DOMAINS TO TEST AGAINST DOMAINS2TEST=" -# TOP 9 WEBSITES 2022 +# 13 TESTS OR LESS SHOULD FIT WITHIN 80 CHARACTER TERMINAL DISPLAY www.google.com www.youtube.com www.facebook.com www.amazon.com www.reddit.com www.apple.com - www.pornhub.com www.yahoo.com www.wikipedia.org + www.twitter.com + www.paypal.com + docker.io + github.com + gmail.com -# OTHER TOP WEBSITES 2022 -# www.twitter.com -# www.paypal.com -# www.xvideos.com -# www.instagram.com +# OTHER TOP/POPULAR WEBSITES TO TEST AGAINST # www.bing.com # www.fandom.com # www.microsoftonline.com # www.walmart.com -# www.spankbang.com -# www.twitch.tv -# www.tiktok.com -# www.linkedin.com # www.duckduckgo.com # www.weather.com # www.indeed.com # www.qccerttest.com # www.quora.com # www.ebay.com -# www.xnxx.com # www.cnn.com # www.espn.com -# www.xhamster.com # www.etsy.com # www.nytimes.com # www.imdb.com -# www.redd.it # www.usps.com # www.office.com # www.microsoft.com # www.zillow.com # www.live.com +# www.plex.tv + +# SOCIAL NETWORKING SITES +# www.instagram.com +# www.twitch.tv +# www.tiktok.com +# www.linkedin.com + +# PORN SITES +# www.pornhub.com +# www.xvideos.com +# www.xnxx.com +# www.spankbang.com +# www.xhamster.com " # SORT DOMAINS2TEST ARRAY IFS=$'\n' DOMAINS2TEST=($(sort -u <<<"${DOMAINS2TEST[@]}")); unset IFS # SANITIZE DOMAINS2TEST ARRAY -shopt -s extglob # turn on extended glob -DOMAINS2TEST=( "${DOMAINS2TEST[@]/#+([[:blank:]])/}" ) # remove leading space/tab from each element -DOMAINS2TEST=( "${DOMAINS2TEST[@]/%+([[:blank:]])/}" ) # remove trailing space/tab from each element +shopt -s extglob # turn on extended glob +DOMAINS2TEST=("${DOMAINS2TEST[@]/#+([[:blank:]])/}") # remove leading space/tab from each element +DOMAINS2TEST=("${DOMAINS2TEST[@]/%+([[:blank:]])/}") # remove trailing space/tab from each element if [ "$1" = "ipv6" ]; then - providerstotest=("${PROVIDERSV6[@]}") + PROVIDERSTOTEST=("${PROVIDERSV6[@]}") elif [ "$1" = "ipv4" ]; then - providerstotest=("${PROVIDERSV4[@]}") + PROVIDERSTOTEST=("${PROVIDERSV4[@]}") elif [ "$1" = "all" ]; then - providerstotest=("${PROVIDERSV4[@]}" "${PROVIDERSV6[@]}") + PROVIDERSTOTEST=("${PROVIDERSV4[@]}" "${PROVIDERSV6[@]}") else - providerstotest=("${PROVIDERSV4[@]}") + PROVIDERSTOTEST=("${PROVIDERSV4[@]}") fi if [ "$1" = "host" ]; then - providerstotest=("${NAMESERVERS[@]}") + PROVIDERSTOTEST=("${NAMESERVERS[@]}") elif [ "$1" = "-host" ]; then - providerstotest=("${providerstotest[@]}") + PROVIDERSTOTEST=("${PROVIDERSTOTEST[@]}") else - providerstotest=("${NAMESERVERS[@]}" "${providerstotest[@]}") + PROVIDERSTOTEST=("${NAMESERVERS[@]}" "${PROVIDERSTOTEST[@]}") fi # SANITIZE NAMESERVERS ARRAY -shopt -s extglob # turn on extended glob -providerstotest=( "${providerstotest[@]/#+([[:blank:]])/}" ) # remove leading space/tab from each element -providerstotest=( "${providerstotest[@]/%+([[:blank:]])/}" ) # remove trailing space/tab from each element +shopt -s extglob # turn on extended glob +PROVIDERSTOTEST=("${PROVIDERSTOTEST[@]/#+([[:blank:]])/}") # remove leading space/tab from each element +PROVIDERSTOTEST=("${PROVIDERSTOTEST[@]/%+([[:blank:]])/}") # remove trailing space/tab from each element # DETERMINE NAMESERVERS NAME LENGTH ($nsl) -for item in "${providerstotest[@]}"; do +for item in "${PROVIDERSTOTEST[@]}"; do if [[ -n "$item" ]] && [[ ! $item =~ ^#.* ]]; then pname=${item##*#} plength[${#pname}]=${item##*#} # use word length as index @@ -212,7 +223,22 @@ length=$((${#longest})) nsl="%-$((${#longest} + 1))s" echo -totaldomains=0 +echo TESTING DOMAINS: +echo +echo Test Domain Name +echo ---- --------------- +for d in "${DOMAINS2TEST[@]}"; do +if [[ -n "$d" ]] && [[ ! $d =~ ^#.* ]]; then + totaldomains=$((totaldomains + 1)) + printf "%3s: %s\n" "t$totaldomains" "$d" +fi +done +unset totaldomains + +echo +echo ALPHABETICAL TESTING: +echo +# totaldomains=0 eval printf '$nsl' "Provider" for d in "${DOMAINS2TEST[@]}"; do if [[ -n "$d" ]] && [[ ! $d =~ ^#.* ]]; then @@ -230,7 +256,14 @@ fi done printf "%-4s\n" "---------" -for p in "${providerstotest[@]}"; do + + +# REDIRECT STDOUT TO TEE IN ORDER TO DUPLICATE THE OUTPUT TO THE TERMINAL AS WELL AS A .LOG FILE +exec > >(tee "$0.log") + + + +for p in "${PROVIDERSTOTEST[@]}"; do if [[ -n "$p" ]] && [[ ! $p =~ ^#.* ]]; then pip=${p%%#*} @@ -245,6 +278,7 @@ if [[ -n "$p" ]] && [[ ! $p =~ ^#.* ]]; then ttime=$(dig +tries=1 +timeout=1 @"$pip" "$d" | grep "Query time:" | awk '{ print $4 }') + # NSLOOKUP INSTEAD OF DIG # TEST=$((time (nslookup -timeout=1 -retry=0 www.microsoft.com 89.233.43.71)) 2>&1) # echo "$TEST" | grep "connection timed out" @@ -261,7 +295,7 @@ if [[ -n "$p" ]] && [[ ! $p =~ ^#.* ]]; then if [ "$ttime" -ge "1000" ]; then printf "%-4s" "*" - xtime=$(( xtime+1 )) + xtime=$((xtime+1)) else printf "%-4s" "$ttime" fi @@ -273,7 +307,7 @@ if [[ -n "$p" ]] && [[ ! $p =~ ^#.* ]]; then avg=$(awk -v a="$ftime" -v b="$totaldomains" 'BEGIN { printf "%.2f", a/b }' /dev/tty 2>&1 - totaldomains=$((totaldomains + 1)) - printf "%3s: %s\n" "t$totaldomains" "$d" -fi -done +# SORT THE OUTPUT BY FASTEST MEDIAN RESPONSE TIME +read first_line < "$0".log +num_fields=$(echo "$first_line" | awk '{print NF}') +sort -k "$((num_fields - 1))" -k "$num_fields" -n "$0".log -o "$0".sorted.log +echo +echo RESULTS SORTED BY MEDIAN RESPONSE TIME: echo +cat "$0".sorted.log +echo # exit 0; From 902299b9a408655fb961f97d99215135b761bdde Mon Sep 17 00:00:00 2001 From: Micheal Espinola Date: Fri, 28 Apr 2023 06:15:26 -0700 Subject: [PATCH 3/6] Made log read safer with '-r' --- dnstest.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dnstest.sh b/dnstest.sh index d39ecdd..7884b87 100755 --- a/dnstest.sh +++ b/dnstest.sh @@ -320,7 +320,7 @@ done exec > /dev/tty 2>&1 # SORT THE OUTPUT BY FASTEST MEDIAN RESPONSE TIME -read first_line < "$0".log +read -r first_line < "$0".log num_fields=$(echo "$first_line" | awk '{print NF}') sort -k "$((num_fields - 1))" -k "$num_fields" -n "$0".log -o "$0".sorted.log From eec023dd0ce6dd0f08fcf77dd8c5bed34dcde1cb Mon Sep 17 00:00:00 2001 From: Micheal Espinola Date: Fri, 28 Apr 2023 06:37:01 -0700 Subject: [PATCH 4/6] Revised basics of how different this version is This documentation is super basic. I need to come back to this and make proper write-ups of what has been changed and how it works. But the example output should make a lot of it obvious once you use the script or if you have experience with the original version. --- README.md | 274 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 160 insertions(+), 114 deletions(-) diff --git a/README.md b/README.md index 92150a5..d7c9b0d 100644 --- a/README.md +++ b/README.md @@ -2,123 +2,169 @@ Shell script to test the performance of the most popular DNS resolvers from your location. -Includes by default: - * CloudFlare 1.1.1.1 - * Level3 4.2.2.1 - * Google 8.8.8.8 - * Quad9 9.9.9.9 - * Freenom 80.80.80.80 - * OpenDNS - * Norton - * CleanBrowsing - * Yandex - * AdGuard - * Neustar - * Comodo - * NextDNS +Includes the redundant servers of notable DNS providers by default: + +* AdGuard +* CleanBrowsing +* Cloudflare (1.1.1.1) +* Comodo +* DNS.Watch +* Google (8.8.8.8) +* Level3 (4.2.2.1) +* Neustar +* OpenDNS (208.67.222.222) +* OracleDyn +* Quad9 (9.9.9.9) + +As well as the redundant servers of these other well-known providers: + +* AlternateDNS +* ControlD +* DNSFilter +* Freenom +* NextDNS +* NortonCS +* SafeDNS +* UncensoredDNS +* Verisign +* Yandex + +13 default domain names are tested, with many others available as toggleable in the code: + +* docker.io +* github.com +* gmail.com +* www.amazon.com +* www.apple.com +* www.facebook.com +* www.google.com +* www.paypal.com +* www.reddit.com +* www.twitter.com +* www.wikipedia.org +* www.yahoo.com +* www.youtube.com # Required -You need to install bc and dig. +You need to install `dig`. `bc` is no longer a requirement. -For Ubuntu: +# Utilization and example output: -``` - $ sudo apt-get install bc dnsutils -``` - -For macOS using homebrew: - -``` - $ brew install bc bind -``` - -# Utilization - -``` - $ git clone --depth=1 https://github.com/cleanbrowsing/dnsperftest/ - $ cd dnsperftest - $ bash ./dnstest.sh - test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 Average -cloudflare 1 ms 1 ms 1 ms 2 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.10 -google 22 ms 1 ms 4 ms 24 ms 1 ms 19 ms 3 ms 56 ms 21 ms 21 ms 17.20 -quad9 10 ms 19 ms 10 ms 10 ms 10 ms 10 ms 10 ms 10 ms 10 ms 55 ms 15.40 -opendns 39 ms 2 ms 2 ms 20 ms 2 ms 72 ms 2 ms 39 ms 39 ms 3 ms 22.00 -norton 2 ms 2 ms 2 ms 2 ms 1 ms 2 ms 2 ms 1 ms 2 ms 2 ms 1.80 -cleanbrowsing 11 ms 14 ms 11 ms 11 ms 10 ms 10 ms 11 ms 36 ms 11 ms 13 ms 13.80 -yandex 175 ms 209 ms 175 ms 181 ms 188 ms 179 ms 178 ms 179 ms 177 ms 208 ms 184.90 -adguard 200 ms 200 ms 200 ms 199 ms 202 ms 200 ms 202 ms 200 ms 199 ms 248 ms 205.00 -neustar 2 ms 2 ms 2 ms 2 ms 1 ms 2 ms 2 ms 2 ms 2 ms 2 ms 1.90 -comodo 21 ms 22 ms 22 ms 22 ms 22 ms 22 ms 22 ms 21 ms 22 ms 24 ms 22.00 -``` - -To sort with the fastest first, add `sort -k 22 -n` at the end of the command: - -``` - $ bash ./dnstest.sh |sort -k 22 -n - test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 Average -cloudflare 1 ms 1 ms 1 ms 4 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.30 -norton 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2.00 -neustar 2 ms 2 ms 2 ms 2 ms 1 ms 2 ms 2 ms 2 ms 2 ms 22 ms 3.90 -cleanbrowsing 11 ms 23 ms 11 ms 11 ms 11 ms 11 ms 11 ms 13 ms 12 ms 11 ms 12.50 -google 4 ms 4 ms 3 ms 21 ms 21 ms 61 ms 3 ms 21 ms 21 ms 22 ms 18.10 -opendns 2 ms 2 ms 2 ms 39 ms 2 ms 75 ms 2 ms 21 ms 39 ms 13 ms 19.70 -comodo 22 ms 23 ms 22 ms 22 ms 22 ms 22 ms 22 ms 22 ms 22 ms 23 ms 22.20 -quad9 10 ms 37 ms 10 ms 10 ms 10 ms 145 ms 10 ms 10 ms 10 ms 20 ms 27.20 -yandex 177 ms 216 ms 178 ms 182 ms 186 ms 177 ms 183 ms 174 ms 186 ms 222 ms 188.10 -adguard 199 ms 210 ms 200 ms 201 ms 202 ms 202 ms 199 ms 200 ms 198 ms 201 ms 201.20 -``` - -To test using the IPv6 addresses, add the IPv6 option: - -``` - $ bash ./dnstest.sh ipv6| sort -k 22 -n - test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 Average -cleanbrowsing-v6 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.00 -cloudflare-v6 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 5 ms 1 ms 1 ms 1 ms 1.40 -quad9-v6 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 21 ms 3.00 -8.8.8.8 7 ms 1 ms 16 ms 1 ms 1 ms 24 ms 1 ms 8 ms 1 ms 7 ms 6.70 -neustar-v6 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 60 ms 6.90 -opendns-v6 1 ms 1 ms 1 ms 1 ms 1 ms 62 ms 1 ms 1 ms 29 ms 1 ms 9.90 -google-v6 8 ms 8 ms 7 ms 8 ms 14 ms 67 ms 1 ms 7 ms 8 ms 61 ms 18.90 -adguard-v6 52 ms 55 ms 52 ms 53 ms 52 ms 56 ms 52 ms 55 ms 52 ms 57 ms 53.60 -yandex-v6 177 ms 178 ms 178 ms 179 ms 179 ms 178 ms 179 ms 178 ms 178 ms 223 ms 182.70 -``` - -To test both IPv6 and IPv4, add the "all" option: -``` - $ bash ./dnstest.sh all| sort -k 22 -n - test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 Average -cleanbrowsing 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.00 -cleanbrowsing-v6 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.00 -cloudflare-v6 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.00 -neustar 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.00 -nextdns 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.00 -quad9-v6 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.00 -cloudflare 1 ms 1 ms 1 ms 1 ms 1 ms 2 ms 1 ms 1 ms 1 ms 1 ms 1.10 -quad9 1 ms 1 ms 1 ms 2 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.10 -google 1 ms 1 ms 6 ms 1 ms 1 ms 6 ms 1 ms 7 ms 9 ms 7 ms 4.00 -8.8.8.8 6 ms 1 ms 25 ms 1 ms 1 ms 6 ms 1 ms 7 ms 1 ms 7 ms 5.60 -neustar-v6 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 64 ms 7.30 -opendns-v6 7 ms 1 ms 21 ms 8 ms 1 ms 1 ms 1 ms 6 ms 1 ms 29 ms 7.60 -opendns 1 ms 1 ms 27 ms 27 ms 1 ms 67 ms 1 ms 6 ms 1 ms 27 ms 15.90 -comodo 1 ms 1 ms 1 ms 1 ms 4 ms 1 ms 1 ms 1 ms 1 ms 150 ms 16.20 -google-v6 7 ms 6 ms 33 ms 7 ms 7 ms 87 ms 7 ms 8 ms 8 ms 25 ms 19.50 -level3 27 ms 26 ms 25 ms 27 ms 27 ms 25 ms 27 ms 27 ms 25 ms 28 ms 26.40 -norton 28 ms 26 ms 28 ms 26 ms 26 ms 28 ms 27 ms 27 ms 27 ms 27 ms 27.00 -adguard-v6 52 ms 54 ms 55 ms 56 ms 52 ms 52 ms 52 ms 53 ms 53 ms 54 ms 53.30 -adguard 58 ms 58 ms 58 ms 58 ms 60 ms 58 ms 60 ms 60 ms 58 ms 60 ms 58.80 -freenom 140 ms 140 ms 140 ms 145 ms 135 ms 140 ms 140 ms 140 ms 140 ms 134 ms 139.40 -yandex-v6 178 ms 179 ms 178 ms 179 ms 178 ms 178 ms 178 ms 179 ms 179 ms 205 ms 181.10 -yandex 178 ms 178 ms 177 ms 179 ms 178 ms 174 ms 180 ms 178 ms 179 ms 222 ms 182.30 - -``` - - -# For Windows users using the Linux subsystem - -If you receive an error `$'\r': command not found`, convert the file to a Linux-compatible line endings using: - - tr -d '\15\32' < dnstest.sh > dnstest-2.sh + # bash dnstest.sh + + TESTING DOMAINS: + + Test Domain Name + ---- --------------- + t1: docker.io + t2: github.com + t3: gmail.com + t4: www.amazon.com + t5: www.apple.com + t6: www.facebook.com + t7: www.google.com + t8: www.paypal.com + t9: www.reddit.com + t10: www.twitter.com + t11: www.wikipedia.org + t12: www.yahoo.com + t13: www.youtube.com + + ALPHABETICAL TESTING: + + Provider t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 Median ms + --------------- --- --- --- --- --- --- --- --- --- --- --- --- --- --------- + pihole-FTL 1 1 1 1 1 1 1 1 1 1 1 1 1 1.00 ms + nameserver/1 52 21 48 120 30 17 17 19 19 19 85 17 18 37.08 ms + nameserver/2 54 50 21 31 30 30 19 22 22 20 77 20 19 31.92 ms + AdGuard/1 55 57 56 58 57 56 56 57 57 56 56 56 57 56.46 ms + AdGuard/2 57 55 56 57 62 57 56 56 58 57 52 56 60 56.85 ms + AlternateDNS/1 87 89 75 77 77 78 76 75 78 78 78 75 76 78.38 ms + AlternateDNS/2 75 74 77 78 76 76 80 77 75 74 77 78 76 76.38 ms + CleanBrowsing/1 88 81 80 81 84 80 81 83 81 81 80 81 79 81.54 ms + CleanBrowsing/2 78 55 56 54 55 54 54 53 56 62 54 52 53 56.62 ms + Cloudflare/1 42 42 44 46 43 46 48 45 45 44 45 46 45 44.69 ms + Cloudflare/2 44 46 46 45 47 48 45 44 44 45 45 45 46 45.38 ms + Comodo/1 30 33 28 30 28 28 30 31 34 30 30 29 29 30.00 ms + Comodo/2 30 29 30 30 30 31 31 27 25 29 32 30 31 29.62 ms + ControlD/1 22 29 20 22 29 20 19 22 22 19 20 24 20 22.15 ms + ControlD/2 21 20 22 22 22 19 20 21 20 21 20 18 20 20.46 ms + DNSFilter/1 18 19 18 20 19 20 17 18 20 23 20 22 21 19.62 ms + DNSFilter/2 14 14 22 17 20 20 19 19 20 20 20 20 21 18.92 ms + DNS.Watch/1 172 165 166 173 181 165 174 * 169 199 160 173 * 999 2-to + DNS.Watch/2 * 170 185 166 161 165 166 205 170 162 293 167 199 999 1-to + Freenom/1 231 284 309 377 247 194 194 479 339 333 585 269 194 310.38 ms + Freenom/2 313 356 291 381 * 195 195 301 354 398 670 195 195 999 1-to + Google/1 18 20 25 30 20 19 20 19 20 19 19 15 19 20.23 ms + Google/2 19 22 20 30 20 19 18 18 19 19 19 21 18 20.15 ms + Level3/1 19 19 17 18 17 19 17 18 18 18 23 16 17 18.15 ms + Level3/2 19 20 18 20 18 18 19 19 19 18 19 20 18 18.85 ms + Neustar/1 47 62 25 27 26 26 26 25 27 27 26 25 24 30.23 ms + Neustar/2 16 17 18 15 16 20 15 17 19 19 22 19 20 17.92 ms + NextDNS/1 20 21 20 20 20 19 20 20 19 20 20 20 20 19.92 ms + NextDNS/2 22 24 26 33 21 21 19 21 20 21 21 20 19 22.15 ms + NortonCS/1 21 19 19 19 22 20 22 20 20 19 21 21 18 20.08 ms + NortonCS/2 25 26 24 25 26 26 24 22 23 25 27 26 26 25.00 ms + OpenDNS/1 49 23 35 29 20 51 18 17 19 19 77 19 18 30.31 ms + OpenDNS/2 23 20 18 59 47 25 46 19 19 21 84 21 20 32.46 ms + OracleDyn/1 45 26 26 30 28 26 26 29 28 25 29 25 27 28.46 ms + OracleDyn/2 27 29 29 28 26 29 31 25 27 30 26 28 28 27.92 ms + Quad9/1 46 20 24 23 18 20 19 18 20 18 21 15 19 21.62 ms + Quad9/2 19 20 18 18 20 18 19 20 18 20 19 15 21 18.85 ms + SafeDNS/1 136 134 138 136 135 135 136 133 135 137 137 135 169 138.15 ms + SafeDNS/2 137 135 135 138 135 137 134 134 137 136 136 135 135 135.69 ms + UncensoredDNS/1 * * * * * * * * * * * * * 999 13-to + UncensoredDNS/2 * * * * * * * * * * * * * 999 13-to + Verisign/1 43 26 26 28 27 26 27 26 27 29 28 27 26 28.15 ms + Verisign/2 21 20 15 18 17 13 15 19 18 18 16 19 21 17.69 ms + Yandex/1 779 186 195 184 191 203 199 196 204 194 192 206 203 240.92 ms + Yandex/2 253 214 209 191 185 211 185 197 209 197 190 195 184 201.54 ms + + RESULTS SORTED BY MEDIAN RESPONSE TIME: -Then run `bash ./dnstest-2.sh` + pihole-FTL 1 1 1 1 1 1 1 1 1 1 1 1 1 1.00 ms + Verisign/2 21 20 15 18 17 13 15 19 18 18 16 19 21 17.69 ms + Neustar/2 16 17 18 15 16 20 15 17 19 19 22 19 20 17.92 ms + Level3/1 19 19 17 18 17 19 17 18 18 18 23 16 17 18.15 ms + Level3/2 19 20 18 20 18 18 19 19 19 18 19 20 18 18.85 ms + Quad9/2 19 20 18 18 20 18 19 20 18 20 19 15 21 18.85 ms + DNSFilter/2 14 14 22 17 20 20 19 19 20 20 20 20 21 18.92 ms + DNSFilter/1 18 19 18 20 19 20 17 18 20 23 20 22 21 19.62 ms + NextDNS/1 20 21 20 20 20 19 20 20 19 20 20 20 20 19.92 ms + NortonCS/1 21 19 19 19 22 20 22 20 20 19 21 21 18 20.08 ms + Google/2 19 22 20 30 20 19 18 18 19 19 19 21 18 20.15 ms + Google/1 18 20 25 30 20 19 20 19 20 19 19 15 19 20.23 ms + ControlD/2 21 20 22 22 22 19 20 21 20 21 20 18 20 20.46 ms + Quad9/1 46 20 24 23 18 20 19 18 20 18 21 15 19 21.62 ms + ControlD/1 22 29 20 22 29 20 19 22 22 19 20 24 20 22.15 ms + NextDNS/2 22 24 26 33 21 21 19 21 20 21 21 20 19 22.15 ms + NortonCS/2 25 26 24 25 26 26 24 22 23 25 27 26 26 25.00 ms + OracleDyn/2 27 29 29 28 26 29 31 25 27 30 26 28 28 27.92 ms + Verisign/1 43 26 26 28 27 26 27 26 27 29 28 27 26 28.15 ms + OracleDyn/1 45 26 26 30 28 26 26 29 28 25 29 25 27 28.46 ms + Comodo/2 30 29 30 30 30 31 31 27 25 29 32 30 31 29.62 ms + Comodo/1 30 33 28 30 28 28 30 31 34 30 30 29 29 30.00 ms + Neustar/1 47 62 25 27 26 26 26 25 27 27 26 25 24 30.23 ms + OpenDNS/1 49 23 35 29 20 51 18 17 19 19 77 19 18 30.31 ms + nameserver/2 54 50 21 31 30 30 19 22 22 20 77 20 19 31.92 ms + OpenDNS/2 23 20 18 59 47 25 46 19 19 21 84 21 20 32.46 ms + nameserver/1 52 21 48 120 30 17 17 19 19 19 85 17 18 37.08 ms + Cloudflare/1 42 42 44 46 43 46 48 45 45 44 45 46 45 44.69 ms + Cloudflare/2 44 46 46 45 47 48 45 44 44 45 45 45 46 45.38 ms + AdGuard/1 55 57 56 58 57 56 56 57 57 56 56 56 57 56.46 ms + CleanBrowsing/2 78 55 56 54 55 54 54 53 56 62 54 52 53 56.62 ms + AdGuard/2 57 55 56 57 62 57 56 56 58 57 52 56 60 56.85 ms + AlternateDNS/2 75 74 77 78 76 76 80 77 75 74 77 78 76 76.38 ms + AlternateDNS/1 87 89 75 77 77 78 76 75 78 78 78 75 76 78.38 ms + CleanBrowsing/1 88 81 80 81 84 80 81 83 81 81 80 81 79 81.54 ms + SafeDNS/2 137 135 135 138 135 137 134 134 137 136 136 135 135 135.69 ms + SafeDNS/1 136 134 138 136 135 135 136 133 135 137 137 135 169 138.15 ms + Yandex/2 253 214 209 191 185 211 185 197 209 197 190 195 184 201.54 ms + Yandex/1 779 186 195 184 191 203 199 196 204 194 192 206 203 240.92 ms + Freenom/1 231 284 309 377 247 194 194 479 339 333 585 269 194 310.38 ms + DNS.Watch/2 * 170 185 166 161 165 166 205 170 162 293 167 199 999 1-to + Freenom/2 313 356 291 381 * 195 195 301 354 398 670 195 195 999 1-to + DNS.Watch/1 172 165 166 173 181 165 174 * 169 199 160 173 * 999 2-to + UncensoredDNS/1 * * * * * * * * * * * * * 999 13-to + UncensoredDNS/2 * * * * * * * * * * * * * 999 13-to From 977d65799c61ee20b7dcf8abe1cd25663aaf18b9 Mon Sep 17 00:00:00 2001 From: Micheal Espinola Date: Sun, 30 Apr 2023 09:11:54 -0700 Subject: [PATCH 5/6] Updated log example to reflect recent changes --- README.md | 173 +++++++++++++++++++++++++++--------------------------- 1 file changed, 88 insertions(+), 85 deletions(-) diff --git a/README.md b/README.md index d7c9b0d..bb0c6d5 100644 --- a/README.md +++ b/README.md @@ -76,95 +76,98 @@ You need to install `dig`. `bc` is no longer a requirement. Provider t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 Median ms --------------- --- --- --- --- --- --- --- --- --- --- --- --- --- --------- pihole-FTL 1 1 1 1 1 1 1 1 1 1 1 1 1 1.00 ms - nameserver/1 52 21 48 120 30 17 17 19 19 19 85 17 18 37.08 ms - nameserver/2 54 50 21 31 30 30 19 22 22 20 77 20 19 31.92 ms - AdGuard/1 55 57 56 58 57 56 56 57 57 56 56 56 57 56.46 ms - AdGuard/2 57 55 56 57 62 57 56 56 58 57 52 56 60 56.85 ms - AlternateDNS/1 87 89 75 77 77 78 76 75 78 78 78 75 76 78.38 ms - AlternateDNS/2 75 74 77 78 76 76 80 77 75 74 77 78 76 76.38 ms - CleanBrowsing/1 88 81 80 81 84 80 81 83 81 81 80 81 79 81.54 ms - CleanBrowsing/2 78 55 56 54 55 54 54 53 56 62 54 52 53 56.62 ms - Cloudflare/1 42 42 44 46 43 46 48 45 45 44 45 46 45 44.69 ms - Cloudflare/2 44 46 46 45 47 48 45 44 44 45 45 45 46 45.38 ms - Comodo/1 30 33 28 30 28 28 30 31 34 30 30 29 29 30.00 ms - Comodo/2 30 29 30 30 30 31 31 27 25 29 32 30 31 29.62 ms - ControlD/1 22 29 20 22 29 20 19 22 22 19 20 24 20 22.15 ms - ControlD/2 21 20 22 22 22 19 20 21 20 21 20 18 20 20.46 ms - DNSFilter/1 18 19 18 20 19 20 17 18 20 23 20 22 21 19.62 ms - DNSFilter/2 14 14 22 17 20 20 19 19 20 20 20 20 21 18.92 ms - DNS.Watch/1 172 165 166 173 181 165 174 * 169 199 160 173 * 999 2-to - DNS.Watch/2 * 170 185 166 161 165 166 205 170 162 293 167 199 999 1-to - Freenom/1 231 284 309 377 247 194 194 479 339 333 585 269 194 310.38 ms - Freenom/2 313 356 291 381 * 195 195 301 354 398 670 195 195 999 1-to - Google/1 18 20 25 30 20 19 20 19 20 19 19 15 19 20.23 ms - Google/2 19 22 20 30 20 19 18 18 19 19 19 21 18 20.15 ms - Level3/1 19 19 17 18 17 19 17 18 18 18 23 16 17 18.15 ms - Level3/2 19 20 18 20 18 18 19 19 19 18 19 20 18 18.85 ms - Neustar/1 47 62 25 27 26 26 26 25 27 27 26 25 24 30.23 ms - Neustar/2 16 17 18 15 16 20 15 17 19 19 22 19 20 17.92 ms - NextDNS/1 20 21 20 20 20 19 20 20 19 20 20 20 20 19.92 ms - NextDNS/2 22 24 26 33 21 21 19 21 20 21 21 20 19 22.15 ms - NortonCS/1 21 19 19 19 22 20 22 20 20 19 21 21 18 20.08 ms - NortonCS/2 25 26 24 25 26 26 24 22 23 25 27 26 26 25.00 ms - OpenDNS/1 49 23 35 29 20 51 18 17 19 19 77 19 18 30.31 ms - OpenDNS/2 23 20 18 59 47 25 46 19 19 21 84 21 20 32.46 ms - OracleDyn/1 45 26 26 30 28 26 26 29 28 25 29 25 27 28.46 ms - OracleDyn/2 27 29 29 28 26 29 31 25 27 30 26 28 28 27.92 ms - Quad9/1 46 20 24 23 18 20 19 18 20 18 21 15 19 21.62 ms - Quad9/2 19 20 18 18 20 18 19 20 18 20 19 15 21 18.85 ms - SafeDNS/1 136 134 138 136 135 135 136 133 135 137 137 135 169 138.15 ms - SafeDNS/2 137 135 135 138 135 137 134 134 137 136 136 135 135 135.69 ms + nameserver/1 49 21 64 82 79 20 19 19 20 19 74 20 19 38.85 ms + nameserver/2 50 69 52 29 30 22 21 20 21 19 49 19 22 32.54 ms + AdGuard/1 106 56 84 56 55 57 55 56 58 58 202 56 58 73.62 ms + AdGuard/2 56 55 56 57 58 58 58 56 57 57 58 58 56 56.92 ms + AlternateDNS/1 76 76 75 76 76 76 76 75 78 74 77 75 76 75.85 ms + AlternateDNS/2 76 76 80 76 76 77 72 73 77 78 78 76 76 76.23 ms + CleanBrowsing/1 97 81 79 81 80 80 82 83 79 84 81 80 83 82.31 ms + CleanBrowsing/2 57 55 56 55 55 55 53 57 55 55 56 56 55 55.38 ms + Cloudflare/1 50 47 49 45 48 48 46 48 48 50 48 50 45 47.85 ms + Cloudflare/2 49 48 49 49 46 44 49 48 48 49 45 49 46 47.62 ms + Comodo/1 30 29 31 30 32 30 32 31 30 30 149 28 31 39.46 ms + Comodo/2 30 25 30 30 30 31 31 30 30 30 30 31 33 30.08 ms + ControlD/1 24 20 35 22 32 21 21 61 21 26 182 21 21 39.00 ms + ControlD/2 21 21 19 20 22 21 19 22 20 21 20 20 19 20.38 ms + DNSFilter/1 19 17 18 19 19 20 18 17 19 20 20 20 19 18.85 ms + DNSFilter/2 21 22 21 18 19 20 20 22 21 22 21 19 20 20.46 ms + DNS.Watch/1 162 167 164 162 163 176 162 166 165 167 183 175 165 167.46 ms + DNS.Watch/2 159 160 165 166 164 182 167 162 * 162 170 161 166 999 1-to + Freenom/1 399 194 360 264 286 193 196 556 * 205 620 258 195 999 1-to + Freenom/2 412 191 311 507 288 195 195 205 301 235 614 724 194 336.31 ms + Google/1 20 20 18 29 23 19 18 19 18 17 55 17 19 22.46 ms + Google/2 17 21 26 61 23 19 18 18 20 21 18 19 21 23.23 ms + Level3/1 21 18 18 18 20 17 18 18 17 19 18 20 20 18.62 ms + Level3/2 19 17 16 18 19 18 17 21 17 20 21 16 20 18.38 ms + Neustar/1 61 27 28 24 28 25 26 27 27 28 28 27 26 29.38 ms + Neustar/2 18 20 19 38 21 20 21 18 19 19 19 19 21 20.92 ms + NextDNS/1 20 18 19 21 19 20 19 21 18 21 20 20 19 19.62 ms + NextDNS/2 54 21 19 20 14 20 21 22 20 21 21 21 20 22.62 ms + NortonCS/1 33 20 19 19 21 20 20 20 19 18 21 19 19 20.62 ms + NortonCS/2 43 29 26 24 27 24 27 26 27 25 26 27 27 27.54 ms + OpenDNS/1 21 21 34 48 29 19 20 18 20 19 79 18 20 28.15 ms + OpenDNS/2 22 22 37 60 19 30 18 19 19 19 18 19 21 24.85 ms + OracleDyn/1 39 29 27 24 25 27 25 23 29 30 25 30 28 27.77 ms + OracleDyn/2 40 31 28 27 27 27 28 32 29 26 27 28 28 29.08 ms + Quad9/1 21 20 21 19 21 20 20 19 18 19 20 19 19 19.69 ms + Quad9/2 18 22 19 24 19 20 21 21 19 21 19 20 20 20.23 ms + SafeDNS/1 137 136 146 163 135 135 146 137 134 132 135 136 176 142.15 ms + SafeDNS/2 136 135 134 136 136 135 137 136 135 135 135 135 135 135.38 ms UncensoredDNS/1 * * * * * * * * * * * * * 999 13-to UncensoredDNS/2 * * * * * * * * * * * * * 999 13-to - Verisign/1 43 26 26 28 27 26 27 26 27 29 28 27 26 28.15 ms - Verisign/2 21 20 15 18 17 13 15 19 18 18 16 19 21 17.69 ms - Yandex/1 779 186 195 184 191 203 199 196 204 194 192 206 203 240.92 ms - Yandex/2 253 214 209 191 185 211 185 197 209 197 190 195 184 201.54 ms + Verisign/1 33 28 29 27 28 27 27 27 27 27 28 27 25 27.69 ms + Verisign/2 21 18 19 19 14 18 18 19 18 20 21 20 20 18.85 ms + Yandex/1 203 210 202 197 192 201 206 204 623 199 202 198 185 232.46 ms + Yandex/2 194 187 189 190 195 207 188 214 209 186 206 202 187 196.46 ms - RESULTS SORTED BY MEDIAN RESPONSE TIME: + RESULTS SORTED BY MEDIAN RESPONSE TIME (dnstest.sh.sorted.log): + Provider t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 Median ms + --------------- --- --- --- --- --- --- --- --- --- --- --- --- --- --------- pihole-FTL 1 1 1 1 1 1 1 1 1 1 1 1 1 1.00 ms - Verisign/2 21 20 15 18 17 13 15 19 18 18 16 19 21 17.69 ms - Neustar/2 16 17 18 15 16 20 15 17 19 19 22 19 20 17.92 ms - Level3/1 19 19 17 18 17 19 17 18 18 18 23 16 17 18.15 ms - Level3/2 19 20 18 20 18 18 19 19 19 18 19 20 18 18.85 ms - Quad9/2 19 20 18 18 20 18 19 20 18 20 19 15 21 18.85 ms - DNSFilter/2 14 14 22 17 20 20 19 19 20 20 20 20 21 18.92 ms - DNSFilter/1 18 19 18 20 19 20 17 18 20 23 20 22 21 19.62 ms - NextDNS/1 20 21 20 20 20 19 20 20 19 20 20 20 20 19.92 ms - NortonCS/1 21 19 19 19 22 20 22 20 20 19 21 21 18 20.08 ms - Google/2 19 22 20 30 20 19 18 18 19 19 19 21 18 20.15 ms - Google/1 18 20 25 30 20 19 20 19 20 19 19 15 19 20.23 ms - ControlD/2 21 20 22 22 22 19 20 21 20 21 20 18 20 20.46 ms - Quad9/1 46 20 24 23 18 20 19 18 20 18 21 15 19 21.62 ms - ControlD/1 22 29 20 22 29 20 19 22 22 19 20 24 20 22.15 ms - NextDNS/2 22 24 26 33 21 21 19 21 20 21 21 20 19 22.15 ms - NortonCS/2 25 26 24 25 26 26 24 22 23 25 27 26 26 25.00 ms - OracleDyn/2 27 29 29 28 26 29 31 25 27 30 26 28 28 27.92 ms - Verisign/1 43 26 26 28 27 26 27 26 27 29 28 27 26 28.15 ms - OracleDyn/1 45 26 26 30 28 26 26 29 28 25 29 25 27 28.46 ms - Comodo/2 30 29 30 30 30 31 31 27 25 29 32 30 31 29.62 ms - Comodo/1 30 33 28 30 28 28 30 31 34 30 30 29 29 30.00 ms - Neustar/1 47 62 25 27 26 26 26 25 27 27 26 25 24 30.23 ms - OpenDNS/1 49 23 35 29 20 51 18 17 19 19 77 19 18 30.31 ms - nameserver/2 54 50 21 31 30 30 19 22 22 20 77 20 19 31.92 ms - OpenDNS/2 23 20 18 59 47 25 46 19 19 21 84 21 20 32.46 ms - nameserver/1 52 21 48 120 30 17 17 19 19 19 85 17 18 37.08 ms - Cloudflare/1 42 42 44 46 43 46 48 45 45 44 45 46 45 44.69 ms - Cloudflare/2 44 46 46 45 47 48 45 44 44 45 45 45 46 45.38 ms - AdGuard/1 55 57 56 58 57 56 56 57 57 56 56 56 57 56.46 ms - CleanBrowsing/2 78 55 56 54 55 54 54 53 56 62 54 52 53 56.62 ms - AdGuard/2 57 55 56 57 62 57 56 56 58 57 52 56 60 56.85 ms - AlternateDNS/2 75 74 77 78 76 76 80 77 75 74 77 78 76 76.38 ms - AlternateDNS/1 87 89 75 77 77 78 76 75 78 78 78 75 76 78.38 ms - CleanBrowsing/1 88 81 80 81 84 80 81 83 81 81 80 81 79 81.54 ms - SafeDNS/2 137 135 135 138 135 137 134 134 137 136 136 135 135 135.69 ms - SafeDNS/1 136 134 138 136 135 135 136 133 135 137 137 135 169 138.15 ms - Yandex/2 253 214 209 191 185 211 185 197 209 197 190 195 184 201.54 ms - Yandex/1 779 186 195 184 191 203 199 196 204 194 192 206 203 240.92 ms - Freenom/1 231 284 309 377 247 194 194 479 339 333 585 269 194 310.38 ms - DNS.Watch/2 * 170 185 166 161 165 166 205 170 162 293 167 199 999 1-to - Freenom/2 313 356 291 381 * 195 195 301 354 398 670 195 195 999 1-to - DNS.Watch/1 172 165 166 173 181 165 174 * 169 199 160 173 * 999 2-to + Level3/2 19 17 16 18 19 18 17 21 17 20 21 16 20 18.38 ms + Level3/1 21 18 18 18 20 17 18 18 17 19 18 20 20 18.62 ms + DNSFilter/1 19 17 18 19 19 20 18 17 19 20 20 20 19 18.85 ms + Verisign/2 21 18 19 19 14 18 18 19 18 20 21 20 20 18.85 ms + NextDNS/1 20 18 19 21 19 20 19 21 18 21 20 20 19 19.62 ms + Quad9/1 21 20 21 19 21 20 20 19 18 19 20 19 19 19.69 ms + Quad9/2 18 22 19 24 19 20 21 21 19 21 19 20 20 20.23 ms + ControlD/2 21 21 19 20 22 21 19 22 20 21 20 20 19 20.38 ms + DNSFilter/2 21 22 21 18 19 20 20 22 21 22 21 19 20 20.46 ms + NortonCS/1 33 20 19 19 21 20 20 20 19 18 21 19 19 20.62 ms + Neustar/2 18 20 19 38 21 20 21 18 19 19 19 19 21 20.92 ms + Google/1 20 20 18 29 23 19 18 19 18 17 55 17 19 22.46 ms + NextDNS/2 54 21 19 20 14 20 21 22 20 21 21 21 20 22.62 ms + Google/2 17 21 26 61 23 19 18 18 20 21 18 19 21 23.23 ms + OpenDNS/2 22 22 37 60 19 30 18 19 19 19 18 19 21 24.85 ms + NortonCS/2 43 29 26 24 27 24 27 26 27 25 26 27 27 27.54 ms + Verisign/1 33 28 29 27 28 27 27 27 27 27 28 27 25 27.69 ms + OracleDyn/1 39 29 27 24 25 27 25 23 29 30 25 30 28 27.77 ms + OpenDNS/1 21 21 34 48 29 19 20 18 20 19 79 18 20 28.15 ms + OracleDyn/2 40 31 28 27 27 27 28 32 29 26 27 28 28 29.08 ms + Neustar/1 61 27 28 24 28 25 26 27 27 28 28 27 26 29.38 ms + Comodo/2 30 25 30 30 30 31 31 30 30 30 30 31 33 30.08 ms + nameserver/2 50 69 52 29 30 22 21 20 21 19 49 19 22 32.54 ms + nameserver/1 49 21 64 82 79 20 19 19 20 19 74 20 19 38.85 ms + ControlD/1 24 20 35 22 32 21 21 61 21 26 182 21 21 39.00 ms + Comodo/1 30 29 31 30 32 30 32 31 30 30 149 28 31 39.46 ms + Cloudflare/2 49 48 49 49 46 44 49 48 48 49 45 49 46 47.62 ms + Cloudflare/1 50 47 49 45 48 48 46 48 48 50 48 50 45 47.85 ms + CleanBrowsing/2 57 55 56 55 55 55 53 57 55 55 56 56 55 55.38 ms + AdGuard/2 56 55 56 57 58 58 58 56 57 57 58 58 56 56.92 ms + AdGuard/1 106 56 84 56 55 57 55 56 58 58 202 56 58 73.62 ms + AlternateDNS/1 76 76 75 76 76 76 76 75 78 74 77 75 76 75.85 ms + AlternateDNS/2 76 76 80 76 76 77 72 73 77 78 78 76 76 76.23 ms + CleanBrowsing/1 97 81 79 81 80 80 82 83 79 84 81 80 83 82.31 ms + SafeDNS/2 136 135 134 136 136 135 137 136 135 135 135 135 135 135.38 ms + SafeDNS/1 137 136 146 163 135 135 146 137 134 132 135 136 176 142.15 ms + DNS.Watch/1 162 167 164 162 163 176 162 166 165 167 183 175 165 167.46 ms + Yandex/2 194 187 189 190 195 207 188 214 209 186 206 202 187 196.46 ms + Yandex/1 203 210 202 197 192 201 206 204 623 199 202 198 185 232.46 ms + Freenom/2 412 191 311 507 288 195 195 205 301 235 614 724 194 336.31 ms + DNS.Watch/2 159 160 165 166 164 182 167 162 * 162 170 161 166 999 1-to + Freenom/1 399 194 360 264 286 193 196 556 * 205 620 258 195 999 1-to UncensoredDNS/1 * * * * * * * * * * * * * 999 13-to UncensoredDNS/2 * * * * * * * * * * * * * 999 13-to + From 8233385bf1994d0b508a04390d6b3da35954deaa Mon Sep 17 00:00:00 2001 From: Micheal Espinola Date: Sun, 30 Apr 2023 09:16:01 -0700 Subject: [PATCH 6/6] Updated sorted log results 1. Added column header lines to output log 2. Refined median response time sort to compensate for column header lines 3. Refined syntax to scrape and process BASH_SOURCE[0] instead of $0 --- dnstest.sh | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/dnstest.sh b/dnstest.sh index 7884b87..ecd5921 100755 --- a/dnstest.sh +++ b/dnstest.sh @@ -26,6 +26,11 @@ if ! command -v dig &> /dev/null; then exit 1 fi +# SCRAPE SCRIPT PATH INFO +SrceFllPth=$(readlink -f "${BASH_SOURCE[0]}") +SrceFolder=$(dirname "$SrceFllPth") +SrceFileNm=${SrceFllPth##*/} + # BUILD LIST OF NAMESERVERS USED BY THIS HOST NAMESERVERS=($(grep ^nameserver /etc/resolv.conf | awk 'BEGIN{i=0}{i++;}{print $2 "#" $1 "/" i}')) @@ -238,6 +243,10 @@ unset totaldomains echo echo ALPHABETICAL TESTING: echo + +# REDIRECT STDOUT TO TEE IN ORDER TO DUPLICATE THE OUTPUT TO THE TERMINAL AS WELL AS A .LOG FILE +exec > >(tee "$SrceFllPth.log") + # totaldomains=0 eval printf '$nsl' "Provider" for d in "${DOMAINS2TEST[@]}"; do @@ -256,13 +265,6 @@ fi done printf "%-4s\n" "---------" - - -# REDIRECT STDOUT TO TEE IN ORDER TO DUPLICATE THE OUTPUT TO THE TERMINAL AS WELL AS A .LOG FILE -exec > >(tee "$0.log") - - - for p in "${PROVIDERSTOTEST[@]}"; do if [[ -n "$p" ]] && [[ ! $p =~ ^#.* ]]; then @@ -319,14 +321,17 @@ done # CLOSE AND NORMALIZE THE LOGGING REDIRECTIONS exec > /dev/tty 2>&1 -# SORT THE OUTPUT BY FASTEST MEDIAN RESPONSE TIME -read -r first_line < "$0".log -num_fields=$(echo "$first_line" | awk '{print NF}') -sort -k "$((num_fields - 1))" -k "$num_fields" -n "$0".log -o "$0".sorted.log +# SORT THE LOGGED OUTPUT BY FASTEST MEDIAN RESPONSE TIME +read -r third_line < <(head -n 3 "$SrceFllPth".log | tail -n 1) +num_fields=$(echo "$third_line" | awk '{print NF}') +sort -k "$((num_fields - 1))" -k "$num_fields" -n "$SrceFllPth".log -o "$SrceFllPth".sorted.log +(tail -n +3 "$SrceFllPth".log | sort -k "$((num_fields - 1))" -k "$num_fields" -n) \ + | cat <(head -n 2 "$SrceFllPth".log) - > "$SrceFllPth".sorted.log echo -echo RESULTS SORTED BY MEDIAN RESPONSE TIME: +echo RESULTS SORTED BY MEDIAN RESPONSE TIME \("$SrceFileNm.sorted.log"\): echo -cat "$0".sorted.log +cat "$SrceFllPth".sorted.log echo + # exit 0;