dnstracer
is a Rust-based implementation of dnstracer
, a DNS tracing tool that follows the chain of DNS servers responsible for resolving a domain name. It helps trace the delegation path from the root DNS servers down to the authoritative servers for a specific domain.
- Traces DNS delegation paths for domain names.
- Supports both IPv4 and IPv6 addresses.
- Allows specifying custom DNS query types.
- Handles recursive and authoritative DNS queries.
- Provides detailed output of DNS servers and records.
- Rust (version 1.XX or higher)
- Cargo (Rust's package manager)
Clone the repository and build the project using cargo
:
cargo install dnstracer
Once built, you can run dnstracer-rs
from the target directory:
dnstracer [options] <domain>
dnstracer example.com
This will trace the DNS delegation for the domain example.com
, showing the path of DNS servers involved in the resolution.
dnstracer [OPTIONS] <domain>
-c
,--no-positive-cache
- disable positive response caching, default enabled
-C
,--negative-cache
- enable negative response caching, default disabled
-e
,--edns0
- disable EDNS0, default enabled
-o
,--overview
- enable overview of received answers, default disabled
-q
,--query-type <QUERY_TYPE>
- The type of record (A, AAAA, NS ...) [default: A]
-r
,--retries <RETRIES>
- amount of retries for DNS requests, default 3 [default: 3]
-s
,--server <SERVER>
- Start the query at the given DNS server (IP or hostname) If
.
is specified, A.ROOT-SERVERS.NET will be used [default: .]
- Start the query at the given DNS server (IP or hostname) If
-t
,--timeout <TIMEOUT>
- Limit time to wait per try [default: 5]
-S
,--source-address <SOURCE_ADDRESS>
- use this source address
-6
,--ipv6
- Force using IPv6 for DNS queries (no IPv4)
-4
,--ipv4
- Force using IPv4 for DNS queries (no IPv6)
-T
,--tcp
- Force using TCP for DNS queries
-h
,--help
- Print help
-V
,--version
- Print version
dnstracer
provides detailed output for each DNS server in the delegation chain:
- The IP address and name of each DNS server.
- Whether the response is authoritative or not.
- The DNS records associated with the query.
$ dnstracer www.example.com -o
Tracing to www.example.com[A] via A.ROOT-SERVERS.NET. (198.41.0.4), maximum of 3 retries
A.ROOT-SERVERS.NET. [.] (198.41.0.4)
|\___ a.gtld-servers.net. [com] (192.5.6.30)
| |\___ ns1.example.com. [example.com] (192.0.2.1) found authoritative answer
| |\___ ns2.example.com. [example.com] (198.51.100.1) found authoritative answer
| \___ ns2.example.com. [example.com] (2001:db8::1) found authoritative answer
|\___ a.gtld-servers.net. [com] (2001:503:a83e::2:30)
| |\___ ns1.example.com. [example.com] (192.0.2.1) (cached)
| |\___ ns2.example.com. [example.com] (198.51.100.1) (cached)
| \___ ns2.example.com. [example.com] (2001:db8::1) (cached)
|\___ b.gtld-servers.net. [com] (192.33.14.30)
...
ns1.example.com. (192.0.2.1) www.example.com. 86400 IN A 203.0.113.1
ns2.example.com. (198.51.100.1) www.example.com. 86400 IN A 203.0.113.1
ns2.example.com. (2001:db8::1) www.example.com. 86400 IN A 203.0.113.1
- Fork the repository.
- Create a new branch (
git checkout -b feature/your-feature
). - Commit your changes (
git commit -am 'Add some feature'
). - Push to the branch (
git push origin feature/your-feature
). - Create a pull request.
This project is licensed under the MIT License. See the LICENSE file for more details.