return to table of content

Show HN: Doggo – A powerful, human-friendly DNS client for the command line

KingOfCoders
13 replies
22h55m

   go: downloading github.com/mr-karan/doggo v0.5.7
   go: github.com/mr-karan/doggo/cmd@latest: 
       module github.com/mr-karan/doggo@latest found (v0.5.7), 
       but does not contain package github.com/mr-karan/doggo/cmd

KingOfCoders
2 replies
14h2m

Installs now but installs as `cmd` not `doggo`

mr-karan
1 replies
13h46m

Sorry about that, it was a silly typo on my end. I've just pushed a fix:

  go install github.com/mr-karan/doggo/cmd/doggo@v1.0.2

KingOfCoders
0 replies
2h14m

Thanks + love your work.

TZubiri
4 replies
19h22m

So like dig but I have to compile build, configure, audit and trust instead of just having it packaged in my OS, nice.

throwaway894345
3 replies
18h40m

1. You have to audit/trust any software whether or not it’s distributed as part of your OS

2. What is there to configure?

3. It’s a Go program, so compilation happens transparently on installation provided the developers don’t release broken code. This isn’t the C/C++ world where you have complex bespoke build systems that only seem to work on the developers’ machines.

TZubiri
1 replies
16h37m

1- If you are claiming you are auditing all your OS parts, not even your own mother believes you, are you delving into tcp.c and ps2.c? delusional

2- I meant run the configure file. Typically configures in what folder you install the program, under what user, that kind of stuff. I'm just alluding to the whole open source installation process, which is more complex than installing an .msi on Windows, or installing an apt distributed .deb package on debian.

3- oh, ok sure. Btw, now I have to install a go compiler. In order to install a program that's been done 100 times by first year Comp Sci students. I'd rather kill myself.

arp242
0 replies
3h56m

Then don't use it. No is forcing you. No need for all the whining here.

sadops
0 replies
15h32m

Except package repositories have maintainers, who tend to be trustworthy parties. Compare the number of supply chain attacks Debian's apt repos have compared to, say, npm.

skibbityboop
1 replies
21h57m

Hit the same issue, but it goes fine if you just clone the repo, cd down into the cmd directory and 'go build -o doggo'.

KingOfCoders
0 replies
21h49m

Does this install in a way I can upgrade it with topgrade?

mr-karan
0 replies
18h8m

Does this command not work?

  go install github.com/mr-karan/doggo/cmd@latest
  go: downloading github.com/mr-karan/doggo v1.0.0

wiseowise
12 replies
20h58m

Is there any reason why so many of those tools are written in Go? Is it because of a stdlib or just accidental?

lynndotpy
6 replies
19h55m

Go is produces (mostly) statically compiled binaries by default. No runtime, no interpreter, no dependencies.

Python, Java, JavaScript, C#, etc. can't say the same.

cromka
2 replies
6h37m

Correct me if I am wrong. but this is the feature of C#/.Net as well as of recent versions.

neonsunset
1 replies
5h51m

dotnet publish -o . -p:PublishAot=true :)

To be fair, I do not think the author understands what static binaries are and why they may or may not want them, and how what Go does differs to what C/C++ toolchain does. I’d be very surprised if they do, being a Go developer. Next time they will learn another excuse to promote their language.

Zambyte
0 replies
1h44m

Also to be fair, they did say "by default", and those options you provided must be set because they are not default.

audiodude
2 replies
19h30m

In my experience, I've always had to install Go and it's ecosystem to `go install foo` for Go programs to work. Is anyone distributing binaries?

audiodude
0 replies
19h22m

Oh duh, thanks!

aeadio
1 replies
20h20m

Could be cultural. Go has a lot of exposure in the DevOps / cloud infrastructure space. Lots of stuff like k8s and Terraform (and its providers) are written in Go, and it competes with Python in popularity for internal tooling.

bloopernova
0 replies
3h25m

Yeah exactly. I wrote one orchestration tool in Python, another department used Go. Right now I'm using nodejs simply because that's the main project language and all the developers can help out :)

