🐶 Command-line DNS Client for Humans. Written in Golang


doggo

🐶 Command-line DNS client for humans

doggo CLI usage


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 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
  • Supports ndots and search configurations from resolv.conf or command-line arguments.
  • Supports multiple resolvers at once.
  • Supports IPv4 and IPv6 both.

Installation

Binary

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

For eg, to pull the latest Linux binary:

$ cd "$(mktemp -d)"
$ curl -sL "https://github.com/mr-karan/doggo/releases/download/v0.2.0/doggo_0.2.0_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

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.

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

Owner
Karan Sharma
All things web, containers, K8s, and monitoring!
Karan Sharma
Comments
  • clarification needed, or maybe bug - ndot ignored

    clarification needed, or maybe bug - ndot ignored

    First of all, thank you for doggo 🐶

    While running some tests on effect of NDOTS option in K8s pods, I've noticed a weirdness with doggo (v0.2.0 (4e5b074 2020-12-24T16:33:29Z))

    The debug output suggested the ndots cli settings was ignored

    # doggo --search --ndots=15 --debug -q qa-app-api.corp-qa.svc.cluster.local
    DEBUG[2021-02-05T12:50:28Z] initiating UDP resolver
    DEBUG[2021-02-05T12:50:28Z] Starting doggo 🐶
    DEBUG[2021-02-05T12:50:28Z] Attempting to resolve  domain=qa-app-api.corp-qa.svc.cluster.local. nameserver="10.96.0.10:53" ndots=0
    NAME                                  	TYPE	CLASS	TTL	ADDRESS      	NAMESERVER
    qa-app-api.corp-qa.svc.cluster.local.	A   	IN   	30s	10.108.49.117	10.96.0.10:53
    

    I've expected to see doggo use the query as is, without adding a dot (what dig does). And then how it iterates over search domains from /etc/resolv.conf until it exhausts all possibilities and returns NXDOMAIN or succeeds.

    Something like this

    dig +noall +showsearch +question +answer +search +ndots=15 @10.96.0.10 qa-app-api.corp-qa.svc.cluster.local
    ;qa-app-api.corp-qa.svc.cluster.local.corp-qa.svc.cluster.local. IN A
    ;qa-app-api.corp-qa.svc.cluster.local.svc.cluster.local. IN A
    ;qa-app-api.corp-qa.svc.cluster.local.cluster.local. IN	A
    ;qa-app-api.corp-qa.svc.cluster.local.dev.example.com.	IN A
    ;qa-app-api.corp-qa.svc.cluster.local.prod.example.com. IN A
    ;qa-app-api.corp-qa.svc.cluster.local. IN A
    qa-app-api.corp-qa.svc.cluster.local. 30 IN A	10.108.49.117
    

    Perhaps I'm using it wrong? Please clarify.

  • Packing doggo for Nix

    Packing doggo for Nix

    Hi,

    I recently needed to use doggo but could not find it for Nix(OS). I therefore created a Nix package and opened a pull request for it on Nixpkgs. I just wanted to share this here in case someone will participate in it.

  • doggo does not build van Apple M1 monterey using golang 1.18

    doggo does not build van Apple M1 monterey using golang 1.18

    The problem reported when installing: go install github.com/mr-karan/doggo/cmd/doggo@latest go: downloading github.com/mr-karan/doggo v0.5.0 go: downloading github.com/fatih/color v1.10.0 go: downloading github.com/miekg/dns v1.1.40 go: downloading github.com/knadh/koanf v0.14.0 go: downloading github.com/sirupsen/logrus v1.7.0 go: downloading github.com/spf13/pflag v1.0.5 go: downloading github.com/ameshkov/dnsstamps v1.0.3 go: downloading github.com/olekukonko/tablewriter v0.0.4 go: downloading github.com/ameshkov/dnscrypt/v2 v2.2.1 go: downloading github.com/lucas-clemente/quic-go v0.24.0 go: downloading github.com/mattn/go-isatty v0.0.12 go: downloading github.com/mattn/go-colorable v0.1.8 go: downloading github.com/mattn/go-runewidth v0.0.9 go: downloading golang.org/x/sys v0.0.0-20210510120138-977fb7262007 go: downloading golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 go: downloading golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 go: downloading github.com/mitchellh/mapstructure v1.2.2 go: downloading github.com/AdguardTeam/golibs v0.4.2 go: downloading github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da go: downloading github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 go: downloading github.com/cheekybits/genny v1.0.0 go: downloading github.com/marten-seemann/qtls-go1-17 v0.1.0

    github.com/lucas-clemente/quic-go/internal/qtls

    go/pkg/mod/github.com/lucas-clemente/[email protected]/internal/qtls/go118.go:6:13: cannot use "quic-go doesn't build on Go 1.18 yet." (untyped string constant) as int value in variable declaration

  • doggo should only query one resolver by default

    doggo should only query one resolver by default

    When your operating system is using multiple resolvers, doggo sends the query to all of them and shows the result for each resolver. This makes simple, quick hostname lookups much harder to read because the output is basically duplicated.

    For example in my network the same nameserver can be reached over IPv4 and IPv6, so I always get two rows for each DNS record. This makes doggo uncomfortable to use.

    I think doggo should only use one resolver unless I explicitly pass arguments to doggo telling it to use multiple resolvers.

  • Hostname verification over TLS

    Hostname verification over TLS

    Hi,

    Just came across this doggo after looking for a way to do DoT lookups, looks neat and appreciate the colored formatting, nice work.

    I want to do a lookup with a couple of specific nameservers but it requires tls hostname verification.

    doggo google.se @tls://193.19.108.3
    ERROR[2021-08-25T16:45:40+02:00] error looking up DNS records 
    error="x509: cannot validate certificate for 193.19.108.3 because it doesn't contain any IP SANs"
    

    Is there a way we can pass the expected hostname of the dns resolver like adblock.doh.mullvad.net for verification? If I use doggo google.se @tls://adblock.doh.mullvad.net, the lookup succeeds but then I do not know which of mullvad's servers responded (there are 2 nameservers listed under adblock.doh.mullvad.net) and I want to be able to test them individually.

  • Feature request: need option to specific ip of DoH

    Feature request: need option to specific ip of DoH

    If i query to https://cloudflare-dns.com/dns-query. Is it possible to specific ip for cloudflare-dns.com to some xxx.xxx.xxx.xxx ip? In https://github.com/ameshkov/dnslookup have feture to specific ip for it. It's really good to have this feature in some use case.

  • Fails to build with current Go versions:

    Fails to build with current Go versions:

    vendor/github.com/lucas-clemente/quic-go/internal/qtls/go118.go:6:13: cannot use "quic-go doesn't build on Go 1.18 yet." (untyped string constant) as int value in variable declaration
    

    OS: FreeBSD 13

  • Refactor web frontend and remove unnecessary dependencies.

    Refactor web frontend and remove unnecessary dependencies.

    • Eliminate frontend JS build step completely: (remove dep: NodeJS, npx, tailwind, postcss, autoprefixer)

    • Declutter and cleanup index.html (8.49 KB to 3.4 KB) = ~60% savings.

    • Replace tailwind with custom CSS (10.64 KB to 1.96 KB) = ~81% savings.

    • Remove Google font (~100 KB) as there is very little text on the page.

    • Refactor and cleanup main.js and remove tailwind styling logic. (2.82 KB to 1.12 KB) = ~60% savings.

    • Net static asset reduction = 21.95 KB to 6.48 KB = ~70% savings apart from the 100+ KB elimination of Google fonts.

    The update looks like this:

    image

    image

  • Exit codes on resolve errors

    Exit codes on resolve errors

    Currently doggo doesn't provide any error exit code when it can't reach any resolver:

    https://github.com/mr-karan/doggo/blob/0da9178683b435abf80d5e2a229cd8d30a0f64fc/cmd/doggo/cli.go#L150-L164

    This would be really useful not only to indicate to shell integrations, that the command failed, but also when using doggo in any kind of script, to allow error handling.

    dig for example returns an exit code 9, when trying to query 127.0.0.1 and no DNS server is available. doggo returns 0 when running: podman run --rm -it ghcr.io/mr-karan/doggo:latest mrkaran.dev @127.0.0.1 same as run ghcr.io/mr-karan/doggo:latest mrkaran.dev @9.9.9.9, while the former fails, the latter is successful.

    So I wonder what would be the expectation for this feature? Should it mimic dig exit codes? Should it just be 2 like many other errors? Should it stay as it is?

  • Parsing issue in Windows Terminal + PowerShell

    Parsing issue in Windows Terminal + PowerShell

    There seems to be an issue with the parsing of the DNS server @...:

    PS C:\Users\yop> doggo google.com
    NAME            TYPE    CLASS   TTL     ADDRESS         NAMESERVER
    google.com.     A       IN      300s    142.250.179.110 192.168.10.3:53
    
    PS C:\Users\yop> doggo google.com @1.1.1.1
    ParserError:
    Line |
       1 |  doggo google.com @1.1.1.1
         |                      ~
         | Missing property name after reference operator.
    
    PS C:\Users\yop> doggo google.com "@1.1.1.1"
    NAME            TYPE    CLASS   TTL     ADDRESS         NAMESERVER
    google.com.     A       IN      264s    142.250.179.78  1.1.1.1:53
    
  • doggo cannt work well on wsl1

    doggo cannt work well on wsl1

    I installed doggo on wsl1, and this is the output when using doggo.

    > doggo baidu.com
    ERROR[2020-12-22T17:22:44+08:00] error looking up DNS records                  error="read udp [2001:0:2851:b9f0:2444:b43f:496b:c4f4]:54677->[fec0:0:0:ffff::1]:53: i/o timeout"
    
  • zsh completion is broken

    zsh completion is broken

    when press TAB, it shows

    _arguments:comparguments:327: invalid argument: {--color}[Defaults to true. Set --color=false to disable colored output]:(setting):(true false)

    not the right completion

  • Feature request(?): config var/file

    Feature request(?): config var/file

    Is there an existing facility to specify different defaults for command line options, either via config file (in XDG user dirs or otherwise) or via environment variable? For instance, I'd like to turn off color and use the random strategy by default on every query.

  • Feature request: trace

    Feature request: trace

    When explaining some aspects of DNS resolution, I noted that dig 9.10.6 has the following query option:

    +[no]trace

    Toggle tracing of the delegation path from the root name servers for the name being looked up. Tracing is disabled by default. When tracing is enabled, dig makes iterative queries to resolve the name being looked up. It will follow referrals from the root servers, showing the answer from each server that was used to resolve the lookup.

    If @server is also specified, it affects only the initial query for the root zone name servers.

    I found this pretty handy for investigating some configurations — I'd love to see an equivalent feature in doggo.

    The dig version's behaviour:

    $ dig github.com +trace +nodnssec @1.1.1.1
    
    ; <<>> DiG 9.10.6 <<>> github.com +trace +nodnssec @1.1.1.1
    ;; global options: +cmd
    .			514951	IN	NS	a.root-servers.net.
    .			514951	IN	NS	b.root-servers.net.
    .			514951	IN	NS	c.root-servers.net.
    .			514951	IN	NS	d.root-servers.net.
    .			514951	IN	NS	e.root-servers.net.
    .			514951	IN	NS	f.root-servers.net.
    .			514951	IN	NS	g.root-servers.net.
    .			514951	IN	NS	h.root-servers.net.
    .			514951	IN	NS	i.root-servers.net.
    .			514951	IN	NS	j.root-servers.net.
    .			514951	IN	NS	k.root-servers.net.
    .			514951	IN	NS	l.root-servers.net.
    .			514951	IN	NS	m.root-servers.net.
    ;; Received 811 bytes from 1.1.1.1#53(1.1.1.1) in 54 ms
    
    com.			172800	IN	NS	l.gtld-servers.net.
    com.			172800	IN	NS	b.gtld-servers.net.
    com.			172800	IN	NS	c.gtld-servers.net.
    com.			172800	IN	NS	d.gtld-servers.net.
    com.			172800	IN	NS	e.gtld-servers.net.
    com.			172800	IN	NS	f.gtld-servers.net.
    com.			172800	IN	NS	g.gtld-servers.net.
    com.			172800	IN	NS	a.gtld-servers.net.
    com.			172800	IN	NS	h.gtld-servers.net.
    com.			172800	IN	NS	i.gtld-servers.net.
    com.			172800	IN	NS	j.gtld-servers.net.
    com.			172800	IN	NS	k.gtld-servers.net.
    com.			172800	IN	NS	m.gtld-servers.net.
    ;; Received 835 bytes from 192.5.5.241#53(f.root-servers.net) in 4 ms
    
    github.com.		172800	IN	NS	ns-520.awsdns-01.net.
    github.com.		172800	IN	NS	ns-421.awsdns-52.com.
    github.com.		172800	IN	NS	ns-1707.awsdns-21.co.uk.
    github.com.		172800	IN	NS	ns-1283.awsdns-32.org.
    github.com.		172800	IN	NS	dns1.p08.nsone.net.
    github.com.		172800	IN	NS	dns2.p08.nsone.net.
    github.com.		172800	IN	NS	dns3.p08.nsone.net.
    github.com.		172800	IN	NS	dns4.p08.nsone.net.
    ;; Received 278 bytes from 192.26.92.30#53(c.gtld-servers.net) in 173 ms
    
    github.com.		60	IN	A	20.248.137.48
    github.com.		900	IN	NS	dns1.p08.nsone.net.
    github.com.		900	IN	NS	dns2.p08.nsone.net.
    github.com.		900	IN	NS	dns3.p08.nsone.net.
    github.com.		900	IN	NS	dns4.p08.nsone.net.
    github.com.		900	IN	NS	ns-1283.awsdns-32.org.
    github.com.		900	IN	NS	ns-1707.awsdns-21.co.uk.
    github.com.		900	IN	NS	ns-421.awsdns-52.com.
    github.com.		900	IN	NS	ns-520.awsdns-01.net.
    ;; Received 278 bytes from 205.251.193.165#53(ns-421.awsdns-52.com) in 14 ms
    
  • doggo supports osx scoped queries on accident, but doesn't report correctly

    doggo supports osx scoped queries on accident, but doesn't report correctly

    I use OSX's DNS configuration for scoped queries. I use this so my work-related private/internal domains are resolved using DNS servers in our infrastructure, but the rest of the internet is resolved using the "normal" resolvers.

    It looks like doggo is doing a lookup that respects the scoped query functionality in osx, but it's happening transparently and causing doggo to "lie" about the origin of the answer. This suggests that resolver-specific queries are leaking to other resolvers silently.

    doggo reports that the normal resolvers are answering for domains that should be responding with NXDOMAIN, and don't list the resolver for the scoped query at all:

    > doggo -t cname logikal.test.record.foo.tld
    NAME                                          	TYPE 	CLASS	TTL	ADDRESS                                                                	NAMESERVER
    logikal.test.record.foo.tld	CNAME	IN   	30s	lb-name-abcd1234-1234567890.us-east-1.elb.amazonaws.com.	192.168.1.87:53
    logikal.test.record.foo.tld	CNAME	IN   	30s	lb-name-abcd1234-1234567890.us-east-1.elb.amazonaws.com.	192.168.1.1:53
    logikal.test.record.foo.tld	CNAME	IN   	30s	lb-name-abcd1234-1234567890.us-east-1.elb.amazonaws.com.	8.8.8.8:53
    logikal.test.record.foo.tld	CNAME	IN   	30s	lb-name-abcd1234-1234567890.us-east-1.elb.amazonaws.com.	1.1.1.1:53
    
    # those resolvers all actually report NXDOMAIN for the record
    > doggo @udp://8.8.8.8 -t cname sean.test.record.foo.tld
    NAME           	TYPE	CLASS	TTL 	ADDRESS                       	NAMESERVER	STATUS
    foo.tld.	SOA 	IN   	900s	ns-1371.awsdns-43.org.        	8.8.8.8:53	NXDOMAIN
                   	    	     	    	awsdns-hostmaster.amazon.com.
                   	    	     	    	1 7200 900 1209600 86400
    
    > doggo @udp://192.168.1.87 -t cname logikal.test.record.foo.tld
    NAME           	TYPE	CLASS	TTL 	ADDRESS                       	NAMESERVER     	STATUS
    foo.tld.	SOA 	IN   	900s	ns-1371.awsdns-43.org.        	192.168.1.87:53	NXDOMAIN
                   	    	     	    	awsdns-hostmaster.amazon.com.
                   	    	     	    	1 7200 900 1209600 86400
    
    > doggo @udp://1.1.1.1 -t cname logikal.test.record.foo.tld
    NAME           	TYPE	CLASS	TTL 	ADDRESS                       	NAMESERVER	STATUS
    foo.tld.	SOA 	IN   	900s	ns-1371.awsdns-43.org.        	1.1.1.1:53	NXDOMAIN
                   	    	     	    	awsdns-hostmaster.amazon.com.
                   	    	     	    	1 7200 900 1209600 86400
    
    > doggo @udp://192.168.1.1 -t cname logikal.test.record.foo.tld
    NAME           	TYPE	CLASS	TTL 	ADDRESS                       	NAMESERVER    	STATUS
    foo.tld.	SOA 	IN   	900s	ns-1371.awsdns-43.org.        	192.168.1.1:53	NXDOMAIN
                   	    	     	    	awsdns-hostmaster.amazon.com.
                   	    	     	    	1 7200 900 1209600 86400
    
    # but the resolver for the scoped query does return the right answer for the query.
    doggo @udp://10.100.0.2 logikal.test.record.foo.tld
    NAME                                                                 	TYPE 	CLASS	TTL 	ADDRESS                                                              	NAMESERVER
    logikal.test.record.foo.tld.                                     	CNAME	IN   	60s 	*.ssl.hub.foo.tld.                                              	10.100.0.2:53
    *.ssl.hub.foo.tld.                                              	CNAME	IN   	300s	nlb-1234567890abcedf.elb.us-east-1.amazonaws.com.	10.100.0.2:53
    nlb-1234567890abcedf.elb.us-east-1.amazonaws.com.	A    	IN   	60s 	1.2.3.4                                                        	10.100.0.2:53
    nlb-1234567890abcedf.elb.us-east-1.amazonaws.com.	A    	IN   	60s 	1.2.3.4                                                         	10.100.0.2:53
    

    My resolver configuration

    # some irrelevant resolvers removed
    scutil --dns
    DNS configuration
    
    resolver #1
      search domain[0] : foo.tld (my work domain)
      search domain[3] : hq (my LAN search domain)
      nameserver[0] : 192.168.1.87
      nameserver[1] : 192.168.1.1
      nameserver[2] : 8.8.8.8
      nameserver[3] : 1.1.1.1
      if_index : 13 (en4)
      flags    : Request A records
      reach    : 0x00020002 (Reachable,Directly Reachable Address)
    
    resolver #2
      domain   : foo.tld
      nameserver[0] : 10.100.0.2
      flags    : Supplemental, Request A records
      reach    : 0x00000002 (Reachable)
      order    : 102600
    
    DNS configuration (for scoped queries)
    
    resolver #1
      search domain[0] : hq (my LAN search domain)
      nameserver[0] : 192.168.1.87
      nameserver[1] : 192.168.1.1
      nameserver[2] : 8.8.8.8
      nameserver[3] : 1.1.1.1
      if_index : 13 (en4)
      flags    : Scoped, Request A records
      reach    : 0x00020002 (Reachable,Directly Reachable Address)
    
    resolver #2
      search domain[0] : hq (my LAN search domain)
      nameserver[0] : 192.168.1.87
      nameserver[1] : 192.168.1.1
      nameserver[2] : 8.8.8.8
      nameserver[3] : 1.1.1.1
      if_index : 15 (en0)
      flags    : Scoped, Request A records
      reach    : 0x00020002 (Reachable,Directly Reachable Address)
    
    resolver #3
      search domain[0] : foo.tld (my work domain)
      nameserver[0] : 10.100.0.2
      if_index : 26 (utun10)
      flags    : Scoped, Request A records
      reach    : 0x00000002 (Reachable)
    
  • Issue with snap version - socket: permission denied

    Issue with snap version - socket: permission denied

    When trying to use doggo on ubuntu core or debian 11 with snap installed I get the same error:

    aragorn@Aragorn:~/Extract$ doggo mrkaran.dev A @192.168.2.22 ERROR[2022-06-16T16:15:21-04:00] error looking up DNS records error="dial udp 192.168.2.22:53: socket: permission denied" NAME TYPE CLASS TTL ADDRESS NAMESERVER

    Screenshot: image

