{"id":16895503,"url":"https://github.com/qwerty541/dns-bench","last_synced_at":"2025-09-01T08:50:04.127Z","repository":{"id":196682909,"uuid":"696898733","full_name":"qwerty541/dns-bench","owner":"qwerty541","description":"Find the fastest DNS in your location to improve internet browsing experience.","archived":false,"fork":false,"pushed_at":"2025-08-24T18:35:16.000Z","size":8879,"stargazers_count":32,"open_issues_count":6,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-24T22:48:41.233Z","etag":null,"topics":["bench","benchmarking","command-line","command-line-app","command-line-tool","commandline","dns","dns-benchmark","dns-lookup","dns-servers","open-source","performance-testing","rust","rust-crate","rust-lang","utility"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/dns-bench","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qwerty541.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE-APACHE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":null,"patreon":"AlexandrGarbuzov","open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2023-09-26T16:35:23.000Z","updated_at":"2025-08-24T18:35:16.000Z","dependencies_parsed_at":"2023-10-05T00:57:40.576Z","dependency_job_id":"2733be9c-72ff-4ef3-8e04-3900b397c7ac","html_url":"https://github.com/qwerty541/dns-bench","commit_stats":{"total_commits":125,"total_committers":2,"mean_commits":62.5,"dds":"0.10399999999999998","last_synced_commit":"5dd0dabc443633293d861af6f959efc3f8b8a6f0"},"previous_names":["qwerty541/dns-bench"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/qwerty541/dns-bench","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qwerty541%2Fdns-bench","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qwerty541%2Fdns-bench/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qwerty541%2Fdns-bench/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qwerty541%2Fdns-bench/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qwerty541","download_url":"https://codeload.github.com/qwerty541/dns-bench/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qwerty541%2Fdns-bench/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273094755,"owners_count":25044558,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-01T02:00:09.058Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bench","benchmarking","command-line","command-line-app","command-line-tool","commandline","dns","dns-benchmark","dns-lookup","dns-servers","open-source","performance-testing","rust","rust-crate","rust-lang","utility"],"created_at":"2024-10-13T17:24:33.893Z","updated_at":"2025-09-01T08:50:04.061Z","avatar_url":"https://github.com/qwerty541.png","language":"Rust","funding_links":["https://patreon.com/AlexandrGarbuzov"],"categories":[],"sub_categories":[],"readme":"# dns-bench \u003c!-- omit in toc --\u003e\n\n[![Crates.io version][crates-version-badge]][crates-url]\n[![Crates.io downloads][crates-downloads-badge]][crates-url]\n![Rust version][rust-version]\n![License][license-badge]\n[![Workflow Status][workflow-badge]][actions-url]\n\n[crates-version-badge]: https://img.shields.io/crates/v/dns-bench.svg\n[crates-downloads-badge]: https://img.shields.io/crates/d/dns-bench.svg\n[crates-url]: https://crates.io/crates/dns-bench\n[license-badge]: https://img.shields.io/crates/l/dns-bench.svg\n[workflow-badge]: https://github.com/qwerty541/dns-bench/workflows/check/badge.svg\n[actions-url]: https://github.com/qwerty541/dns-bench/actions\n[rust-version]: https://img.shields.io/badge/rust-1.82.0%2B-lightgrey.svg?logo=rust\n\n\u003cdetails\u003e\n\u003csummary\u003eTable of contents\u003c/summary\u003e\n\n- [Description](#description)\n  - [Preview](#preview)\n    - [Image](#image)\n    - [Animation](#animation)\n  - [Features](#features)\n    - [🚀 Core Features](#-core-features)\n    - [⚙️ Configuration \\\u0026 Flexibility](#️-configuration--flexibility)\n    - [📊 Output \\\u0026 Usability](#-output--usability)\n    - [🐳 Platform \\\u0026 Integration](#-platform--integration)\n  - [List of built-in DNS servers](#list-of-built-in-dns-servers)\n- [Installation](#installation)\n  - [Which method to choose?](#which-method-to-choose)\n  - [From crates.io using Cargo](#from-cratesio-using-cargo)\n  - [From git repository using Cargo](#from-git-repository-using-cargo)\n  - [From Docker Hub](#from-docker-hub)\n  - [Executable file for Windows](#executable-file-for-windows)\n- [Command-Line Reference](#command-line-reference)\n  - [Options](#options)\n  - [Subcommands](#subcommands)\n- [License](#license)\n- [Contribution](#contribution)\n\u003c/details\u003e\n\n## Description\n\nThis 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.\n\n### Preview\n\n#### Image\n\n\u003cimg src=\"./docs/assets/crate-preview.png\" width=\"100%\" alt=\"Preview image\" /\u003e\n\n#### Animation\n\n\u003cimg src=\"./docs/assets/crate-preview.gif\" width=\"100%\" alt=\"Preview animation\" /\u003e\n\n### Features\n\n#### 🚀 Core Features\n\n- **Built-in list of public DNS servers**  \n  Includes popular providers like Google, Cloudflare, Quad9, and more.\n- **Automatic detection of system DNS servers**  \n  Detects and highlights your system's configured DNS servers (Linux, Windows, macOS).\n- **Multi-threaded benchmarking**  \n  Runs benchmarks in parallel for faster results.\n\n#### ⚙️ Configuration \u0026 Flexibility\n\n- **Customizable request count, thread count, timeout, and domain**  \n  Fine-tune how many requests, threads, and which domain to test.\n- **Protocol and IP version selection**  \n  Choose between UDP/TCP and IPv4/IPv6 for both lookup and connection.\n- **Custom DNS server lists**  \n  Use your own list of DNS servers instead of the built-in set.\n\n#### 📊 Output \u0026 Usability\n\n- **Multiple output formats**  \n  Human-readable table, JSON, XML, or CSV for easy integration and analysis.\n- **Configurable table styles**  \n  Choose from various table styles for better readability.\n- **Save favorite configurations**  \n  Store your preferred settings in a config file for quick reuse.\n- **Config file management without running benchmarks**  \n  Use [subcommands](#subcommands) to manage your config independently from benchmarking.\n\n#### 🐳 Platform \u0026 Integration\n\n- **Docker support**  \n  Run easily in a containerized environment (system DNS detection is skipped in Docker).\n- **Cross-platform**  \n  Works on Linux, Windows, and macOS.\n\n### List of built-in DNS servers\n\n\u003ctable\u003e\n\u003ctr\u003e\u003ctd\u003e\n\n- Google Public DNS\n- Cloudflare\n- Quad9\n- ControlD\n- OpenDNS\n- CleanBrowsing\n- AdGuard DNS\n\n\u003c/td\u003e\u003ctd\u003e\n\n- Comodo Secure DNS\n- Level3\n- Verisign\n- DNS.WATCH\n- Norton ConnectSafe\n- SafeDNS\n- NextDNS\n\n\u003c/td\u003e\u003ctd\u003e\n\n- Dyn\n- Hurricane Electric\n- Surfshark DNS\n- SafeServe\n- Vercara UltraDNS Public\n\n\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n## Installation\n\n### Which method to choose?\n\n- If you don't have Rust programming language environment installed on your machine, then you can choose between [installation from Docker Hub](#from-docker-hub) or [download the latest Windows executable file](#executable-file-for-windows).\n- If you have Rust programming language environment installed on your machine, then you can choose between [installation from crates.io](#from-cratesio-using-cargo) or [installation from git repository](#from-git-repository-using-cargo).\n- 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.\n\n### From crates.io using Cargo\n\nRun the following command and wait until the crate is compiled:\n\n```sh\n$ cargo install dns-bench\n```\n\nNow you can run compiled binary:\n\n```sh\n$ dns-bench [OPTIONS]\n```\n\n### From git repository using Cargo\n\nRun the following command and wait until the crate is compiled:\n\n```sh\n$ cargo install --git https://github.com/qwerty541/dns-bench.git --tag v0.11.0 dns-bench\n```\n\nAlso you can remove tag option to install the latest development version.\n\nNow you can run compiled binary:\n\n```sh\n$ dns-bench [OPTIONS]\n```\n\n### From Docker Hub\n\nRun the following command to pull the image:\n\n```sh\n$ docker pull qwerty541/dns-bench:latest\n```\n\nNow you can run this tool inside the container:\n\n```sh\n$ docker run --rm -it --name dns-bench qwerty541/dns-bench:latest\n```\n\nIf you want to pass some options, you can do it like this:\n\n```sh\n$ 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\"\n```\n\nIn 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:\n\n```sh\n$ 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\"\n```\n\n### Executable file for Windows\n\nYou can download the latest Windows executable file from the [releases page](https://github.com/qwerty541/dns-bench/releases/latest).\n\nAfter downloading, open the command line, navigate to the directory where you saved the file, and run it with the following command:\n\n```cmd\ndns-bench.exe [OPTIONS]\n```\n\n\u003e [!WARNING]\n\u003e The Windows executable file is not signed, so you may see a warning when running it. You can ignore this warning if you trust the source of the file. If you want to avoid this warning, you can build the crate from source using Rust programming language environment installed on your machine or use the Docker image as described above.\n\n## Command-Line Reference\n\n### Options\n\nBelow is a list of currently supported options.\n\n\u003ctable\u003e\n    \u003cthead\u003e\n        \u003cth\u003eOption\u003c/th\u003e\n        \u003cth\u003eDescription\u003c/th\u003e\n        \u003cth\u003eDefault value\u003c/th\u003e\n        \u003cth\u003ePossible values\u003c/th\u003e\n    \u003c/thead\u003e\n    \u003ctbody\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003e--domain\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eDomain to resolve.\u003c/td\u003e\n            \u003ctd\u003egoogle.com\u003c/td\u003e\n            \u003ctd\u003eAny domain\u003c/td\u003e\n        \u003c/tr\u003e\n         \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003e--threads\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eNumber of threads to use.\u003c/td\u003e\n            \u003ctd\u003e8\u003c/td\u003e\n            \u003ctd\u003e1..256\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003e--requests\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eNumber of requests to each DNS server.\u003c/td\u003e\n            \u003ctd\u003e25\u003c/td\u003e\n            \u003ctd\u003e1..1000\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003e--timeout\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eTimeout in seconds.\u003c/td\u003e\n            \u003ctd\u003e3\u003c/td\u003e\n            \u003ctd\u003e1..60\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003e--protocol\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eProtocol to use.\u003c/td\u003e\n            \u003ctd\u003eudp\u003c/td\u003e\n            \u003ctd\u003etcp, udp\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003e--name-servers-ip\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eIP version to use for establishing connection.\u003c/td\u003e\n            \u003ctd\u003ev4\u003c/td\u003e\n            \u003ctd\u003ev4, v6\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003e--lookup-ip\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eIP version to use for lookup.\u003c/td\u003e\n            \u003ctd\u003ev4\u003c/td\u003e\n            \u003ctd\u003ev4, v6\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003e--style\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eTable style to use.\u003c/td\u003e\n            \u003ctd\u003erounded\u003c/td\u003e\n            \u003ctd\u003eempty, blank, ascii, psql, markdown, modern, sharp, rounded, modern-rounded, extended, dots, re-structured-text, ascii-rounded\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003e--save-config\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eSave the configurations to a file in users home directory.\u003c/td\u003e\n            \u003ctd\u003e\u003c/td\u003e\n            \u003ctd\u003e\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003e--custom-servers-file\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eProvide a path to a file with custom servers list to use instead of built-in list. An example of file format can be found \u003ca href=\"./examples/ipv4-custom-servers-example.txt\"\u003ehere for IPv4\u003c/a\u003e and \u003ca href=\"./examples/ipv6-custom-servers-example.txt\"\u003ehere for IPv6\u003c/a\u003e.\u003c/td\u003e\n            \u003ctd\u003e\u003c/td\u003e\n            \u003ctd\u003e\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003e--format\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eFormat of the output.\u003c/td\u003e\n            \u003ctd\u003ehuman-readable\u003c/td\u003e\n            \u003ctd\u003ehuman-readable, json, xml, csv\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003e--skip-system-servers\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eSkip auto-detection of system DNS servers.\u003c/td\u003e\n            \u003ctd\u003e\u003c/td\u003e\n            \u003ctd\u003e\u003c/td\u003e\n        \u003c/tr\u003e\n    \u003c/tbody\u003e\n\u003c/table\u003e\n\n### Subcommands\n\nBelow is a list of currently supported subcommands.\n\n\u003ctable\u003e\n    \u003cthead\u003e\n        \u003cth\u003eSubcommand\u003c/th\u003e\n        \u003cth\u003eDescription\u003c/th\u003e\n    \u003c/thead\u003e\n    \u003ctbody\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003edns-bench config init\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eCreate a config file with default values if it does not exist.\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003edns-bench config set [--key value ...]\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eSet one or more config values. Supports all options listed above.\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003edns-bench config reset\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eReset config file to default values.\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003ccode\u003edns-bench config delete\u003c/code\u003e\u003c/td\u003e\n            \u003ctd\u003eDelete config file.\u003c/td\u003e\n        \u003c/tr\u003e\n    \u003c/tbody\u003e\n\u003c/table\u003e\n\n## License\n\nLicensed under either of\n\n-   Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or https://www.apache.org/licenses/LICENSE-2.0)\n-   MIT license ([LICENSE-MIT](LICENSE-MIT) or https://opensource.org/licenses/MIT)\n\nat your option.\n\n## Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally\nsubmitted for inclusion in the work by you, as defined in the Apache-2.0\nlicense, shall be dual licensed as above, without any additional terms or\nconditions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqwerty541%2Fdns-bench","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqwerty541%2Fdns-bench","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqwerty541%2Fdns-bench/lists"}