doggo

面向人类的命令行 DNS 客户端。用 Golang 编写。『🐶 Command-line DNS Client for Humans. Written in Golang』

  • Owner: mr-karan/doggo
  • Platform: Linux,Mac,Windows
  • License:: GNU General Public License v3.0
  • Category::
  • Topic:
  • Like:
    0
      Compare:

Github stars Tracking Chart


doggo is a modern command-line DNS client (like dig) written in Golang. It outputs information in a neat concise manner and supports protocols like DoH, DoT and DNSCrypt as well.

It's totally inspired from dog which is written in Rust. I wanted to add some features to it but since I don't know Rust, I found it as a nice opportunity
to experiment with writing a DNS Client from scratch in Go myself. Hence the name dog +go => doggo.

Features

  • Human readable output - supports colors and tabular format.
  • Supports JSON format - can be useful while writing scripts.
  • Has support for multiple transport protocols:
    • DNS over HTTPS (DoH)
    • DNS over TLS (DoT)
    • DNS over TCP
    • DNS over UDP
    • DNS over DNSCrypt
  • Supports ndots and search configurations from resolv.conf or command-line arguments.
  • Supports multiple resolvers at once.
  • Supports IPv4 and IPv6 both.
  • Available as a web tool as well: https://doggo.mrkaran.dev.
  • Shell completions for zsh and fish.

Installation

Binary

You can grab the latest binaries for Linux, MacOS and Windows from the Releases section.

For eg, to pull the latest linux-amd64 binary:

$ cd "$(mktemp -d)"
$ curl -sL "https://github.com/mr-karan/doggo/releases/download/v0.3.7/doggo_0.3.7_linux_amd64.tar.gz", tar xz
$ mv doggo /usr/local/bin
# doggo should be available now in your $PATH
$ doggo

Docker

Images are hosted on Github Container Registry (ghcr.io).
You can view all the tags here. It even supports ARM so you can spin up a container on your RPi to do DNS lookups, cause why not.

Pull

docker pull ghcr.io/mr-karan/doggo:latest

Running

You can supply all arguments to the CLI directly to docker run command. Eg:

docker run ghcr.io/mr-karan/doggo:latest mrkaran.dev @1.1.1.1 MX

Using snap

Get it from the Snap Store

$ sudo snap install doggo

NOTE: Since the confinement mode is strict as of now, it cannot access your host's /etc/resolv.conf.
I'll be making a request in the Snap forums soon so that it can be manually reviewed and allowed to use --classic. Until then, please specify a nameserver manually
if using snap.

From Source

You need to have go installed in your system.

$ go get github.com/mr-karan/doggo/cmd/doggo
$ mv $GOPATH/bin/cli $GOPATH/bin/doggo 

The binary will be available at $GOPATH/bin/doggo.

Usage Examples

Do a simple DNS Lookup for mrkaran.dev

$ doggo mrkaran.dev                                                                         
NAME            TYPE    CLASS   TTL     ADDRESS         NAMESERVER   
mrkaran.dev.    A       IN      20s     13.250.205.9    127.0.0.1:53
mrkaran.dev.    A       IN      20s     206.189.89.118  127.0.0.1:53

Query MX records for github.com using 9.9.9.9 resolver

doggo MX github.com @9.9.9.9
NAME            TYPE    CLASS   TTL     ADDRESS                         NAMESERVER 
github.com.     MX      IN      3600s   10 alt3.aspmx.l.google.com.     9.9.9.9:53
github.com.     MX      IN      3600s   5 alt1.aspmx.l.google.com.      9.9.9.9:53
github.com.     MX      IN      3600s   10 alt4.aspmx.l.google.com.     9.9.9.9:53
github.com.     MX      IN      3600s   5 alt2.aspmx.l.google.com.      9.9.9.9:53
github.com.     MX      IN      3600s   1 aspmx.l.google.com.           9.9.9.9:53

or using named parameters:

$ doggo -t MX -n 9.9.9.9 github.com
NAME            TYPE    CLASS   TTL     ADDRESS                         NAMESERVER 
github.com.     MX      IN      3600s   10 alt3.aspmx.l.google.com.     9.9.9.9:53
github.com.     MX      IN      3600s   5 alt1.aspmx.l.google.com.      9.9.9.9:53
github.com.     MX      IN      3600s   10 alt4.aspmx.l.google.com.     9.9.9.9:53
github.com.     MX      IN      3600s   5 alt2.aspmx.l.google.com.      9.9.9.9:53
github.com.     MX      IN      3600s   1 aspmx.l.google.com.           9.9.9.9:53

