
# dnstracer

`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.

## Features

- 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.

## Installation

### Requirements

- [Rust](https://www.rust-lang.org/tools/install) (version 1.XX or higher)
- Cargo (Rust's package manager)

### Installing dnstracer

Clone the repository and build the project using `cargo`:

```bash
cargo install dnstracer
```

### Running

Once built, you can run `dnstracer-rs` from the target directory:

```bash
dnstracer [options] <domain>
```

### Example

```bash
dnstracer example.com
```

This will trace the DNS delegation for the domain `example.com`, showing the path of DNS servers involved in the resolution.

## Usage

```bash
dnstracer [OPTIONS] <domain>
```

### Options

- `-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: .]
- `-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

## Output

`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.

### Sample Output

```text
$ 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
```

## Contributing

1. Fork the repository.
2. Create a new branch (`git checkout -b feature/your-feature`).
3. Commit your changes (`git commit -am 'Add some feature'`).
4. Push to the branch (`git push origin feature/your-feature`).
5. Create a pull request.

## License

This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details.