moffkalast
0 replies
20h8m

So the name can be a pun, of course.

keyle
0 replies
20h31m

Go gets it done and for years to come.

SushiHippie
0 replies
20h13m

In this case it seems like the creator of this tool already knew golang so he used it.

From the readme:

It's totally inspired from dog [0] 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.

[0] https://github.com/ogham/dog

lemcoe9
11 replies
18h27m

Another shameless plug for my website, you can use ipkitten.com to get your public IP address from your terminal:

  $ curl ipkitten.com
  27.44.144.144
And if you visit it in a browser, you get your IP address and a kitten GIF!:

https://ipkitten.com

nullindividual
6 replies
18h3m

icanhazip.com is another service which does this.

jachee
5 replies
17h52m

And the easy-to-remember-for-Unix-nerds:

    ifconfig.me/ip

LargoLasskhyfv
1 replies
17h21m

v6! Yay!

jachee
0 replies
10h47m

One of the reasons I dig it.

peddling-brink
0 replies
13h50m

Or ifconfig.co

fragmede
0 replies
14h25m

if you use curl it'll do user agent detection and just give you your ip

    curl ifconfig.me

varenc
1 replies
13h16m

I love using ipinfo.com for the extra details it provides like hostname, ISP, ASN, etc.

   $ curl ipinfo.io/json
or you can look up these details for any other IP:

   $ curl ipinfo.io/18.18.18.18

reincoder
0 replies
3h38m

We have a CLI as well: https://github.com/ipinfo/cli

It has a ton of bells and whistles, including summarize IPs, bulk enrichment, grepip, and a ton of network-related tools. I was writing a series of blog posts on the CLI, but I think the series got too long and left users to discover the features of the CLI on their own.

xinayder
0 replies
6h17m

there's https://myip.wtf or wtfismyip.com which provides a strongly worded interface. You can also check which headers your browser is sending to the website.

fragmede
0 replies
14h26m

Just don't let grow up and eat http://ipchicken.com.

mholt
7 replies
23h27m

Love this, thank you!

