====== DNS Latency ====== ===== Example 1 ===== The script calls two dns servers directly (the ones you want to measure) and returns the query latency. while true do ns2=$(dig -4 @1.1.1.1 example.com | grep Query | cut -d \: -f 2 | sed -e 's/ //' ) ns3=$(dig -4 @1.0.0.1 other-example.com | grep Query | cut -d \: -f 2 | sed -e 's/ //') echo "ns2 latency: $ns2 / ns3 latency: $ns3"; sleep $(($RANDOM% 10 + 1)) done ===== Example 2 ===== The script will pick three random name from the list and request the corresponding type. #!/bin/bash # Set the list of DNS names to test dns_names=( "example.com A" "example.net MX" "example.org NS" "example.info TXT" "example.edu SPF" "example.gov SRV" "example.net AAAA" "example.org CNAME" "example.info PTR" "example.edu SOA" ) # Set the list of DNS servers to test dns_servers=(8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1) # Randomly shuffle the list of DNS names num_names=${#dns_names[@]} for ((i=0; i ===== Example 3 ===== This script will pick two domain names from the list and loop over them "num_loops" of times with a random sleep in between. #!/bin/bash # Set the number of loops to run num_loops=5 # Set the list of DNS servers to test dns_servers=(8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1) # Set the list of DNS names to resolve dns_names=(www.google.com www.facebook.com www.twitter.com www.instagram.com www.reddit.com) # Iterate over the number of loops for ((i=1; i<=num_loops; i++)); do # Pick two random names from the list name1=$((RANDOM % ${#dns_names[@]})) name2=$((RANDOM % ${#dns_names[@]})) # Iterate over the list of DNS servers for server in "${dns_servers[@]}"; do # Use the `dig` command to measure the latency of the DNS server for the two random names latency1=$(dig +tries=1 +time=2 +stats @"$server" "${dns_names[$name1]}" | grep Query | awk '{print $4 " ms"}') latency2=$(dig +tries=1 +time=2 +stats @"$server" "${dns_names[$name2]}" | grep Query | awk '{print $4 " ms"}') # Print the results printf "%s %s %s %s %s\n" "$server" "${dns_names[$name1]}" "$latency1" "${dns_names[$name2]}" "$latency2" done # Sleep for a random number of seconds between 1 and 10 sleep $(($RANDOM % 10 + 1)) done ===== Example 4 ===== This is a rather dubious script. It will pick two base domains from the list, three record types from the list and generate two random hostnames. It then glues it all together and iterate over the different records. #!/bin/bash # Set the base domains base_domains=(example.com example.org example.net) # Set the list of DNS record types to test record_types=(A AAAA CNAME MX NS PTR SOA SPF SRV TXT) # Set the number of loops to run num_loops=5 # Set the list of DNS servers to test dns_servers=(8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1) # Iterate over the number of loops for ((i=1; i<=num_loops; i++)); do # Pick two random base domains from the list domain1=${base_domains[$((RANDOM % ${#base_domains[@]}))]} domain2=${base_domains[$((RANDOM % ${#base_domains[@]}))]} # Generate two random DNS names based on the base domains name1=$(tr -dc 'a-z0-9' < /dev/urandom | head -c 8).$domain1 name2=$(tr -dc 'a-z0-9' < /dev/urandom | head -c 8).$domain2 # Iterate over the list of DNS servers for server in "${dns_servers[@]}"; do # Pick three random record types from the list type1=${record_types[$((RANDOM % ${#record_types[@]}))]} type2=${record_types[$((RANDOM % ${#record_types[@]}))]} type3=${record_types[$((RANDOM % ${#record_types[@]}))]} # Use the `dig` command to measure the latency of the DNS server for the two random names and the three random record types latency1=$(dig +tries=1 +time=2 +stats @"$server" "$name1" "$type1" | grep Query | awk '{print $4 " ms"}') latency2=$(dig +tries=1 +time=2 +stats @"$server" "$name2" "$type2" | grep Query | awk '{print $4 " ms"}') latency3=$(dig +tries=1 +time=2 +stats @"$server" "$name1" "$type3" | grep Query | awk '{print $4 " ms"}') latency4=$(dig +tries=1 +time=2 +stats @"$server" "$name2" "$type3" | grep Query | awk '{print $4 " ms"}') # Print the results printf "%s %s %s %s %s %s %s %s\n" "$server" "$name1" "$type1" "$latency1" "$name2" "$type2" "$latency2" "$type3" "$latency3" "$latency4" done # Sleep for a random number of seconds between 1 and 10 sleep $(($RANDOM % 10 + 1)) done ===== Example 5 ===== This version is similar to example 2 but instead of using dig it uses host. #!/bin/bash # Set the list of DNS names to test dns_names=( "example.com A" "example.net MX" "example.org NS" "example.info TXT" "example.edu SPF" "example.gov SRV" "example.net AAAA" "example.org CNAME" "example.info PTR" "example.edu SOA" ) # Set the list of DNS servers to test dns_servers=(8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1) # Randomly shuffle the list of DNS names num_names=${#dns_names[@]} for ((i=0; i&1 | grep real | awk '{print $2}') # Print the results printf "%s %s %s %s\n" "$server" "$dns_name" "$dns_type" "$latency" done done