A DNS client in Go that supports Google DNS over HTTPS

dingo A DNS client (stub resolver) implemented in Go for the Google DNS-over-HTTPS. It effectively encrypts all your DNS traffic. It also supports Ope

Nov 9, 2022
dnscrypt-proxy 2 - A flexible DNS proxy, with support for encrypted DNS protocols.
dnscrypt-proxy 2 - A flexible DNS proxy, with support for encrypted DNS protocols.

Overview A flexible DNS proxy, with support for modern encrypted DNS protocols such as DNSCrypt v2, DNS-over-HTTPS and Anonymized DNSCrypt. dnscrypt-p

Jan 3, 2023
A smol DNS server (<100 loc) that's configured with a static JSON file. Useful for split-dns.

A smol DNS server (<100 loc) that's configured with a static JSON file. Useful for split-dns.

Jul 27, 2022
DNS server with per-client targeted responses

GeoDNS servers This is the DNS server powering the NTP Pool system and other similar services. Questions or suggestions? For bug reports or feature re

Dec 15, 2022
DNS library in Go

Alternative (more granular) approach to a DNS library Less is more. Complete and usable DNS library. All Resource Records are supported, including the

Dec 26, 2022
DNS over HTTPS [mirror]

dnss dnss is a daemon for using DNS over HTTPS. It can act as a proxy, receiving DNS requests and resolving them using DNS-over-HTTPs (DoH). This can