Is there a way to query all DNS records? (I was surprised to learn that isn't the default.) This would be really helpful for troubleshooting people's Caddy questions (which are actually DNS problems).

mr-karan
3 replies
17h53m

Would this be something close to what you're looking for?

  alias doggo-all='doggo $1 A AAAA AFSDB APL CAA CDNSKEY CDS CERT CNAME CSYNC DHCID DLV DNAME DNSKEY DS EUI48 EUI64 HINFO HIP HTTPS IPSECKEY KEY KX LOC MX NAPTR NS NSEC NSEC3 NSEC3PARAM OPENPGPKEY RRSIG RP SIG SMIMEA SOA SRV SSHFP SVCB TLSA TSIG TXT URI ZONEMD ${2:+@$2}'

  doggo-all example.com @1.1.1.1

varenc
2 replies
13h12m

When I run that:

   $ doggo google.com A AAAA AFSDB APL CAA CDNSKEY CDS CERT CNAME CSYNC DHCID DLV DNAME DNSKEY DS EUI48 EUI64 HINFO HIP HTTPS IPSECKEY KEY KX LOC MX NAPTR NS NSEC NSEC3 NSEC3PARAM OPENPGPKEY RRSIG RP SIG SMIMEA SOA SRV SSHFP SVCB TLSA TSIG TXT URI ZONEMD
   
It takes 5+ seconds to get a response.

Classic `dig` though takes 50ms.

mr-karan
0 replies
13h4m

Hm it took around 2.9s on my system. Let me see if I can concurrently lookup records for different records and optimise this. Thanks for sharing.

  time doggo google.com A AAAA AFSDB APL CAA CDNSKEY CDS CERT CNAME CSYNC DHCID DLV
  0.02s user 0.02s system 1% cpu 2.981 total

andrewmcwatters
1 replies
23h24m

You can't really query all DNS records these days anymore by using the ANY query type. The closest alternative is to run dig across all record types.

At Andrew McWatters & Co., we use a small internal utility called digany(1)[1][2] that does this for you.

[1]: https://github.com/andrewmcwattersandco/digany

[2]: https://github.com/andrewmcwattersandco/digany/blob/main/dig...

    andrewmcwatters@Andrews-MacBook-Pro digany % ./digany andrewmcwatters.com
    andrewmcwatters.com. 1799 IN A 107.172.29.10
    andrewmcwatters.com. 1800 IN NS dns1.registrar-servers.com.
    andrewmcwatters.com. 1800 IN NS dns2.registrar-servers.com.
    andrewmcwatters.com. 3601 IN SOA dns1.registrar-servers.com. hostmaster.registrar-servers.com. 1719805485 43200 3600 604800 3601
    andrewmcwatters.com. 1800 IN MX 20 eforward5.registrar-servers.com.
    andrewmcwatters.com. 1800 IN MX 15 eforward4.registrar-servers.com.
    andrewmcwatters.com. 1800 IN MX 10 eforward1.registrar-servers.com.
    andrewmcwatters.com. 1800 IN MX 10 eforward2.registrar-servers.com.
    andrewmcwatters.com. 1800 IN MX 10 eforward3.registrar-servers.com.
    andrewmcwatters.com. 1799 IN TXT "google-site-verification=39W1-Db36mrNNekPXww8TUdo7LcrmEUfv-gBmVTT1Dk"
    andrewmcwatters.com. 1799 IN TXT "v=spf1 include:spf.efwd.registrar-servers.com a:andrewmcwatters-17ce78.andrewmcwatters.com ~all"
    ...

bandie91
0 replies
19h53m

or AXFR... but it is allowed on even less places than ANY.

madars
6 replies
1d

Amazing naming choice - doggos like to dig!

ck45
5 replies
1d

TIL there's also dog[1] Which is probably also common typo for "dig"

[1] https://github.com/ogham/dog

linsomniac
3 replies
20h19m

I went to switch over to "dog" last week but it looks abandoned. I couldn't get a download to work because of outdated dependencies, and IIRC I couldn't get it to build, so I just gave up on it after seeing the latest release is 4 years old.

Zambyte
1 replies
1h47m

That seems crazy to me that a DNS client is broken after only 4 years due to incompatibility dependencies! I was going to suggest that maybe it's just completed software, but wow, this makes me really want to stay away from the Rust ecosystem.

gunapologist99
0 replies
55m

Not sure why you're being downvoted, because this is how the JS and Python ecosystems are becoming as well. Obviously, there's a lot of innovation that's happening (or at least the authors think so), but it's still possible to move a package forward without breakage.

It'd be great if communities could adopt the Go backwards compatibility promise[0] (it's best-effort, after all) so that packages continue to compile for a decade into the future and only introduce breaking changes for security reasons.

It's actually not that difficult to do -- just needs to be made an important goal of any project, and it makes it much easier to trust the stability of the dependency.

0. https://go.dev/blog/compat

renewiltord
0 replies
18h5m

Upgrade the openssl dependencies if you are on new Ubuntu:

    ubuntu $ (new) target/release/dog google.com
     A google.com.               2m13s   142.250.189.206
    NS                       15h15m07s A "i.root-servers.net."
    NS                       15h15m07s A "d.root-servers.net."
    NS                       15h15m07s A "a.root-servers.net."
    NS                       15h15m07s A "b.root-servers.net."
    NS                       15h15m07s A "c.root-servers.net."
    NS                       15h15m07s A "f.root-servers.net."
    NS                       15h15m07s A "e.root-servers.net."
    NS                       15h15m07s A "h.root-servers.net."
    NS                       15h15m07s A "m.root-servers.net."
    NS                       15h15m07s A "j.root-servers.net."
    NS                       15h15m07s A "k.root-servers.net."
    NS                       15h15m07s A "g.root-servers.net."
    NS                       15h15m07s A "l.root-servers.net."
     A a.root-servers.net. 2d10h37m14s + 198.41.0.4
    ubuntu $ (new) git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
      modified:   Cargo.lock
      modified:   dns-transport/Cargo.toml

    no changes added to commit (use "git add" and/or "git commit -a")
    ubuntu $ (new) git diff dns-transport/Cargo.toml
    diff --git a/dns-transport/Cargo.toml b/dns-transport/Cargo.toml
    index 67552c3..d68d542 100644
    --- a/dns-transport/Cargo.toml
    +++ b/dns-transport/Cargo.toml
    @@ -19,6 +19,8 @@ log = "0.4"

     # tls networking
     native-tls = { version = "0.2", optional = true }
    +openssl-sys = ">=0.9.102"
    +openssl = ">=0.10.64"

     # http response parsing
     httparse = { version = "1.3", optional = true }

