Skip to content

qwerty541/dns-bench

dns-bench

Crates.io version Crates.io downloads Rust version License Workflow Status

Table of contents

Description

This repository provides a DNS benchmarking command-line tool written in Rust. It iterates through a built-in list of public DNS servers as well as automatically detected system DNS servers, measures their response times, and prints a table of sorted results in the console. You can use it to find the fastest DNS server for your location, improving your internet browsing experience. A preview, list of features, and the list of built-in DNS servers are provided below.

Preview

Image

Preview image

Animation

Preview animation

Features

🚀 Core Features

  • Built-in list of public DNS servers
    Includes popular providers like Google, Cloudflare, Quad9, and more.
  • Automatic detection of system DNS servers
    Detects and highlights your system's configured DNS servers (Linux, Windows, macOS).
  • Multi-threaded benchmarking
    Runs benchmarks in parallel for faster results.

⚙️ Configuration & Flexibility

  • Customizable request count, thread count, timeout, and domain
    Fine-tune how many requests, threads, and which domain to test.
  • Protocol and IP version selection
    Choose between UDP/TCP and IPv4/IPv6 for both lookup and connection.
  • Custom DNS server lists
    Use your own list of DNS servers instead of the built-in set.

📊 Output & Usability

  • Multiple output formats
    Human-readable table, JSON, XML, or CSV for easy integration and analysis.
  • Configurable table styles
    Choose from various table styles for better readability.
  • Save favorite configurations
    Store your preferred settings in a config file for quick reuse.

🐳 Platform & Integration

  • Docker support
    Run easily in a containerized environment (system DNS detection is skipped in Docker).
  • Cross-platform
    Works on Linux, Windows, and macOS.

List of built-in DNS servers

  • Google Public DNS
  • Cloudflare
  • Quad9
  • ControlD
  • OpenDNS
  • CleanBrowsing
  • AdGuard DNS
  • Comodo Secure DNS
  • Level3
  • Verisign
  • DNS.WATCH
  • Norton ConnectSafe
  • SafeDNS
  • NextDNS
  • Dyn
  • Hurricane Electric
  • Surfshark DNS
  • SafeServe

Installation

Which method to choose?

  • If you don't have Rust programming language environment installed on your machine, then installation from Docker Hub will be the best option for you.
  • If you have Rust programming language environment installed on your machine, then you can choose between installation from crates.io or installation from git repository.
  • Installation from git repository is suitable only when you want to use the development version instead of the stable one or the crates.io service is unavailable.

From crates.io

Run the following command and wait until the crate is compiled:

$ cargo install dns-bench

Now you can run compiled binary:

$ dns-bench [OPTIONS]

From git repository

Run the following command and wait until the crate is compiled:

$ cargo install --git https://github.com/qwerty541/dns-bench.git --tag v0.9.1 dns-bench

Also you can remove tag option to install the latest development version.

Now you can run compiled binary:

$ dns-bench [OPTIONS]

From Docker Hub

Run the following command to pull the image:

$ docker pull qwerty541/dns-bench:latest

Now you can run this tool inside the container:

$ docker run --rm -it --name dns-bench qwerty541/dns-bench:latest

If you want to pass some options, you can do it like this:

$ docker run --rm -it --name dns-bench qwerty541/dns-bench:latest /bin/bash -c "dns-bench --requests 20 --domain microsoft.com --style re-structured-text"

In case you want to use custom servers list, you have to mount the file with custom servers list to the container and pass the path to the file as an argument:

$ docker run --rm -it --name dns-bench --volume /home/alexandr/projects/dns-bench/examples/ipv4-custom-servers-example.txt:/ipv4-custom-servers-example.txt qwerty541/dns-bench:latest /bin/bash -c "dns-bench --custom-servers-file /ipv4-custom-servers-example.txt"

Options

Below is a list of currently supported options.

Option Description Default value Possible values
--domain Domain to resolve. google.com Any domain
--threads Number of threads to use. 8 1..256
--requests Number of requests to each DNS server. 25 1..1000
--timeout Timeout in seconds. 3 1..60
--protocol Protocol to use. udp tcp, udp
--name-servers-ip IP version to use for establishing connection. v4 v4, v6
--lookup-ip IP version to use for lookup. v4 v4, v6
--style Table style to use. rounded empty, blank, ascii, psql, markdown, modern, sharp, rounded, modern-rounded, extended, dots, re-structured-text, ascii-rounded
--save-config Save the configurations to a file in users home directory.
--custom-servers-file Provide a path to a file with custom servers list to use instead of built-in list. An example of file format can be found here for IPv4 and here for IPv6.
--format Format of the output. human-readable human-readable, json, xml, csv
--skip-system-servers Skip auto-detection of system DNS servers.

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Sponsor this project

Contributors 3

  •  
  •  
  •  

Languages