Dec 26, 2022
GRONG is a DNS (Domain Name System) authoritative name server.It is more a research project than a production-ready program.

GRONG (Gross and ROugh Nameserver written in Go) is a DNS (Domain Name System) authoritative name server. It is intended as a research project and is

Oct 17, 2020
Multicast DNS library for Go

Introduction This package allows Go processes to publish multicast DNS style records onto their local network segment. For more information about mDNS

Oct 23, 2022
Resolver (DNS) cache daemon.
Resolver (DNS) cache daemon.

RESCACHED(1) Manual Page NAME rescached - DNS resolver cache daemon. Table of Contents SYNOPSIS OPTIONS DESCRIPTION FEATURES BEHIND THE DNS HOW CACHE

Nov 17, 2022
CUP - Cloudflare (DNS) Updater Program

CUP The Cloudflare (DNS) Updater CUP is a tool to turn CloudFlare DNS into a Dynamic DNS service. Documentation Documentation can be found in the docs

Jun 6, 2022
CoreDNS is a DNS server that chains plugins
CoreDNS is a DNS server that chains plugins

CoreDNS is a DNS server/forwarder, written in Go, that chains plugins. Each plugin performs a (DNS) function. CoreDNS is a Cloud Native Computing Foun

Jan 3, 2023
Fast and lightweight DNS proxy as ad-blocker for local network with many features

