diff --git a/README.md b/README.md index 92150a5..bb0c6d5 100644 --- a/README.md +++ b/README.md @@ -2,123 +2,172 @@ 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 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 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 (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 + 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 -Then run `bash ./dnstest-2.sh` diff --git a/dnstest.sh b/dnstest.sh index a617d26..ecd5921 100755 --- a/dnstest.sh +++ b/dnstest.sh @@ -1,104 +1,337 @@ #!/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; } +# 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}')) -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 + 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 + 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 + +# 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 + 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 " +# SORT PROVIDERSV6 ARRAY +IFS=$'\n' PROVIDERSV6=($(sort -t "#" -k 2,2 <<<"${PROVIDERSV6[@]}")); unset IFS -# 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 +# BUILD LIST OF DOMAINS TO TEST AGAINST +DOMAINS2TEST=" +# 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.yahoo.com + www.wikipedia.org + www.twitter.com + www.paypal.com + docker.io + github.com + gmail.com -providerstotest=$PROVIDERSV4 +# OTHER TOP/POPULAR WEBSITES TO TEST AGAINST +# www.bing.com +# www.fandom.com +# www.microsoftonline.com +# www.walmart.com +# www.duckduckgo.com +# www.weather.com +# www.indeed.com +# www.qccerttest.com +# www.quora.com +# www.ebay.com +# www.cnn.com +# www.espn.com +# www.etsy.com +# www.nytimes.com +# www.imdb.com +# www.usps.com +# www.office.com +# www.microsoft.com +# www.zillow.com +# www.live.com +# www.plex.tv -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 +# SOCIAL NETWORKING SITES +# www.instagram.com +# www.twitch.tv +# www.tiktok.com +# www.linkedin.com -elif [ "x$1" = "xipv4" ]; then - providerstotest=$PROVIDERSV4 +# 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 -elif [ "x$1" = "xall" ]; then - if [ "x$hasipv6" = "x" ]; then - providerstotest=$PROVIDERSV4 - else - providerstotest="$PROVIDERSV4 $PROVIDERSV6" - fi +# 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 + +if [ "$1" = "ipv6" ]; then + PROVIDERSTOTEST=("${PROVIDERSV6[@]}") +elif [ "$1" = "ipv4" ]; then + PROVIDERSTOTEST=("${PROVIDERSV4[@]}") +elif [ "$1" = "all" ]; then + PROVIDERSTOTEST=("${PROVIDERSV4[@]}" "${PROVIDERSV6[@]}") +else + PROVIDERSTOTEST=("${PROVIDERSV4[@]}") +fi +if [ "$1" = "host" ]; then + PROVIDERSTOTEST=("${NAMESERVERS[@]}") +elif [ "$1" = "-host" ]; then + PROVIDERSTOTEST=("${PROVIDERSTOTEST[@]}") else - providerstotest=$PROVIDERSV4 + 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 + +# 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 +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 -# 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" +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 -printf "%-21s" "" -for d in $DOMAINS2TEST; do - totaldomains=$((totaldomains + 1)) - printf "%-8s" "test$totaldomains" +# totaldomains=0 +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 }' /dev/tty 2>&1 + +# 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 \("$SrceFileNm.sorted.log"\): +echo +cat "$SrceFllPth".sorted.log +echo -exit 0; +# exit 0;