hk__2
0 replies
23h55m

doggo is actually dog written in Go.

robomc
5 replies
18h42m

I have a silly question I guess... why does it print everything out twice?

~ doggo google.com

NAME TYPE CLASS TTL ADDRESS NAMESERVER

google.com. A IN 296s 142.250.67.14 127.0.2.2:53

google.com. A IN 296s 142.250.67.14 127.0.2.3:53

~ doggo news.ycombinator.com

NAME TYPE CLASS TTL ADDRESS NAMESERVER

news.ycombinator.com. A IN 1s 209.216.230.207 127.0.2.2:53

news.ycombinator.com. A IN 1s 209.216.230.207 127.0.2.3:53

kadoban
3 replies
16h31m

Looks like once per nameserver that you're configured to use. I guess just in case they give different answers, which is uncommon in practice.

vladvasiliu
0 replies
12h20m

Oh man, if I had a penny for every time this issue came up, my grandchildren wouldn't have to work a day in their lives.

mrngm
0 replies
9h20m

Try a few queries to an anycasted resolver for the same record. It's rather common that, for example, TTL values differ per response. (the magic trick here is that it's not guaranteed that your requests end up on the same resolver).

You could have a look at https://dnsdiag.org/ that provides a few tools for further introspection in the many (different) answers resolvers can give.

ksynwa
0 replies
12h29m

Would be useful in my unfortunate case where the ISP's DNS is broken for a bunch of domains. Most notably githubusercontent.com. Also a bunch of CDN domains.

mr-karan
0 replies
15h49m

Just tried on my Adguard DNS server, I am only getting one entry. I think it's related to your nameserver configuration. Could you try reproducing with specifying a custom one, with @1.1.1.1 or something?

  doggo google.com --short
  142.250.185.238

nedt
5 replies
7h5m

Very nice to also have it dockerized. You might just want to add in the documentation the `--rm` parameter for cleanup after running and `-t` for the colors. So it will be

  docker run --rm -it ghcr.io/mr-karan/doggo:latest mrkaran.dev MX

Bluecobra
3 replies
4h17m

Just curious, but why go through all the trouble to create a docker container for a DNS cli utility with no dependencies?

patmcc
0 replies
2h14m

Makes it easy to drop it into a k8s cluster, maybe?

mr-karan
0 replies
2h46m

Long answer: Not OP, but sometimes you’re in a throwaway env and want to quickly do a DNS query and don’t have any tools (like Ubuntu minimal) available. Spawning an ephemeral container isn’t a bad idea in that case.

Short answer: Why not :)

gosub100
0 replies
12m

You want an upfront assurance that there's not going to be any bullshit. There's nothing that technically prevents a docker container from failing, of course. But seeing that someone took the extra step to make one is enough assurance. And it also protects the author from incoming "it doesn't work on my machine" bs.

mr-karan
0 replies
7h1m

Yep, that makes sense. Thanks, just updated docs.

jiehong
2 replies
23h33m

And dog seems unmaintained, sadly

bluejekyll
0 replies
4h9m

We have similar utilities in the Hickory DNS project, https://github.com/hickory-dns/hickory-dns/tree/main/util

There’s are a bunch of cli tools: dig like tool called ‘dns’, a stub resolver called ‘resolve’, a recursive resolver called ‘recurse’, and some other random maintenance tools. These are all to make it easier to test certain details outside other people’s dependency trees.

The documentation is a little sparse…