Query DNS records for archive.org using Cloudflare DoH resolver

$ doggo archive.org @https://cloudflare-dns.com/dns-query 
NAME            TYPE    CLASS   TTL     ADDRESS         NAMESERVER                           
archive.org.    A       IN      41s     207.241.224.2   https://cloudflare-dns.com/dns-query

Query DNS records for internetfreedom.in with JSON output

$ doggo internetfreedom.in --json, jq
{
  "responses": {
    "answers": [
      {
        "name": "internetfreedom.in.",
        "type": "A",
        "class": "IN",
        "ttl": "22s",
        "address": "104.27.158.96",
        "rtt": "37ms",
        "nameserver": "127.0.0.1:53"
      },
      {
        "name": "internetfreedom.in.",
        "type": "A",
        "class": "IN",
        "ttl": "22s",
        "address": "104.27.159.96",
        "rtt": "37ms",
        "nameserver": "127.0.0.1:53"
      },
      {
        "name": "internetfreedom.in.",
        "type": "A",
        "class": "IN",
        "ttl": "22s",
        "address": "172.67.202.77",
        "rtt": "37ms",
        "nameserver": "127.0.0.1:53"
      }
    ],
    "queries": [
      {
        "name": "internetfreedom.in.",
        "type": "A",
        "class": "IN"
      }
    ]
  }
}

Query DNS records for duckduckgo.com and show RTT (Round Trip Time)

$ doggo duckduckgo.com --time                
NAME            TYPE    CLASS   TTL     ADDRESS         NAMESERVER      TIME TAKEN 
duckduckgo.com. A       IN      30s     40.81.94.43     127.0.0.1:53    45ms      

Command-line Arguments

Transport Options

URL scheme of the server is used to identify which resolver to use for lookups. If no scheme is specified, defaults to udp.

  @udp://        eg: @1.1.1.1 initiates a UDP resolver for 1.1.1.1:53.
  @tcp://        eg: @1.1.1.1 initiates a TCP resolver for 1.1.1.1:53.
  @https://      eg: @https://cloudflare-dns.com/dns-query initiates a DOH resolver for Cloudflare DoH server.
  @tls://        eg: @1.1.1.1 initiates a DoT resolver for 1.1.1.1:853.
  @sdns://       eg: @sdns://AgcAAAAAAAAABzEuMC4wLjEAEmRucy5jbG91ZGZsYXJlLmNvbQovZG5zLXF1ZXJ5
                 initiates a DNSCrypt or DoH resolver using its DNS stamp.

Query Options

  -q, --query=HOSTNAME        Hostname to query the DNS records for (eg mrkaran.dev).
  -t, --type=TYPE             Type of the DNS Record (A, MX, NS etc).
  -n, --nameserver=ADDR       Address of a specific nameserver to send queries to (9.9.9.9, 8.8.8.8 etc).
  -c, --class=CLASS           Network class of the DNS record (IN, CH, HS etc).

Resolver Options

  --ndots=INT        Specify ndots parameter. Takes value from /etc/resolv.conf if using the system nameserver or 1 otherwise.
  --search           Use the search list defined in resolv.conf. Defaults to true. Set --search=false to disable search list.
  --timeout          Specify timeout (in seconds) for the resolver to return a response.
  -4 --ipv4          Use IPv4 only.
  -6 --ipv6          Use IPv6 only.

Output Options

  -J, --json                  Format the output as JSON.
  --color                     Defaults to true. Set --color=false to disable colored output.
  --debug                     Enable debug logging.
  --time                      Shows how long the response took from the server.

Contributing

I'm open to accept feature requests and/or issues. I understand doggo is a new DNS Client in the town and there might be some edge cases I am not handling.
Please feel free to open issues if you ever come across such a case.
For now I am focussing more on planned features for a stable v1.0 release soon.

License

LICENSE

Main metrics

Overview
Name With Ownermr-karan/doggo
Primary LanguageGo
Program languageMakefile (Language Count: 7)
Platform
License:GNU General Public License v3.0
所有者活动
Created At2020-12-09 05:07:07
Pushed At2025-06-01 03:40:58
Last Commit At
Release Count34
Last Release Namev1.0.5 (Posted on )
First Release Namev0.1.0 (Posted on )
用户参与
Stargazers Count3.6k
Watchers Count20
Fork Count121
Commits Count193
Has Issues Enabled
Issues Count88
Issue Open Count29
Pull Requests Count53
Pull Requests Open Count15
Pull Requests Close Count37
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private