Blocky Blocky is a DNS proxy and ad-blocker for the local network written in Go with following features: Features Blocking - Blocking of DNS queries w

Jan 1, 2023
Are you forwarding DNS traffic to another server for some reason, but want to make sure only queries for certain names are passed? Say no more.

DNSFWD Redirect DNS traffic to an upstream. Get Latest: wget https://github.com/C-Sto/dnsfwd/releases/latest/download/dnsfwd_linux (replace linux with

Dec 16, 2022
Fast DNS implementation for Go

Fast DNS implementation for Go Features 0 Dependency Similar Interface with net/http Fast DoH Server Co-create with fasthttp Fast DNS Client with rich

Dec 27, 2022
Gotator is a tool to generate DNS wordlists through permutations.
Gotator is a tool to generate DNS wordlists through permutations.

Gotator is a tool to generate DNS wordlists through permutations.

Dec 28, 2022
DNS lookup using Go
DNS lookup using Go

DNS lookup using Go

Dec 30, 2022
DNSTake — A fast tool to check missing hosted DNS zones that can lead to subdomain takeover
DNSTake — A fast tool to check missing hosted DNS zones that can lead to subdomain takeover

DNSTake — A fast tool to check missing hosted DNS zones that can lead to subdomain takeover

Dec 28, 2022
A tool to solve DNS pollution of GitHub website. Query the real IP address of domain names such as github.com, and refresh the domain name setting of the system hosts file.

githubDNS Target A tool to solve DNS pollution of GitHub website. Query the real IP address of domain names such as github.com, and refresh the domain

Oct 14, 2021
forward - facilitates proxying DNS messages to upstream resolvers.

forward Name forward - facilitates proxying DNS messages to upstream resolvers. Description The forward plugin re-uses already opened sockets to the u

Oct 16, 2021