{"id":18719455,"url":"https://github.com/dkorunic/dnstrace","last_synced_at":"2025-07-11T11:35:48.492Z","repository":{"id":57483654,"uuid":"187997285","full_name":"dkorunic/dnstrace","owner":"dkorunic","description":"Yet another DNS query tracing/analysis tool written in Go","archived":false,"fork":false,"pushed_at":"2025-06-06T07:29:47.000Z","size":253,"stargazers_count":47,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-06-06T08:29:19.206Z","etag":null,"topics":["authoritative","cache","devops","dns","performance","query","sysadmin","sysops"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dkorunic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-05-22T08:35:23.000Z","updated_at":"2025-06-06T07:29:40.000Z","dependencies_parsed_at":"2024-06-20T11:15:38.637Z","dependency_job_id":"fb041a5d-07be-4f3e-b85c-3b03194e6c63","html_url":"https://github.com/dkorunic/dnstrace","commit_stats":null,"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/dkorunic/dnstrace","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dkorunic%2Fdnstrace","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dkorunic%2Fdnstrace/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dkorunic%2Fdnstrace/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dkorunic%2Fdnstrace/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dkorunic","download_url":"https://codeload.github.com/dkorunic/dnstrace/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dkorunic%2Fdnstrace/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264795839,"owners_count":23665241,"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","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":["authoritative","cache","devops","dns","performance","query","sysadmin","sysops"],"created_at":"2024-11-07T13:26:08.833Z","updated_at":"2025-07-11T11:35:48.465Z","avatar_url":"https://github.com/dkorunic.png","language":"Go","readme":"# dnstrace\n\n[![GitHub license](https://img.shields.io/github/license/dkorunic/dnstrace.svg)](https://github.com/dkorunic/dnstrace/blob/master/LICENSE.txt)\n[![GitHub release](https://img.shields.io/github/release/dkorunic/dnstrace.svg)](https://github.com/dkorunic/dnstrace/releases/latest)\n[![Build Status](https://travis-ci.org/dkorunic/dnstrace.svg)](https://travis-ci.org/dkorunic/dnstrace)\n[![Go Report Card](https://goreportcard.com/badge/github.com/dkorunic/dnstrace)](https://goreportcard.com/report/github.com/dkorunic/dnstrace)\n\n## About\n\n`dnstrace` is yet another DNS query/response tracing tool. Its purpose is to emulate iterative (with RD flag being unset) DNS queries usually being sent from any DNS recursor and traverse DNS authoritative hierarchy in search for the given query name and query type, assuming IN class. It will display every query and response, indicating reasons (delegations, CNAME following, missing glue etc.) for any new sub-query and additionally displaying individual and total response time.\n\nEDNS is supported (with 4096 message payload size), as well as TCP failover in case of UDP communication issues (truncated messages and/or timeouts). When using EDNS it is also possible to manually (or automatically through [Ipify](https://www.ipify.org/)) specify Client-Subnet option to test for Geo-aware DNS responses.\n\nIt is also possible to set Recursion Desired flag which essentially disables DNS tracing and relies on local resolver (from `/etc/resolver.conf`) or remote DNS cache/resolver to perform all iterative queries and return the final result.\n\n![Demo](demo.gif)\n\n## Installation\n\nThere are two ways of installing `dnstrace`:\n\n### Manual\n\nDownload your preferred flavor from [the releases](https://github.com/dkorunic/dnstrace/releases/latest) page and install manually.\n\n### Using go get\n\n```shell\ngo install github.com/dkorunic/dnstrace@latest\n```\n\n## Usage\n\nUsage:\n\n```shell\n\nUsage: ./dnstrace [option] [qtype] qname [@server]\nOptions:\n  -client string\n    \tSends EDNS Client Subnet option with specified IP address\n  -edns\n    \tEnable EDNS support in queries (default true)\n  -fallback\n    \tFallback to 4K UDP message buffer size and then to TCP (default true)\n  -ignoresub\n    \tIgnore tracing sub-requests when missing glue\n  -port int\n    \tUse to send DNS queries to non-standard ports (default 53)\n  -recurse\n    \tToggle RD (recursion desired) flag in queries\n  -tcp\n    \tUse TCP when querying DNS servers\n\nNB: Nameserver (@server) will be ignored if not using recurse flag and random root nameserver will be used instead.\nClient option (-client) accepts \"external\" keyword and will use ipify.org to get your public IP.  When using recurse (-recurse)\nflag, if nameserver is not specified (@server), system resolver (from /etc/resolv.conf) will be used.  All boolean flags\naccept true or false arguments, for instance \"-edns=false\"\n\nThis tool is typically used to establish worst-case scenario RTT for iterative queries being sent from resolvers and\ndoesn't necessarily reflect real life.\n```\n\nTypical use case is to specify one or more **qtypes** (MX, A, NS etc.) and one or more **qnames** (for example `apple.com`, `www.google.com`, etc.). When there is no qtype specified, A is assumed. If temporary result is CNAME and qtype is A, `dnstrace` will attempt to follow CNAME to the target. Internet **qclass** (IN) is assumed at all times.\n\nIt is possible to override default flag values by specifiying values, for example `-edns=false` or `-client=8.8.8.8`.\n\nTypical use case would be:\n\n```shell\ndnstrace a porn.xxx\n```\n\nThen we are not interested in seeing sub-queries being sent to resolve missing glue for NS delegations, `-ignoresub` flag can be used.\n\n## Bugs, feature requests, etc.\n\nPlease open a PR or report an issue. Thanks!\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdkorunic%2Fdnstrace","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdkorunic%2Fdnstrace","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdkorunic%2Fdnstrace/lists"}