0xCMP
0 replies
22h39m

Yea a lot of lingering PRs to fix building with OpenSSL or update packages in some way. Last change was ~3 years ago.

generalizations
1 replies
1d

From the doggo github readme:

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.
Zambyte
0 replies
1h39m

I do always find it interesting when people just want to add some features, and the language stops them from doing it. I'm so used to bouncing back and forth between code and docs (api docs and language syntax docs depending on my familiarity) that the language itself is basically an implementation detail that I don't really care about. There are very few languages that would even give me pause, let alone avoid modifying the project entirely.

achillean
5 replies
19h5m

We developed "geodns" for situations where you want to do DNS lookups from different regions around the world. For example, ycombinator.com returns different IPs depending on your location:

  $ geodns ycombinator.com
  108.156.133.117                Singapore
  108.156.133.21                 Singapore
  108.156.133.25                 Singapore
  108.156.133.59                 Singapore
  108.156.39.26                  London
  108.156.39.61                  London
  108.156.39.62                  London
  108.156.39.64                  London
  13.32.27.123                   Frankfurt am Main
  13.32.27.47                    Frankfurt am Main
  13.32.27.51                    Frankfurt am Main
  13.32.27.80                    Frankfurt am Main
  13.35.93.12                    Clifton
  13.35.93.14                    Clifton
  13.35.93.46                    Clifton
  13.35.93.47                    Clifton
  18.239.94.100                  Amsterdam
  18.239.94.114                  Amsterdam
  18.239.94.33                   Amsterdam
  18.239.94.79                   Amsterdam
  99.86.20.42                    Doddaballapura
  99.86.20.54                    Doddaballapura
  99.86.20.64                    Doddaballapura
  99.86.20.96                    Doddaballapura
https://gitlab.com/shodan-public/geonet-rs

metadat
3 replies
16h47m

Is that because it's behind cloudflare? I'm pretty sure it still runs primarily on a single server in a Colo (i.e. except in times of hardware failure or other physical realities).

oefrha
1 replies
13h6m

You’re thinking about news.ycombinator.com, run on a single server from M5, which is not the same as ycombinator.com.

  > dig +short news.ycombinator.com
  209.216.230.207
  > ipinfo 209.216.230.207
  {
    "ip": "209.216.230.207",
    "hostname": "news.ycombinator.com",
    "city": "San Diego",
    "region": "California",
    "country": "US",
    "loc": "32.7157,-117.1647",
    "org": "AS21581 M5 Computer Security",
    "postal": "92101",
    "timezone": "America/Los_Angeles",
    "readme": "https://ipinfo.io/missingauth"
  }
It was moved to AWS temporarily the last time the servers failed: https://news.ycombinator.com/item?id=32031136

1vuio0pswjnm7
0 replies
11h7m

It's also possible to get a copy of HN from Cloudflare in addition to M5. I keep historical DNS data and can confirm there are Cloudlfare IPs that continue to work.

kevin_nisbet
0 replies
15h42m

whois is returning AWS and I don't see any of the normal cloudfront headers, but I do see a server header of nginx. So it doesn't look like cloudflare to me, I'd guess they're just running some ec2 instances with nginx configured to give the exact behaviour they need (as I recall they return cached pages to non logged in users, which is why you can sometimes log out and get the page to load when they're having issues). I also see awsdns in their ns records, so it looks to be like they're just doing Geo-dns in route53 to route to the closest instance they're running.

emmanueloga_
4 replies
15h4m

Is this related to Dog [1]? They look almost identical in functionality.

Both ask for the specific query to run (A, AAAA, etc.). Why not default to query all records? (at least when querying a single domain).

--

1: https://github.com/mr-karan/doggo

mr-karan
3 replies
12h17m

What does "all records" mean though? `dig` defaults to just show A records and I've kept the behaviour same. Do you mean all possible record types under the sun, or just a bunch of common ones? `MX, AAAA, A, CNAME, TXT` etc ?

jmduke
2 replies
21h33m

Shameless plug for folks looking for something similar, but on the web: I was fed up with Google's slow/janky dig webface, so built my own. (Still very WIP, but already works better as a daily driver than Google's!)

