diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 8d9e4c9..0000000 --- a/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM alpine:latest -RUN apk --no-cache add bash bc drill \ - && mkdir /app \ - && wget https://raw.githubusercontent.com/cleanbrowsing/dnsperftest/master/dnstest.sh -O /app/dnstest.sh \ - && chmod +x /app/dnstest.sh - -ENTRYPOINT ["/app/dnstest.sh"] diff --git a/LICENSE.txt b/LICENSE similarity index 98% rename from LICENSE.txt rename to LICENSE index d1338b2..f288702 100644 --- a/LICENSE.txt +++ b/LICENSE @@ -1,18 +1,4 @@ -Copyright (C) 2018 - 2022 CleanBrowsing Inc. All rights reserved. - - dnsperftest is a free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License (version 3) as - published by the FSF - Free Software Foundation. - - dsperftest is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License Version 3 below for more details. - ------------------------------------------------------------------------------ - - - GNU GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. diff --git a/README.md b/README.md index 92150a5..5b3f105 100644 --- a/README.md +++ b/README.md @@ -1,124 +1,273 @@ +*Note: This script is a majorly overhauled fork. IPv6 processing is currently incomplete.* + # DNS Performance Test 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 +The accompanying ipv4 and ipv6 text files contain the redundant servers of notable DNS providers by default, including: -# Required +* AdGuard +* CleanBrowsing +* Cloudflare (aka 1.1.1.1) +* Comodo +* DNS.Watch +* Google (aka 8.8.8.8) +* Level3 (aka 4.2.2.1) +* Neustar +* OpenDNS (aka 208.67.222.222) +* OracleDyn +* Quad9 (aka 9.9.9.9) -You need to install bc and dig. +...as well as the redundant servers of these other well-known providers (and many more): -For Ubuntu: +* AlternateDNS +* ControlD +* DNSFilter +* Freenom +* NextDNS +* NortonCS +* SafeDNS +* UncensoredDNS +* Verisign +* Yandex -``` - $ sudo apt-get install bc dnsutils -``` +13 default domain names are tested, with many others available as toggleable in the accompanying text files, or simply add your own: -For macOS using homebrew: +* 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 -``` - $ brew install bc bind -``` +# Requirements -# 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 -``` +* `dig` needs to be in the PATH. If you don't have it, the script will provide instructions for where to get it. +* `bc` is no longer a requirement of this script since being forked. `awk` is used instead for greater wide-spread availability - particularly for Synology. (this need was what initially prompted the creation of this fork) -To sort with the fastest first, add `sort -k 22 -n` at the end of the command: +# Utilization and example output: ``` - $ 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 -``` +# bash /volume1/homes/admin/scripts/bash/dnstest.sh -To test using the IPv6 addresses, add the IPv6 option: +CHECKING FOR LOCAL DNS SERVER AND FLUSHING CACHE -``` - $ 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 -``` + Local DNS: tcp/53 pihole-FTL (pid:31666) + Type: docker (pihole) + Action: Reloading Pi-hole DNS (pihole-FTL) -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 -``` +TESTING DOMAINS (dnstest.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 -# 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: +LOCAL THEN ALPHABETICAL BY SERVER (dnstest.log) - tr -d '\15\32' < dnstest.sh > dnstest-2.sh - -Then run `bash ./dnstest-2.sh` +Server t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 Median ms +---------------- --- --- --- --- --- --- --- --- --- --- --- --- --- --------- +pihole-FTL/I 18 14 20 15 18 45 21 17 17 14 15 15 17 18.92 ms +pihole-FTL/C 1 1 1 1 1 1 2 2 2 2 1 2 8 1.92 ms +nameserver/1 13 7 13 13 11 43 18 18 19 14 19 16 16 16.92 ms +nameserver/2 13 18 16 13 12 43 15 13 13 8 19 14 14 16.23 ms +114DNS/1 18 19 12 15 18 20 22 22 22 19 21 20 19 19.00 ms +114DNS/2 18 17 18 17 23 25 18 18 19 22 18 18 18 19.15 ms +AdGuard/1 149 18 22 14 19 19 20 15 13 13 20 19 23 28.00 ms +AdGuard/2 21 17 19 22 18 14 20 19 18 16 21 23 17 18.85 ms +AliDNS/1 257 240 243 315 245 231 197 309 229 233 247 267 189 246.31 ms +AliDNS/2 192 193 198 197 191 192 187 365 197 196 195 190 191 206.46 ms +AlternateDNS/1 * * * * * * * * * * * * * NR 13-to +AlternateDNS/2 * * * * * * * * * * * * * NR 13-to +CenturyLink/1 107 938 367 426 331 57 247 222 687 * * 954 404 518.46 ms +CenturyLink/2 28 31 27 30 32 30 30 27 29 33 29 30 30 29.69 ms +ChinaTCL-UNC/1 * * * * * * * * * * * * * NR 13-to +ChinaTCL-UNC/2 * * * * * * * * * * * * * NR 13-to +CleanBrowsing/1 66 63 62 63 59 62 60 68 64 110 67 69 58 67.00 ms +CleanBrowsing/2 63 66 65 69 61 63 65 60 64 61 68 64 63 64.00 ms +Cloudflare/1 15 15 13 18 14 39 18 17 19 20 13 15 17 17.92 ms +Cloudflare/2 13 15 18 12 14 19 15 14 17 13 18 18 14 15.38 ms +CNNICSDNS/1 * 217 318 * 235 * 324 * * 227 * 316 311 611.38 ms +CNNICSDNS/2 * 224 222 * * * 323 * * 223 * 233 228 650.23 ms +Comodo/1 66 69 58 68 61 61 62 71 66 66 62 70 61 64.69 ms +Comodo/2 72 61 63 64 66 64 70 64 60 125 63 62 63 69.00 ms +ControlD/1 28 19 31 20 25 24 21 23 25 28 20 19 19 23.23 ms +ControlD/2 21 23 21 22 23 27 24 24 21 24 19 15 18 21.69 ms +DNSFilter/1 22 18 18 18 18 20 22 17 25 25 18 22 18 20.08 ms +DNSFilter/2 18 17 20 22 18 23 18 17 19 21 19 19 11 18.62 ms +DNSpai/1 180 212 435 991 168 181 165 580 195 185 202 188 171 296.38 ms +DNSpai/2 185 181 186 855 180 202 183 180 237 236 679 189 223 285.85 ms +DNSPodDNS+/1 436 386 399 210 387 389 205 446 450 385 449 382 478 384.77 ms +DNSPodDNS+/2 196 260 202 198 264 201 263 371 212 193 265 253 194 236.31 ms +DNS.WATCH/1 * * 178 178 * 175 * * 180 * 313 * * 694.15 ms +DNS.WATCH/2 * * * * 168 * * * 216 220 * 163 190 689.00 ms +Freenom/1 94 40 27 30 27 27 27 137 187 75 209 * 28 146.77 ms +Freenom/2 33 21 29 20 28 31 31 30 31 26 29 30 27 28.15 ms +Google/1 36 22 29 45 29 24 20 24 27 32 65 20 17 30.00 ms +Google/2 24 26 26 37 19 20 19 23 20 18 62 21 19 25.69 ms +Level3/1 21 22 16 19 21 18 21 18 17 23 18 17 19 19.23 ms +Level3/2 18 21 21 19 22 19 23 18 19 22 18 17 23 20.00 ms +Neustar/1 33 25 35 27 36 30 32 30 32 33 37 32 26 31.38 ms +Neustar/2 27 23 18 19 19 17 12 23 25 18 22 15 17 19.62 ms +NextDNS/1 122 22 20 24 26 19 14 23 19 29 19 25 19 29.31 ms +NextDNS/2 52 21 20 20 22 20 21 18 18 22 22 18 21 22.69 ms +NortonCS/1 26 15 19 21 19 17 20 28 19 17 17 18 17 19.46 ms +NortonCS/2 34 36 39 30 33 36 35 33 35 35 30 32 31 33.77 ms +OneDNS/1 * * * * * * * * * * * * * NR 13-to +OneDNS/2 206 188 205 182 192 * 191 188 184 193 180 187 183 252.23 ms +OpenDNS/1 20 20 52 23 26 45 25 19 24 24 54 22 50 31.08 ms +OpenDNS/2 18 18 46 35 33 42 17 18 18 23 20 18 61 28.23 ms +OracleDyn/1 32 38 29 27 34 34 33 32 28 34 36 28 31 32.00 ms +OracleDyn/2 31 34 29 29 28 27 33 32 29 34 49 29 28 31.69 ms +Quad9/1 20 21 18 15 24 23 22 19 20 28 22 21 20 21.00 ms +Quad9/2 23 19 18 18 19 22 19 19 19 19 19 26 25 20.38 ms +SafeDNS/1 29 18 31 23 24 19 16 21 15 19 19 19 19 20.92 ms +SafeDNS/2 20 20 18 19 20 16 19 24 17 19 21 19 15 19.00 ms +SKTelecom/1 204 198 156 179 164 161 159 256 186 192 181 162 171 182.23 ms +SKTelecom/2 168 158 167 180 182 197 166 182 163 180 173 178 156 173.08 ms +Verisign/1 26 31 31 31 28 36 31 27 36 53 32 31 32 32.69 ms +Verisign/2 21 23 20 17 25 21 25 17 18 19 17 18 21 20.15 ms +Yandex/1 215 208 214 216 211 216 211 218 212 211 218 203 210 212.54 ms +Yandex/2 217 212 208 208 209 225 205 217 218 228 215 204 210 213.54 ms + + +ALL SERVERS BY MEDIAN RESPONSE TIME (dnstest.sorted.log) + +Server t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 Median ms +---------------- --- --- --- --- --- --- --- --- --- --- --- --- --- --------- +pihole-FTL/C 1 1 1 1 1 1 2 2 2 2 1 2 8 1.92 ms +Cloudflare/2 13 15 18 12 14 19 15 14 17 13 18 18 14 15.38 ms +nameserver/2 13 18 16 13 12 43 15 13 13 8 19 14 14 16.23 ms +nameserver/1 13 7 13 13 11 43 18 18 19 14 19 16 16 16.92 ms +Cloudflare/1 15 15 13 18 14 39 18 17 19 20 13 15 17 17.92 ms +DNSFilter/2 18 17 20 22 18 23 18 17 19 21 19 19 11 18.62 ms +AdGuard/2 21 17 19 22 18 14 20 19 18 16 21 23 17 18.85 ms +pihole-FTL/I 18 14 20 15 18 45 21 17 17 14 15 15 17 18.92 ms +114DNS/1 18 19 12 15 18 20 22 22 22 19 21 20 19 19.00 ms +SafeDNS/2 20 20 18 19 20 16 19 24 17 19 21 19 15 19.00 ms +114DNS/2 18 17 18 17 23 25 18 18 19 22 18 18 18 19.15 ms +Level3/1 21 22 16 19 21 18 21 18 17 23 18 17 19 19.23 ms +NortonCS/1 26 15 19 21 19 17 20 28 19 17 17 18 17 19.46 ms +Neustar/2 27 23 18 19 19 17 12 23 25 18 22 15 17 19.62 ms +Level3/2 18 21 21 19 22 19 23 18 19 22 18 17 23 20.00 ms +DNSFilter/1 22 18 18 18 18 20 22 17 25 25 18 22 18 20.08 ms +Verisign/2 21 23 20 17 25 21 25 17 18 19 17 18 21 20.15 ms +Quad9/2 23 19 18 18 19 22 19 19 19 19 19 26 25 20.38 ms +SafeDNS/1 29 18 31 23 24 19 16 21 15 19 19 19 19 20.92 ms +Quad9/1 20 21 18 15 24 23 22 19 20 28 22 21 20 21.00 ms +ControlD/2 21 23 21 22 23 27 24 24 21 24 19 15 18 21.69 ms +NextDNS/2 52 21 20 20 22 20 21 18 18 22 22 18 21 22.69 ms +ControlD/1 28 19 31 20 25 24 21 23 25 28 20 19 19 23.23 ms +Google/2 24 26 26 37 19 20 19 23 20 18 62 21 19 25.69 ms +AdGuard/1 149 18 22 14 19 19 20 15 13 13 20 19 23 28.00 ms +Freenom/2 33 21 29 20 28 31 31 30 31 26 29 30 27 28.15 ms +OpenDNS/2 18 18 46 35 33 42 17 18 18 23 20 18 61 28.23 ms +NextDNS/1 122 22 20 24 26 19 14 23 19 29 19 25 19 29.31 ms +CenturyLink/2 28 31 27 30 32 30 30 27 29 33 29 30 30 29.69 ms +Google/1 36 22 29 45 29 24 20 24 27 32 65 20 17 30.00 ms +OpenDNS/1 20 20 52 23 26 45 25 19 24 24 54 22 50 31.08 ms +Neustar/1 33 25 35 27 36 30 32 30 32 33 37 32 26 31.38 ms +OracleDyn/2 31 34 29 29 28 27 33 32 29 34 49 29 28 31.69 ms +OracleDyn/1 32 38 29 27 34 34 33 32 28 34 36 28 31 32.00 ms +Verisign/1 26 31 31 31 28 36 31 27 36 53 32 31 32 32.69 ms +NortonCS/2 34 36 39 30 33 36 35 33 35 35 30 32 31 33.77 ms +CleanBrowsing/2 63 66 65 69 61 63 65 60 64 61 68 64 63 64.00 ms +Comodo/1 66 69 58 68 61 61 62 71 66 66 62 70 61 64.69 ms +CleanBrowsing/1 66 63 62 63 59 62 60 68 64 110 67 69 58 67.00 ms +Comodo/2 72 61 63 64 66 64 70 64 60 125 63 62 63 69.00 ms +Freenom/1 94 40 27 30 27 27 27 137 187 75 209 * 28 146.77 ms +SKTelecom/2 168 158 167 180 182 197 166 182 163 180 173 178 156 173.08 ms +SKTelecom/1 204 198 156 179 164 161 159 256 186 192 181 162 171 182.23 ms +AliDNS/2 192 193 198 197 191 192 187 365 197 196 195 190 191 206.46 ms +Yandex/1 215 208 214 216 211 216 211 218 212 211 218 203 210 212.54 ms +Yandex/2 217 212 208 208 209 225 205 217 218 228 215 204 210 213.54 ms +DNSPodDNS+/2 196 260 202 198 264 201 263 371 212 193 265 253 194 236.31 ms +AliDNS/1 257 240 243 315 245 231 197 309 229 233 247 267 189 246.31 ms +OneDNS/2 206 188 205 182 192 * 191 188 184 193 180 187 183 252.23 ms +DNSpai/2 185 181 186 855 180 202 183 180 237 236 679 189 223 285.85 ms +DNSpai/1 180 212 435 991 168 181 165 580 195 185 202 188 171 296.38 ms +DNSPodDNS+/1 436 386 399 210 387 389 205 446 450 385 449 382 478 384.77 ms +CenturyLink/1 107 938 367 426 331 57 247 222 687 * * 954 404 518.46 ms +CNNICSDNS/1 * 217 318 * 235 * 324 * * 227 * 316 311 611.38 ms +CNNICSDNS/2 * 224 222 * * * 323 * * 223 * 233 228 650.23 ms +DNS.WATCH/2 * * * * 168 * * * 216 220 * 163 190 689.00 ms +DNS.WATCH/1 * * 178 178 * 175 * * 180 * 313 * * 694.15 ms +AlternateDNS/1 * * * * * * * * * * * * * NR 13-to +AlternateDNS/2 * * * * * * * * * * * * * NR 13-to +ChinaTCL-UNC/1 * * * * * * * * * * * * * NR 13-to +ChinaTCL-UNC/2 * * * * * * * * * * * * * NR 13-to +OneDNS/1 * * * * * * * * * * * * * NR 13-to + + +RESULTS WITH QUERY TIMEOUTS + +Server t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 Median ms +---------------- --- --- --- --- --- --- --- --- --- --- --- --- --- --------- +Freenom/1 94 40 27 30 27 27 27 137 187 75 209 * 28 146.77 ms +OneDNS/2 206 188 205 182 192 * 191 188 184 193 180 187 183 252.23 ms +CenturyLink/1 107 938 367 426 331 57 247 222 687 * * 954 404 518.46 ms +CNNICSDNS/1 * 217 318 * 235 * 324 * * 227 * 316 311 611.38 ms +CNNICSDNS/2 * 224 222 * * * 323 * * 223 * 233 228 650.23 ms +DNS.WATCH/2 * * * * 168 * * * 216 220 * 163 190 689.00 ms +DNS.WATCH/1 * * 178 178 * 175 * * 180 * 313 * * 694.15 ms +AlternateDNS/1 * * * * * * * * * * * * * NR 13-to +AlternateDNS/2 * * * * * * * * * * * * * NR 13-to +ChinaTCL-UNC/1 * * * * * * * * * * * * * NR 13-to +ChinaTCL-UNC/2 * * * * * * * * * * * * * NR 13-to +OneDNS/1 * * * * * * * * * * * * * NR 13-to + + +RESPONDING PROVIDERS BY AVERAGED MEDIAN RESPONSE TIMES + +Provider Average Servers +---------------- --------- ------- +pihole-FTL 10.42 ms (2) 127.0.0.1, 127.0.0.1 +nameserver 16.57 ms (2) 1.1.1.1, 1.0.0.1 +Cloudflare 16.65 ms (2) 1.1.1.1, 1.0.0.1 +114DNS 19.07 ms (2) 114.114.114.114, 114.114.115.115 +DNSFilter 19.35 ms (2) 103.247.36.36, 103.247.37.37 +Level3 19.61 ms (2) 4.2.2.1, 4.2.2.2 +SafeDNS 19.96 ms (2) 195.46.39.39, 195.46.39.40 +Quad9 20.69 ms (2) 9.9.9.9, 149.112.112.112 +ControlD 22.46 ms (2) 76.76.2.0, 76.76.10.0 +AdGuard 23.43 ms (2) 94.140.14.14, 94.140.15.15 +Neustar 25.50 ms (2) 64.6.64.6, 64.6.65.6 +NextDNS 26.00 ms (2) 45.90.28.243, 45.90.30.243 +Verisign 26.42 ms (2) 64.6.64.6, 64.6.65.6 +NortonCS 26.61 ms (2) 199.85.126.10, 199.85.127.10 +Google 27.84 ms (2) 8.8.8.8, 8.8.4.4 +OpenDNS 29.66 ms (2) 208.67.222.222, 208.67.220.220 +OracleDyn 31.84 ms (2) 216.146.35.35, 216.146.36.36 +CleanBrowsing 65.50 ms (2) 185.228.168.9, 185.228.169.9 +Comodo 66.84 ms (2) 8.26.56.26, 8.20.247.20 +Freenom 87.46 ms (2) 80.80.80.80, 80.80.81.81 +SKTelecom 177.66 ms (2) 168.126.63.1, 168.126.63.2 +Yandex 213.04 ms (2) 77.88.8.8, 77.88.8.1 +AliDNS 226.38 ms (2) 223.5.5.5, 223.6.6.6 +OneDNS 252.23 ms (1) 117.50.22.22 +CenturyLink 274.07 ms (2) 205.171.3.65, 205.171.2.65 +DNSpai 291.12 ms (2) 101.226.4.6, 218.30.118.6 +DNSPodDNS+ 310.54 ms (2) 119.29.29.29, 119.28.28.28 +CNNICSDNS 630.80 ms (2) 1.2.4.8, 210.2.4.8 +DNS.WATCH 691.58 ms (2) 84.200.69.80, 84.200.70.40 +``` diff --git a/dnsreload.sh b/dnsreload.sh new file mode 100644 index 0000000..069da84 --- /dev/null +++ b/dnsreload.sh @@ -0,0 +1,99 @@ +#!/usr/bin/env bash +# shellcheck disable=SC2034 +# shellcheck source=/dev/null +# bash /volume1/homes/admin/scripts/bash/dnsreload.sh + +check_pid_in_docker() { # Function to check if a PID belongs to a Docker container + local pid="$1" # Assigns the first argument to a local variable 'pid' + if [[ -f "/proc/$pid/mountinfo" ]]; then # Check if /proc/$pid/mountinfo exists, which provides details about a process's mounts + if container_id=$(awk -F'docker/containers/|/' '\ + {for (i=2;i<=NF;i++) \ + if ($i ~ /^[0-9a-f]{64}$/) {print $i; exit}}' "/proc/$pid/mountinfo"); then # Extract container ID from the mountinfo file if the process is in a Docker container + container_name=$(docker ps --filter "id=$container_id" --format '{{.Names}}' 2>/dev/null) # Get the container name from the Docker container ID + if [[ -n "$container_name" ]]; then # If a container name is found, return it, else return an empty string + echo "$container_name" + else + echo "" + fi + else + echo "" # If container ID is not found, return an empty string + fi + else # Print an error if /proc/$pid/mountinfo is not found for the process + printf '%16s %s\n' "Error:" "/proc/$pid/mountinfo not found" + fi +} + +restart_dns_service() { # Function to restart DNS services based on their type (daemon or Docker) + local service_name="$1" # The name of the DNS service + local type_name="$2" # Type of service (daemon or docker) + local container_name="$3" # Docker container name (optional) + case "$type_name" in + "daemon") + printf '%16s %s\n' "Type:" "$type_name" # Print the type of service (daemon) + case "$service_name" in # Based on the service name, call the appropriate DNS reload command + "pihole" | "pihole-FTL") # Reload Pi-hole DNS + printf '%16s %s\n' "Action:" "Reloading Pi-hole DNS ($service_name)" + pihole restartdns reload \ + 2> >(grep -v "utils\.sh:.*readonly variable" >&2) # Suppress specific error messages related to readonly variables in Pi-hole's utils.sh + ;; + "AdGuardHome") # Reload AdGuard Home DNS + printf '%16s %s\n' "Action:" "Reloading AdGuard DNS ($service_name)" + systemctl reload AdGuardHome + ;; + "named") # Reload BIND DNS + printf '%16s %s\n' "Action:" "Reloading BIND DNS ($service_name)" + rndc reload + ;; + "unbound") # Reload Unbound DNS + printf '%16s %s\n' "Action:" "Unbound DNS ($service_name)" + unbound-control reload + ;; + *) # Handle undefined service names + printf '%16s %s\n' "Error:" "undefined $service_name ($type_name)" + ;; + esac + ;; + + "docker") + printf '%16s %s\n' "Type:" "$type_name ($container_name)" # Print the service type with the Docker container name + case "$service_name" in # Based on the service name, call the appropriate DNS reload command inside the Docker container + "pihole" | "pihole-FTL") # Reload Pi-hole DNS inside Docker + printf '%16s %s\n' "Action:" "Reloading Pi-hole DNS ($service_name)" + docker exec "$container_name" pihole reloaddns \ + 2> >(grep -v "utils\.sh:.*readonly variable" >&2) # Suppress specific error messages related to readonly variables in Pi-hole's utils.sh + ;; + "AdGuardHome") # Reload AdGuard DNS inside Docker + printf '%16s %s\n' "Action:" "Reloading AdGuard DNS ($service_name)" + docker exec "$container_name" /opt/adguardhome/AdGuardHome -s reload + ;; + *) # Handle undefined service names + printf '%16s %s\n' "Error:" "undefined $service_name ($type_name)" + ;; + esac + ;; + + *) # Handle unknown service types + echo "Unknown type detected: $type_name" + printf '%16s %s\n' "Error:" "undefined type ($type_name)" + ;; + esac +} + +if LOCALTEST=$(netstat -tulpnW | grep "\:53\b" | grep "tcp\b" | grep "LISTEN"); then # Detect the DNS service and its type by checking port 53 + DNSPROT=$(awk '{ print $1 }' <<< "$LOCALTEST") # Capture the protocol (e.g., TCP or UDP) from the first field + DNSPORT=$(awk '{ split($4, a, ":"); print a[2] }' <<< "$LOCALTEST") # Capture the port number by splitting the IP:port field (field 4) + DNSPID=$(awk '{ split($7, a, "/"); print a[1] }' <<< "$LOCALTEST") # Capture the program's PID (field 7, before the '/') + DNSPROG=$(awk '{ split($7, a, "/"); gsub(/[ \t]+$/, "", a[2]); print a[2] }' <<< "$LOCALTEST") # Capture the program name (field 7, after the '/') + + printf '\n%s\n\n' "CHECKING FOR LOCAL DNS SERVER AND FLUSHING CACHE" + printf '%16s %s\n' "Local DNS:" "$DNSPROT/$DNSPORT $DNSPROG (pid:$DNSPID)" # Print the detected DNS service and its details + + container_name=$(check_pid_in_docker "$DNSPID") # Check if the DNS service's PID belongs to a Docker container + if [ -n "$container_name" ]; then # If the service is running inside a Docker container, reload it as a Docker service + restart_dns_service "$DNSPROG" "docker" "$container_name" + else # Otherwise, treat it as a regular daemon service + restart_dns_service "$DNSPROG" "daemon" + fi +else # Print message if no local DNS server is found listening on port 53 + printf '%16s %s\n' "Local DNS:" "Not found" +fi diff --git a/dnstest.domains.txt b/dnstest.domains.txt new file mode 100644 index 0000000..c34b278 --- /dev/null +++ b/dnstest.domains.txt @@ -0,0 +1,50 @@ +# 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 + +# 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 + +# 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 diff --git a/dnstest.ipnr.txt b/dnstest.ipnr.txt new file mode 100644 index 0000000..c9b0a0f --- /dev/null +++ b/dnstest.ipnr.txt @@ -0,0 +1,89 @@ +# NON-RESPONSIVE IP4 DNS PROVIDERS + 37.235.1.174#FreeDNS/1 + 37.235.1.177#FreeDNS/2 + 81.218.119.11#GreenTeamDNS/1 + 209.88.198.133#GreenTeamDNS/2 + 185.121.177.177#OpenNIC/1 + 169.239.202.202#OpenNIC/2 + 208.76.50.50#SmartViper/1 + 208.76.51.51#SmartViper/2 + 91.239.100.100#UncensoredDNS/1 + 89.233.43.71#UncensoredDNS/2 + +# NON-RESPONSIVE IP4 ISP DNS PROVIDERS + 202.56.4.20#Airtel/1 + 202.56.4.21#Airtel/2 + 68.94.156.1#ATT/1 + 68.94.157.1#ATT/2 + 194.72.9.38#BT/1 + 194.72.9.39#BT/2 + 209.18.47.61#Charter/1 + 209.18.47.62#Charter/2 + 200.195.138.195#Claro/1 + 200.195.138.196#Claro/2 + 75.75.75.75#Comcast/1 + 75.75.76.76#Comcast/2 + 68.105.28.10#Cox/1 + 68.105.29.10#Cox/2 + 192.227.172.30#Frontier/1 + 192.227.172.31#Frontier/2 + 212.27.40.240#Iliad/1 + 212.27.40.241#Iliad/2 + 218.231.0.1#KDDI/1 + 218.231.0.2#KDDI/2 + 62.241.162.1#LibertyG/1 + 62.241.162.2#LibertyG/2 + 202.188.0.133#M1/1 + 202.188.0.134#M1/2 + 75.75.75.75#Mediacom/1 + 75.75.76.76#Mediacom/2 + 209.212.96.1#MTN/1 + 209.212.96.2#MTN/2 + 61.213.177.100#NTT/1 + 61.213.177.101#NTT/2 + 193.113.200.200#O2/1 + 193.113.200.201#O2/2 + 61.88.88.88#Optus/1 + 61.88.86.86#Optus/2 + 80.10.246.2#Orange/1 + 80.10.246.129#Orange/2 + 24.150.1.10#Rogers/1 + 24.150.1.11#Rogers/2 + 194.190.0.1#Rostelecom/1 + 194.190.0.2#Rostelecom/2 + 202.156.0.24#SingTel/1 + 202.156.0.25#SingTel/2 + 194.168.4.100#Sky/1 + 194.168.8.100#Sky/2 + 210.145.0.1#SoftBank/1 + 210.145.0.2#SoftBank/2 + 209.18.47.61#Spectrum/1 + 209.18.47.62#Spectrum/2 + 208.180.32.2#TDS/1 + 208.180.32.1#TDS/2 + 80.58.61.250#Telefonica/1 + 80.58.61.254#Telefonica/2 + 62.155.0.1#Telekom/1 + 62.155.0.2#Telekom/2 + 194.63.248.101#Telenor/1 + 194.63.248.102#Telenor/2 + 62.115.5.2#Telia/1 + 62.115.5.3#Telia/2 + 61.9.208.1#Telstra/1 + 61.9.208.2#Telstra/2 + 213.205.32.6#Tiscali/1 + 213.205.32.5#Tiscali/2 + 212.175.50.50#TurkTelekom/1 + 212.175.50.51#TurkTelekom/2 + 195.34.32.116#VimpelCom/1 + 195.34.32.118#VimpelCom/2 + 212.39.90.42#Vivacom/1 + 212.39.90.43#Vivacom/2 + 83.138.131.248#Vodafone/1 + 83.138.131.249#Vodafone/2 + 162.23.4.14#Windstream/1 + 162.23.4.10#Windstream/2 + 216.221.117.23#Xplornet/1 + 216.221.117.24#Xplornet/2 + 41.34.20.1#Zain/1 + 41.34.20.2#Zain/2 diff --git a/dnstest.ipv4.txt b/dnstest.ipv4.txt new file mode 100644 index 0000000..66f1155 --- /dev/null +++ b/dnstest.ipv4.txt @@ -0,0 +1,63 @@ +### WELL-KNOWN 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 + 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 +#114.114.114.114#114DNS/1 +#114.114.115.115#114DNS/2 +# 223.5.5.5#AliDNS/1 +# 223.6.6.6#AliDNS/2 +# 76.76.19.19#AlternateDNS/1 +# 76.223.122.150#AlternateDNS/2 +# 1.2.4.8#CNNICSDNS/1 +# 210.2.4.8#CNNICSDNS/2 +# 76.76.2.0#ControlD/1 +# 76.76.10.0#ControlD/2 +# 84.200.69.80#DNS.WATCH/1 +# 84.200.70.40#DNS.WATCH/2 +# 103.247.36.36#DNSFilter/1 +# 103.247.37.37#DNSFilter/2 +# 101.226.4.6#DNSpai/1 +# 218.30.118.6#DNSpai/2 +# 119.29.29.29#DNSPodDNS+/1 +# 119.28.28.28#DNSPodDNS+/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 +# 117.50.11.11#OneDNS/1 +# 117.50.22.22#OneDNS/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 + +### ISP DNS PROVIDERS +# 205.171.3.65#CenturyLink/1 +# 205.171.2.65#CenturyLink/2 +# 202.97.224.68#ChinaTCL-UNC/1 +# 202.97.224.69#ChinaTCL-UNC/2 +# 168.126.63.1#SKTelecom/1 +# 168.126.63.2#SKTelecom/2 diff --git a/dnstest.ipv6.txt b/dnstest.ipv6.txt new file mode 100644 index 0000000..b46acee --- /dev/null +++ b/dnstest.ipv6.txt @@ -0,0 +1,35 @@ +# WELL-KNOWN 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-v6 + 2620:74:1c::2:2#Neustar/2-v6 + 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 + 2a05:dfc7:5::53#OpenNIC/1-v6 + 2a05:dfc7:5353::53#OpenNIC/2-v6 + 2001:67c:2778::3939#SafeDNS/1-v6 + 2001:67c:2778::3939#SafeDNS/2-v6 + 2001:67c:28a4::#UncensoredDNS/1-v6 + 2a01:3a0:53:53::#UncensoredDNS/2-v6 + 2620:74:1b::1:1#Verisign/1-v6 + 2620:74:1c::2:2#Verisign/2-v6 + 2a02:6b8::feed:0ff#Yandex/1-v6 + 2a02:6b8:0:1::feed:0ff#Yandex/2-v6 diff --git a/dnstest.sh b/dnstest.sh index a617d26..8b6e1f8 100755 --- a/dnstest.sh +++ b/dnstest.sh @@ -1,104 +1,320 @@ #!/usr/bin/env bash +# shellcheck disable=SC2034 +# shellcheck source=/dev/null +# bash /volume1/homes/admin/scripts/bash/dnstest.sh +# PARSE COMMAND-LINE OPTIONS (FUTURE OPTIONS) +while getopts "::" opt; do + case ${opt} in + \?) + printf "Usage: %s\n" "$0" + exit 1 + ;; + esac +done +shift $((OPTIND - 1)) -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; } - - -NAMESERVERS=`cat /etc/resolv.conf | grep ^nameserver | cut -d " " -f 2 | sed 's/\(.*\)/&#&/'` - -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 -" - -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 -" - -# 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" +# CHECK FOR DIG REQUIREMENT +if ! command -v dig &>/dev/null; then + printf "\n" + printf "* DIG (Domain Information Gopher) is required for DNS queries,\n" + printf " but is not found in the PATH. Please install it.\n" + printf "\n" + if [ -e "/proc/sys/kernel/syno_hw_version" ]; then + printf " DIG can be installed as a part of the 'SynoCli Network Tools'\n" + printf " package. This can be installed via the DSM Package Center by\n" + printf " adding the 'SynoCommunity' Package Source site, located at:\n" + printf "\n" + printf " https://packages.synocommunity.com/\n" + else + printf " DIG can typically be installed as a part of the 'dnsutils' or\n" + printf " 'bind-utils' packages. These can be installed via your\n" + printf " package management system.\n" + fi + printf "\n" + printf "Exiting...\n" + printf "\n" + exit 1 fi -providerstotest=$PROVIDERSV4 +# SCRAPE SCRIPT PATH INFO +SrceFllPth=$(readlink -f "${BASH_SOURCE[0]}") # get full path of running script +SrceFolder=$(dirname "$SrceFllPth") # extract directory path from full path +SrceFileNE=${SrceFllPth##*/} # extract filename and extension from full path +SrceFileNm=${SrceFileNE%.*} # extract only filename from filename and extension -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 -elif [ "x$1" = "xipv4" ]; then - providerstotest=$PROVIDERSV4 -elif [ "x$1" = "xall" ]; then - if [ "x$hasipv6" = "x" ]; then - providerstotest=$PROVIDERSV4 - else - providerstotest="$PROVIDERSV4 $PROVIDERSV6" - fi +# RECURRING FUNCTIONS + +reload_dns() { + if [[ -f "${SrceFolder}/dnsreload.sh" ]]; then + bash "${SrceFolder}/dnsreload.sh" + else + printf "\n%s\n\n" "* dnsreload.sh not found. Skipping DNS cache clearing step.." + fi +} + +sanitize_array() { + local -n arr=$1 + shopt -s extglob + arr=("${arr[@]/#+([[:blank:]])/}") + arr=("${arr[@]/%+([[:blank:]])/}") +} + +# RELOAD DNS SERVICES TO CLEAR CACHES +reload_dns + +# BUILD LIST OF NAMESERVERS USED BY THIS HOST +mapfile -t NAMESERVERS < <(awk '/^nameserver/ {print $2 "#" $1 "/" NR}' /etc/resolv.conf) + +# CHECK IF LOCALHOST IS RUNNING DNS ON THE DEFAULT PORT +if LOCALTEST=$(netstat -tulpnW | grep "\:53\b" | grep "tcp\b" | grep "LISTEN"); then + LOCALDNS=$(awk -F '/' 'NR==1 { sub(/[ \t]+$/, "", $2); print $2; exit }' <<< "$LOCALTEST") + LOCALDNS="${LOCALDNS:0:14}" + LOCALHOST=("127.0.0.1#${LOCALDNS}/I" "127.0.0.1#${LOCALDNS}/C") + NAMESERVERS=("${LOCALHOST[@]}" "${NAMESERVERS[@]}") +fi + +# SANITIZE NAMESERVERS ARRAY +sanitize_array NAMESERVERS + +# IMPORT LIST OF IPV4 DNS PROVIDERS +mapfile -t PROVIDERSV4 < <(sort -t "#" -k 2,2 "$SrceFolder/$SrceFileNm.ipv4.txt") + +# BUILD LIST OF IPV6 DNS PROVIDERS +mapfile -t PROVIDERSV6 < <(sort -t "#" -k 2,2 "$SrceFolder/$SrceFileNm.ipv6.txt") + +# BUILD LIST OF DOMAINS TO TEST AGAINST +mapfile -t DOMAINS2TEST < <(sort -u "$SrceFolder/$SrceFileNm.domains.txt") + +# SANITIZE DOMAINS2TEST ARRAY +sanitize_array DOMAINS2TEST + +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 +sanitize_array PROVIDERSTOTEST -# 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} + 2))s" +printf '\n\n%s\n\n' "TESTING DOMAINS ($SrceFileNm.domains)" +printf '%8s %s\n' "Test#" "Domain Name" +printf '%8s %s\n' "------" "---------------" -totaldomains=0 -printf "%-21s" "" -for d in $DOMAINS2TEST; do +domain_index=0 +for d in "${DOMAINS2TEST[@]}"; do + if [[ -n "$d" ]] && [[ ! $d =~ ^#.* ]]; then + ((domain_index++)) + printf '%8s %s\n' "t$domain_index" "$d" + fi +done +unset domain_index + +printf '\n\n%s\n\n' "LOCAL THEN ALPHABETICAL BY SERVER ($SrceFileNm.log)" + +# REDIRECT STDOUT TO TEE IN ORDER TO DUPLICATE THE OUTPUT TO THE TERMINAL AS WELL AS A .LOG FILE +exec > >(tee "$SrceFolder/$SrceFileNm.log") + +eval printf '$nsl' "Server" +for d in "${DOMAINS2TEST[@]}"; do + if [[ -n "$d" ]] && [[ ! $d =~ ^#.* ]]; then totaldomains=$((totaldomains + 1)) - printf "%-8s" "test$totaldomains" + printf "%-4s" "t$totaldomains" + fi done -printf "%-8s" "Average" -echo "" +printf "%9s\n" "Median ms" +eval printf -- '-%.0s' "{1..$((length + 1))}" +printf ' %.0s' "" +for d in "${DOMAINS2TEST[@]}"; do + if [[ -n "$d" ]] && [[ ! $d =~ ^#.* ]]; then + printf "%-4s" "---" + fi +done +printf "%-4s\n" "---------" -for p in $NAMESERVERS $providerstotest; do +for p in "${PROVIDERSTOTEST[@]}"; do + if [[ -n "$p" ]] && [[ ! $p =~ ^#.* ]]; then pip=${p%%#*} pname=${p##*#} ftime=0 - - 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` + 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 }') 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" + ttime=1000 # Default timeout of 1000ms (1 second) + 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 }' 999)}'; then + printf "%3s %5s\n" "NR" "$xtime-to" + else + printf "%9s\n" "$avg ms" + fi + unset xtime + else + printf "%9s\n" "$avg ms" + fi + fi +done + +# CLOSE AND NORMALIZE THE LOGGING REDIRECTIONS +exec >/dev/tty 2>&1 + +# SUMMARY REPORTS +header_row=$(head -n 2 "$SrceFolder/$SrceFileNm.log") # Get the reusable results header row + +# SORT LOGGED OUTPUT BY FASTEST MEDIAN RESPONSE TIME +read -r third_line < <(head -n 3 "$SrceFolder/$SrceFileNm.log" | tail -n 1) +num_fields=$(awk '{print NF}' <<< "$third_line") +tail -n +3 "$SrceFolder/$SrceFileNm.log" | sort -k "$((num_fields - 1))" -k "$num_fields" -n -o "$SrceFolder/$SrceFileNm.sorted.log" +{ # Store the data how we want it presented + printf '%s\n' "$header_row" # Print the summary header + grep -v "NR" "$SrceFolder/$SrceFileNm.sorted.log" # Print responding servers + grep "NR" "$SrceFolder/$SrceFileNm.sorted.log" # Print non-responding servers +} >"$SrceFolder/$SrceFileNm".temp.log && mv "$SrceFolder/$SrceFileNm".temp.log "$SrceFolder/$SrceFileNm.sorted.log" + +printf '\n\n%s\n\n' "ALL SERVERS BY MEDIAN RESPONSE TIME ($SrceFileNm.sorted.log)" +cat "$SrceFolder/$SrceFileNm.sorted.log" +printf "\n" + +# DISPLAY ONLY TIMEOUT LOGGED OUTPUT IF PRESENT +timeouts=$(grep "\*" "$SrceFolder/$SrceFileNm.sorted.log") +if [[ -n "$timeouts" ]]; then # Check if the variable timeouts is non-empty before printing + printf '\n%s\n\n' "RESULTS WITH QUERY TIMEOUTS" + printf '%s\n' "$header_row" + printf '%s\n\n' "$timeouts" +fi + +printf '\n%s\n\n' "RESPONDING PROVIDERS BY AVERAGED MEDIAN RESPONSE TIMES" + +### # AVERAGE VALUES CALCULATION FOR EACH SERVER SET +### declare -A counts sums +# AVERAGE VALUES CALCULATION FOR EACH SERVER SET +declare -A counts sums +declare -A name_to_ip # "Cloudflare/1" -> "1.1.1.1" +declare -A responded # "Cloudflare/1" -> 1 if it responded +declare -A prov_ips # "Cloudflare/1 Cloudflare/2" -> "1.1.1.1 1.0.0.1" (space-separated unique list) + + +# Build name->IP map from the configured providers +for p in "${PROVIDERSTOTEST[@]}"; do + [[ -n "$p" && ! "$p" =~ ^# ]] || continue + ip=${p%%#*} + name=${p##*#} # e.g., "Cloudflare/1" + name_to_ip["$name"]="$ip" +done + + + +### while IFS= read -r line; do # Loop through each line in the sorted log file +### server_set=$(awk '{ sub(/\/.*/, "", $1); print $1 }' <<< "$line") # Extract the server set name (base name before the '/1', '/2', etc.) +### second_to_last_num=$(awk '{ print $(NF-1) }' <<< "$line") # Extract the second-to-last number (this is the median response time) +### if [[ -n "$second_to_last_num" ]]; then # If the extracted number is not empty, process it +### sums[$server_set]=$(awk -v sum="${sums[$server_set]:-0}" -v num="$second_to_last_num" 'BEGIN { print sum + num }') # Convert to floating-point if necessary +### if [[ "$second_to_last_num" != "NR" ]]; then +### counts[$server_set]=$((counts[$server_set] + 1)) +### fi +### fi +### done < "$SrceFolder/$SrceFileNm.sorted.log" +while IFS= read -r line; do + full_name=$(awk '{print $1}' <<< "$line") # e.g., "Cloudflare/1" + server_set=${full_name%%/*} # "Cloudflare" + second_to_last_num=$(awk '{ print $(NF-1) }' <<< "$line") + + if [[ -n "$second_to_last_num" ]]; then + sums[$server_set]=$(awk -v sum="${sums[$server_set]:-0}" -v num="$second_to_last_num" 'BEGIN { print sum + num }') + if [[ "$second_to_last_num" != "NR" ]]; then + counts[$server_set]=$((counts[$server_set] + 1)) + responded["$full_name"]=1 # mark member as responded + fi + fi +done < "$SrceFolder/$SrceFileNm.sorted.log" + - echo " $avg" + +sorted_sums=() # Declare an array to hold the sorted sums +for server_set in "${!sums[@]}"; do # Collect the averages and server sets + if [[ "${counts[$server_set]}" -gt 0 ]]; then + avg=$(awk -v sum="${sums[$server_set]}" -v count="${counts[$server_set]}" 'BEGIN { printf "%.2f", sum / count }') + if [[ "$avg" != "0.00" ]]; then # Check if avg is not equal to 0.00 before adding to sorted_sums + sorted_sums+=("$avg $server_set") # Store both avg and server_set into the sorted_sums array + fi + fi done +sorted_output=$(printf '%s\n' "${sorted_sums[@]}" | sort -n) # Sort the array based on the first column (avg value) numerically +eval printf '$nsl' "Provider" # Print the sorted results header +printf "%9s %s\n" "Average" "Servers" +eval printf -- '-%.0s' "{1..$((length + 1))}" +printf ' %.0s' "" +printf "%-4s %5s\n" "---------" "-------" + +### while read -r avg server_set; do +### eval printf '$nsl' "$server_set" +### printf "%9s " "$avg ms" +### printf "(%s)" "${counts[$server_set]}" +### printf "\n" +### done <<<"$sorted_output" +while read -r avg server_set; do + eval printf '$nsl' "$server_set" # Print the provider name (server_set) formatted with $nsl + printf "%9s " "$avg ms" # Print the avg ms value right after the provider name + printf "(%s)" "${counts[$server_set]}" # Print the count in parentheses (from ${counts[$server_set]}) + + # Build ordered member list like Cloudflare/1, Cloudflare/2 + members=$(printf '%s\n' "${!name_to_ip[@]}" \ + | awk -v p="$server_set/" 'index($0,p)==1' \ + | sort -t/ -k2,2n) + + # Filter to responders and map to IPs, preserving 1,2,3... order + ips_csv="" + while IFS= read -r m; do + [[ -n "${responded[$m]}" ]] || continue + ip="${name_to_ip[$m]}" + [[ -n "$ip" ]] || continue + if [[ -z "$ips_csv" ]]; then ips_csv="$ip"; else ips_csv="$ips_csv, $ip"; fi + done <<< "$members" + + [[ -n "$ips_csv" ]] && printf " %s" "$ips_csv" + printf "\n" +done <<<"$sorted_output" -exit 0; +printf "\n" diff --git a/results.md b/results.md deleted file mode 100644 index dd5d7a4..0000000 --- a/results.md +++ /dev/null @@ -1,223 +0,0 @@ -# DNS Performance Results - -Results from tests done by our users. Feel free to add yours (including Country, City and ISP / Datacenter). - -## North America - * [USA, California, San Diego, Frontier Residential](#usa-san-diego-frontier) - * [USA, California, Fremont, Linode Datacenter](#usa-fremont-linode) - * [USA, California, San Francisco, Digital Ocean Datacenter](#usa-sanfrancisco-digitalocean) - * [USA, Texas, Dallas, Linode](#usa-dallas-linode) - * [Canada, NB, Fredericton, Bell Aliant](#canada-nb-fredericton-bell) - * [Mexico, NL, Monterrey, Axtel](#mexico-nl-monterrey-axtel) - -## Europe - * [France, Paris, OVH Datacenter](#france-paris-ovh) - * [Germany, Karlsruhe, Residential](#germany-karlsruhe) - -## South America - * [Argentina, Buenos Aires, Residential](#argentina-buenosaires) - * [Brazil, Sao Paulo, AWS Datacenter](#brazil-saopaulo-aws) - -## Africa - * [Tunisia, Ariana, El Ghazela, Orange Tunisie](#tn-elghazela-orange) - -## North America Results - - -**USA, California, San Diego, Frontier Residential** - -``` - test1 test2 test3 test4 test5 test6 test7 test8 test9 Average -#1 level3 6 ms 8 ms 6 ms 6 ms 13 ms 6 ms 5 ms 7 ms 6 ms 7.00 -#2 cloudflare 6 ms 7 ms 11 ms 7 ms 7 ms 8 ms 7 ms 7 ms 7 ms 7.40 -#3 neustar 7 ms 7 ms 7 ms 6 ms 6 ms 9 ms 6 ms 10 ms 21 ms 8.70 -#4 norton 23 ms 7 ms 6 ms 9 ms 8 ms 7 ms 7 ms 6 ms 23 ms 10.40 -#5 cleanbrowsing 22 ms 18 ms 16 ms 18 ms 18 ms 18 ms 17 ms 16 ms 16 ms 17.90 -#6 google 6 ms 34 ms 7 ms 7 ms 42 ms 31 ms 11 ms 31 ms 7 ms 21.40 -#7 opendns 35 ms 8 ms 7 ms 44 ms 21 ms 68 ms 8 ms 56 ms 6 ms 27.10 -#8 quad9 15 ms 38 ms 80 ms 22 ms 15 ms 20 ms 24 ms 57 ms 20 ms 31.50 -#9 freenom 21 ms 42 ms 19 ms 20 ms 111 ms 212 ms 20 ms 70 ms 19 ms 59.40 -#10 comodo 79 ms 81 ms 74 ms 74 ms 75 ms 77 ms 76 ms 77 ms 80 ms 76.70 -#11 yandex 188 ms 268 ms 195 ms 191 ms 190 ms 195 ms 191 ms 205 ms 189 ms 203.50 -#12 adguard 196 ms 255 ms 203 ms 281 ms 229 ms 255 ms 183 ms 220 ms 187 ms 219.50 -``` - - -**USA, California, Fremont, Linode Datacenter** -``` test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 Average -#1 cloudflare 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.00 -#2 norton 1 ms 1 ms 1 ms 2 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.10 -#3 neustar 1 ms 1 ms 1 ms 2 ms 1 ms 1 ms 1 ms 1 ms 1 ms 2 ms 1.20 -#4 level3 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 4 ms 2.20 -#5 cleanbrowsing 1 ms 10 ms 8 ms 9 ms 2 ms 1 ms 1 ms 9 ms 1 ms 9 ms 5.10 -#6 google 19 ms 1 ms 1 ms 19 ms 19 ms 79 ms 1 ms 21 ms 21 ms 1 ms 18.20 -#7 opendns 39 ms 2 ms 2 ms 39 ms 3 ms 76 ms 2 ms 2 ms 21 ms 12 ms 19.80 -#8 quad9 67 ms 68 ms 2 ms 67 ms 1 ms 27 ms 69 ms 1 ms 1 ms 153 ms 45.60 -#9 comodo 68 ms 67 ms 67 ms 67 ms 67 ms 67 ms 67 ms 66 ms 67 ms 67 ms 67.00 -#10 freenom 143 ms 57 ms 56 ms 56 ms 57 ms 144 ms 57 ms 57 ms 145 ms 57 ms 82.90 -#11 adguard 146 ms 143 ms 143 ms 1 ms 3 ms 144 ms 5 ms 1 ms 145 ms 146 ms 87.70 -#12 yandex 179 ms 173 ms 174 ms 174 ms 185 ms 199 ms 172 ms 173 ms 172 ms 231 ms 183.20 -``` - - -**USA, California, San Francisco, Digital Ocean Datacenter** -``` test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 Average -#1 level3 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 2 ms 1 ms 1.10 -#2 norton 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2.00 -#3 neustar 2 ms 2 ms 2 ms 3 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2 ms 2.10 -#4 cloudflare 2 ms 2 ms 3 ms 3 ms 3 ms 2 ms 2 ms 2 ms 3 ms 2 ms 2.40 -#5 cleanbrowsing 4 ms 4 ms 4 ms 4 ms 4 ms 4 ms 4 ms 4 ms 4 ms 4 ms 4.00 -#6 adguard 2 ms 5 ms 2 ms 7 ms 2 ms 2 ms 6 ms 2 ms 9 ms 8 ms 4.50 -#7 google 1 ms 3 ms 3 ms 20 ms 20 ms 61 ms 6 ms 23 ms 21 ms 4 ms 16.20 -#8 quad9 2 ms 2 ms 59 ms 2 ms 1 ms 9 ms 2 ms 125 ms 2 ms 1 ms 20.50 -#9 opendns 1 ms 1 ms 2 ms 58 ms 3 ms 148 ms 1 ms 38 ms 1 ms 11 ms 26.40 -#10 freenom 28 ms 26 ms 28 ms 26 ms 24 ms 28 ms 28 ms 26 ms 28 ms 26 ms 26.80 -#11 comodo 79 ms 172 ms 84 ms 76 ms 79 ms 81 ms 83 ms 83 ms 76 ms 79 ms 89.20 -#12 yandex 178 ms 210 ms 198 ms 176 ms 185 ms 178 ms 179 ms 187 ms 180 ms 181 ms 185.20 -``` - - -**USA, Texas, Dallas, Linode Datacenter** -``` test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 Average -#1 cleanbrowsing 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.00 -#1 cloudflare 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.00 -#1 level3 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.00 -#4 norton 1 ms 1 ms 1 ms 2 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.10 -#5 neustar 1 ms 1 ms 1 ms 2 ms 1 ms 2 ms 2 ms 1 ms 1 ms 1 ms 1.30 -#6 opendns 1 ms 1 ms 1 ms 14 ms 1 ms 2 ms 1 ms 7 ms 7 ms 1 ms 3.60 -#7 google 8 ms 8 ms 1 ms 8 ms 9 ms 39 ms 1 ms 8 ms 10 ms 1 ms 9.30 -#8 quad9 1 ms 30 ms 30 ms 1 ms 1 ms 1 ms 1 ms 30 ms 30 ms 58 ms 18.30 -#9 comodo 38 ms 38 ms 38 ms 38 ms 38 ms 38 ms 38 ms 37 ms 37 ms 38 ms 37.80 -#10 adguard 114 ms 43 ms 42 ms 112 ms 119 ms 41 ms 115 ms 116 ms 116 ms 41 ms 85.90 -#11 freenom 115 ms 125 ms 114 ms 125 ms 151 ms 230 ms 125 ms 124 ms 114 ms 116 ms 133.90 -#12 yandex 140 ms 177 ms 141 ms 137 ms 147 ms 171 ms 139 ms 143 ms 140 ms 163 ms 149.80 -``` - - -**Canada, NB, Fredericton, Bell Aliant** -``` - test1 test2 test3 test4 test5 test6 test7 test8 test9 Average -#1 cloudflare 38 ms 38 ms 38 ms 37 ms 37 ms 37 ms 37 ms 37 ms 38 ms 37.40 -#2 cleanbrowsing 37 ms 37 ms 37 ms 37 ms 37 ms 37 ms 45 ms 38 ms 37 ms 37.90 -#3 neustar 37 ms 38 ms 38 ms 38 ms 38 ms 39 ms 37 ms 40 ms 38 ms 38.10 -#4 google 38 ms 37 ms 75 ms 37 ms 46 ms 38 ms 37 ms 40 ms 37 ms 42.20 -#5 comodo 38 ms 41 ms 100 ms 42 ms 38 ms 38 ms 40 ms 43 ms 39 ms 45.80 -#6 quad9 59 ms 62 ms 57 ms 58 ms 65 ms 67 ms 70 ms 71 ms 133 ms 84.80 -#7 norton 147 ms 280 ms 154 ms 38 ms 39 ms 38 ms 40 ms 37 ms 40 ms 85.10 -#8 adguard 119 ms 118 ms 128 ms 112 ms 118 ms 114 ms 119 ms 119 ms 116 ms 118.50 -#9 yandex 145 ms 147 ms 142 ms 144 ms 148 ms 174 ms 136 ms 141 ms 143 ms 146.10 -#10 opendns 172 ms 63 ms 245 ms 158 ms 146 ms 159 ms 279 ms 140 ms 163 ms 167.50 -``` - - - -**Mexico, NL, Monterrey, Axtel** -``` - test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 Average -#1 cloudflare 6 ms 7 ms 7 ms 7 ms 9 ms 7 ms 6 ms 6 ms 6 ms 8 ms 6.90 -#2 level3 20 ms 19 ms 20 ms 20 ms 20 ms 19 ms 20 ms 20 ms 20 ms 19 ms 19.70 -#3 google 32 ms 32 ms 76 ms 64 ms 70 ms 31 ms 34 ms 64 ms 33 ms 34 ms 47.00 -#4 quad9 30 ms 30 ms 33 ms 29 ms 33 ms 32 ms 32 ms 28 ms 28 ms 270 ms 54.50 -#5 freenom 31 ms 31 ms 30 ms 31 ms 32 ms 31 ms 31 ms 31 ms 31 ms 31 ms 31.00 -#6 opendns 18 ms 18 ms 19 ms 27 ms 19 ms 20 ms 18 ms 24 ms 26 ms 19 ms 20.80 -#7 norton 214 ms 20 ms 20 ms 21 ms 20 ms 20 ms 19 ms 20 ms 20 ms 21 ms 39.50 -#8 cleanbrowsing 23 ms 22 ms 25 ms 21 ms 22 ms 311 ms 30 ms 23 ms 22 ms 32 ms 53.10 -#9 yandex 182 ms 178 ms 187 ms 180 ms 183 ms 185 ms 181 ms 182 ms 187 ms 203 ms 184.80 -#10 adguard 56 ms 71 ms 56 ms 57 ms 61 ms 57 ms 1000 ms 72 ms 61 ms 82 ms 157.30 -#11 neustar 20 ms 20 ms 19 ms 21 ms 21 ms 19 ms 19 ms 20 ms 20 ms 19 ms 19.80 -#12 comodo 22 ms 59 ms 19 ms 22 ms 23 ms 22 ms 20 ms 28 ms 21 ms 22 ms 25.80 -``` - -## Europe Results - -**France, Paris, OVH Datacenter** -``` - test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 Average -#1 cloudflare 5 ms 17 ms 5 ms 5 ms 5 ms 5 ms 5 ms 5 ms 5 ms 5 ms 6.20 -#2 cleanbrowsing 7 ms 7 ms 7 ms 7 ms 7 ms 7 ms 7 ms 7 ms 7 ms 7 ms 7.00 -#3 freenom 7 ms 9 ms 7 ms 7 ms 7 ms 7 ms 7 ms 7 ms 7 ms 7 ms 7.20 -#4 level3 7 ms 8 ms 7 ms 7 ms 8 ms 8 ms 7 ms 7 ms 7 ms 7 ms 7.30 -#5 quad9 7 ms 8 ms 7 ms 7 ms 8 ms 7 ms 7 ms 7 ms 7 ms 8 ms 7.30 -#6 google 5 ms 5 ms 4 ms 19 ms 5 ms 16 ms 5 ms 12 ms 12 ms 10 ms 9.30 -#7 opendns 5 ms 20 ms 5 ms 5 ms 5 ms 5 ms 18 ms 17 ms 17 ms 5 ms 10.20 -#8 neustar 20 ms 22 ms 20 ms 21 ms 21 ms 21 ms 21 ms 21 ms 21 ms 21 ms 20.90 -#9 norton 21 ms 21 ms 21 ms 21 ms 21 ms 21 ms 22 ms 21 ms 21 ms 21 ms 21.10 -#10 yandex 39 ms 38 ms 39 ms 38 ms 47 ms 39 ms 36 ms 42 ms 35 ms 78 ms 43.10 -#11 comodo 10 ms 10 ms 10 ms 10 ms 10 ms 10 ms 10 ms 10 ms 10 ms 417 ms 50.70 -#12 adguard 55 ms 125 ms 54 ms 54 ms 66 ms 61 ms 58 ms 54 ms 54 ms 54 ms 63.50 -``` - - -**Germany, Karlsruhe, Residential** -``` - test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 Average -127.0.0.1 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.00 -45.90.30.39 15 ms 11 ms 15 ms 15 ms 15 ms 19 ms 11 ms 15 ms 15 ms 15 ms 14.60 -84.200.69.80 15 ms 11 ms 15 ms 15 ms 11 ms 11 ms 15 ms 19 ms 23 ms 19 ms 15.40 -cloudflare 27 ms 15 ms 19 ms 11 ms 15 ms 19 ms 11 ms 11 ms 27 ms 15 ms 17.00 -level3 15 ms 11 ms 11 ms 15 ms 19 ms 11 ms 15 ms 19 ms 23 ms 15 ms 15.40 -google 19 ms 23 ms 19 ms 35 ms 23 ms 23 ms 19 ms 31 ms 23 ms 23 ms 23.80 -quad9 1000 ms 1000 ms 31 ms 1000 ms 23 ms 1000 ms 19 ms 1000 ms 1000 ms 1000 ms 707.30 -freenom 43 ms 1000 ms 1000 ms 1000 ms 671 ms 1000 ms 1000 ms 1000 ms 1000 ms 1000 ms 871.40 -opendns 23 ms 19 ms 19 ms 23 ms 15 ms 95 ms 11 ms 23 ms 23 ms 15 ms 26.60 -norton 15 ms 15 ms 11 ms 15 ms 19 ms 23 ms 27 ms 19 ms 19 ms 23 ms 18.60 -cleanbrowsing 15 ms 19 ms 15 ms 27 ms 19 ms 19 ms 19 ms 11 ms 27 ms 11 ms 18.20 -yandex 51 ms 51 ms 55 ms 43 ms 59 ms 55 ms 55 ms 55 ms 51 ms 71 ms 54.60 -adguard 135 ms 119 ms 119 ms 119 ms 115 ms 111 ms 115 ms 119 ms 115 ms 119 ms 118.60 -neustar 19 ms 27 ms 23 ms 31 ms 39 ms 19 ms 27 ms 23 ms 23 ms 23 ms 25.40 -comodo 11 ms 15 ms 15 ms 27 ms 15 ms 19 ms 15 ms 15 ms 19 ms 15 ms 16.60 -``` - -## South America - -**Argentina, Buenos Aires, Residential** -``` - test1 test2 test3 test4 test5 test6 test7 test8 test9 Average -#1 cloudflare 26 ms 25 ms 26 ms 24 ms 26 ms 25 ms 24 ms 24 ms 25 ms 25.00 -#2 google 25 ms 25 ms 25 ms 27 ms 81 ms 25 ms 24 ms 26 ms 24 ms 30.60 -#3 cleanbrowsing 32 ms 36 ms 34 ms 35 ms 33 ms 31 ms 33 ms 156 ms 33 ms 46.00 -#4 opendns 149 ms 32 ms 32 ms 269 ms 34 ms 232 ms 32 ms 152 ms 87 ms 105.30 -#5 neustar 160 ms 150 ms 164 ms 161 ms 159 ms 156 ms 159 ms 159 ms 156 ms 158.30 -#6 quad9 158 ms 160 ms 156 ms 158 ms 157 ms 158 ms 163 ms 159 ms 159 ms 158.80 -#7 norton 156 ms 152 ms 163 ms 156 ms 174 ms 158 ms 157 ms 163 ms 161 ms 160.30 -#8 comodo 169 ms 170 ms 171 ms 162 ms 166 ms 161 ms 169 ms 162 ms 165 ms 166.10 -#9 yandex 271 ms 283 ms 297 ms 288 ms 287 ms 302 ms 277 ms 295 ms 294 ms 289.00 -#10 adguard 291 ms 290 ms 290 ms 294 ms 285 ms 288 ms 287 ms 297 ms 284 ms 290.00 -``` - - -**Brazil, Sao Paulo, AWS Datacenter** -``` - test1 test2 test3 test4 test5 test6 test7 test8 test9 Average -#1 cleanbrowsing 3 ms 3 ms 4 ms 3 ms 4 ms 4 ms 3 ms 4 ms 4 ms 3.60 -#2 cloudflare 6 ms 5 ms 5 ms 5 ms 5 ms 29 ms 5 ms 5 ms 6 ms 10.20 -#3 google 58 ms 2 ms 1 ms 57 ms 105 ms 52 ms 2 ms 55 ms 49 ms 38.20 -#4 opendns 122 ms 4 ms 3 ms 180 ms 3 ms 122 ms 4 ms 4 ms 3 ms 44.90 -#5 neustar 112 ms 112 ms 112 ms 111 ms 112 ms 113 ms 113 ms 111 ms 114 ms 112.10 -#6 norton 118 ms 113 ms 111 ms 111 ms 113 ms 117 ms 113 ms 114 ms 113 ms 114.20 -#7 level3 122 ms 121 ms 120 ms 121 ms 122 ms 123 ms 123 ms 121 ms 122 ms 121.70 -#8 comodo 133 ms 128 ms 128 ms 129 ms 127 ms 128 ms 128 ms 128 ms 128 ms 129.00 -#9 freenom 161 ms 161 ms 168 ms 207 ms 172 ms 161 ms 162 ms 167 ms 169 ms 169.00 -#10 quad9 176 ms 176 ms 175 ms 175 ms 176 ms 175 ms 175 ms 175 ms 176 ms 175.40 -#11 yandex 240 ms 272 ms 243 ms 247 ms 242 ms 236 ms 237 ms 241 ms 236 ms 243.10 -#12 adguard 249 ms 245 ms 247 ms 250 ms 249 ms 244 ms 244 ms 252 ms 259 ms 248.70 -``` - -## Africa Results - -**Tunisia, Ariana, El Ghazela, Orange Tunisie** -``` - test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 Average -#1 opendns 75 ms 68 ms 51 ms 73 ms 60 ms 48 ms 50 ms 54 ms 83 ms 63 ms 62.50 -#2 cloudflare 66 ms 61 ms 73 ms 65 ms 60 ms 65 ms 64 ms 66 ms 75 ms 64 ms 65.90 -#3 google 63 ms 55 ms 54 ms 74 ms 87 ms 75 ms 54 ms 95 ms 66 ms 64 ms 68.70 -#4 level3 64 ms 59 ms 73 ms 74 ms 65 ms 85 ms 65 ms 73 ms 77 ms 60 ms 69.50 -#5 norton 69 ms 71 ms 78 ms 62 ms 69 ms 70 ms 75 ms 73 ms 68 ms 71 ms 70.60 -#6 neustar 86 ms 62 ms 71 ms 74 ms 70 ms 83 ms 66 ms 68 ms 70 ms 72 ms 72.20 -#7 quad9 89 ms 80 ms 92 ms 66 ms 67 ms 82 ms 63 ms 72 ms 88 ms 67 ms 76.60 -#8 adguard 89 ms 82 ms 64 ms 86 ms 85 ms 70 ms 84 ms 72 ms 76 ms 84 ms 79.20 -#9 cleanbrowsing 83 ms 70 ms 62 ms 61 ms 75 ms 198 ms 65 ms 72 ms 61 ms 71 ms 81.80 -#12 yandex 108 ms 148 ms 93 ms 108 ms 113 ms 101 ms 112 ms 92 ms 94 ms 131 ms 110.00 -#11 freenom 87 ms 124 ms 92 ms 111 ms 136 ms 250 ms 128 ms 338 ms 101 ms 177 ms 154.40 -#12 comodo 89 ms 5092 ms 93 ms 99 ms 96 ms 85 ms 10106 ms 80 ms 86 ms 5127 ms 2095.30 -```