https://www.shovel.report/ycombinator.com

willhackett
0 replies
21h2m

Did you use DNS over HTTPS (DoH)? I love how easy it is to perform DNS lookups in web apps too through this.

  curl -H "accept: application/dns-json" "https://cloudflare-dns.com/dns-query?name=ycombinator.com&type=A"

hackmiester
0 replies
15h18m

This is pretty cool! But what does it mean when something is listed under "Services"? For example, one of my "services" is "52.45.50.190/32", an AWS IP. What does that actually mean? How did that IP get there?

vladvasiliu
1 replies
12h18m

Is there a way to run the web interface locally?

BTW, the "visit demo" link in the docs returns 404.

toomuchtodo
1 replies
1d1h

Looks super cool! Can you share more about why you built this, design decisions, and other behind the scenes context?

mr-karan
0 replies
1d

Thanks! I pretty much did this as a learning/hobby side project. Back in 2021, I was dealing with a lot of K8s clusters and had recently learnt what about ndots[1]. That prompted me to build an easy to use DNS client which can avoid surprises about the host environment.

I've built this using Go, my daily driver. It doesn't use any CLI frameworks, that was mostly out of choice as I didn't want to add external deps unless really required. My favourite part was to build this small help.go[3] utility which renders colored/formatted help text.

Over the time I got some good quality external contributions, especially the one from @jedisct1 for adding DNSCrypt[2] support to it.

Releasing a v1.0 has been on the back burner forever (like, a whole year+ :'). Life, other projects, and probably a bit of procrastination got in the way. Finally sat down last week and forced myself to come up with a deadline to push this out.

[1]: https://mrkaran.dev/posts/ndots-kubernetes/

[2]: https://github.com/mr-karan/doggo/pull/17

[3]: https://github.com/mr-karan/doggo/blob/main/cmd/help.go

jedisct1
1 replies
20h49m

Congrats for the 1.0 release!

doggo has been my main DNS tool for a while, now. Love it!

icar
1 replies
1h18m

I'd not encourage the usage of an AUR helper. Just pointing to the AUR page should be enough.

toasteros
0 replies
45m

There's a curl | sh too. Would be kind of ironic to suffer from a DNS poisoning attack while trying to download a DNS client.

XiS
1 replies
20h22m

Would be amazing is this tool would add support for the equivalent of query type ANY

ThinkBeat
1 replies
1d

Is this a client to query DNS servers, like digg or dogg?

Or is it a client to control and configure the DNS servers a computer is using?

or both?

mr-karan
0 replies
1d

It's a DNS client for querying DNS servers.

8mobile
1 replies
13h28m

404 page not found, have you received many requests? The project is very interesting, I like the interface. Congratulations

mr-karan
0 replies
13h19m

Ah yes, but it's a static site, shouldn't be 404ing. Most probably you're hitting `/docs`. I've not setup the redirect of trailing slash. Will do that.

Meanwhile, the docs link is https://doggo.mrkaran.dev/docs/

valtlfelipe
0 replies
1d

very nice! looks clean and simple.

steph-123
0 replies
9h32m

An awesome project, I learned about it last year through developing the x-cmd pkg, at that time the latest version was 0.5.7, now it's 1.0.2, it seems necessary to upgrade the version.

Here is a demo video, you can take a look: https://x-cmd.com/pkg/doggo

pixelready
0 replies
23h27m

Ok, now hear me out. You bundle this with Bruno and some other networking tools as… The Woof Pack

obviyus
0 replies
23h49m

Pretty! Time to alias dig to doggo for a few days ;)

BTW I really enjoyed reading your blog on Nomad while setting up our own clusters, kudos!

fs111
0 replies
23h47m

Happy user for years here. Keep up the good work!

Siilwyn
0 replies
4h4m

I use `bore` which works about the same, interesting to see new options! https://crates.io/crates/bore

ErikBjare
0 replies
4h13m

Is this how the kids "rawdog" DNS these days?