8 ms·
Show HN: Doggo – A powerful, human-friendly DNS client for the command line
- toomuchtodo 2y agoLooks super cool! Can you share more about why you built this, design decisions, and other behind the scenes context?
- justsomehnguy 2y ago[flagged]
- chrisweekly 2y ago> "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, DoQ, 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."
- mr-karan 2y agoThanks! 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/ https://mrkaran.dev/posts/ndots-kubernetes/ [2]: https://github.com/mr-karan/doggo/pull/17 https://github.com/mr-karan/doggo/pull/17 [3]: https://github.com/mr-karan/doggo/blob/main/cmd/help.go https://github.com/mr-karan/doggo/blob/main/cmd/help.go
- deleted 2y ago[deleted]
- valtlfelipe 2y agovery nice! looks clean and simple.
- madars 2y agoAmazing naming choice - doggos like to dig!
- ck45 2y agoTIL there's also dog[1] Which is probably also common typo for "dig" [1] https://github.com/ogham/dog https://github.com/ogham/dog
- hk__2 2y agodoggo is actually dog written in Go.
- linsomniac 2y agoI 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.
- renewiltord 2y agoUpgrade 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 }
- ThinkBeat 2y agoIs 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 2y agoIt's a DNS client for querying DNS servers.
- mrbluecoat 2y agoReminds me of https://github.com/ogham/dog https://github.com/ogham/dog
- generalizations 2y agoFrom 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 2y agoI 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.
- jiehong 2y agoAnd dog seems unmaintained, sadly
- 0xCMP 2y agoYea a lot of lingering PRs to fix building with OpenSSL or update packages in some way. Last change was ~3 years ago.
- bluejekyll 2y agoWe have similar utilities in the Hickory DNS project, https://github.com/hickory-dns/hickory-dns/tree/main/util 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…
- obviyus 2y agoPretty! 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 2y agoHappy user for years here. Keep up the good work!
- v101 2y ago[flagged]
- kortex 2y agoWhat's stupid about it? Dig was an early and widespread DNS CLI tool. "dog" is a logical name for a next-gen dns cli, and of course that exists. "Doggo" is both a pretty standard linguistic drift pattern of English slang (random -> rando, weird -> weirdo), a common internet term of endearment for "dog", and a logical derivation of *-go for go-based tools and software.
- sadops 2y agoSurprised nobody went for "dug", à la DigDug.
- pixelready 2y agoOk, now hear me out. You bundle this with Bruno and some other networking tools as… The Woof Pack
- mholt 2y agoLove 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).
- andrewmcwatters 2y agoYou 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 https://github.com/andrewmcwattersandco/digany [2]: https://github.com/andrewmcwattersandco/digany/blob/main/digany 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 2y agoor AXFR... but it is allowed on even less places than ANY.
- deleted 2y ago[deleted]
- mr-karan 2y ago
- tociye9860 2y ago[flagged]
- KingOfCoders 2y agogo: 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
- skibbityboop 2y agoHit 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 2y agoDoes this install in a way I can upgrade it with topgrade?
- arccy 2y agoI guess not using one of the proxies? for some reason their v1.0.0 commit isn't attached to anything... https://github.com/mr-karan/doggo/commit/fe3958594df46c000ef197f96f2e9f31435a221f https://github.com/mr-karan/doggo/commit/fe3958594df46c000ef...
- mr-karan 2y agoJust pushed a minor patch release. Tagged on main: https://github.com/mr-karan/doggo/commit/8f60428f6ae154918d9df19202b22810863fec37 https://github.com/mr-karan/doggo/commit/8f60428f6ae154918d9...
- KingOfCoders 2y agoInstalls now but installs as `cmd` not `doggo`
- mr-karan 2y agoSorry 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
- jmduke 2y agoShameless 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 https://www.shovel.report/ycombinator.com
- willhackett 2y agoDid 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 2y agoThis 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?
- deleted 2y ago[deleted]
- wiseowise 2y agoIs there any reason why so many of those tools are written in Go? Is it because of a stdlib or just accidental?
- keyle 2y agoGo gets it done and for years to come.
- aeadio 2y agoCould 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 2y agoYeah 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 :)
- SushiHippie 2y agoIn 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 https://github.com/ogham/dog
- moffkalast 2y agoSo the name can be a pun, of course.
- lynndotpy 2y agoGo is produces (mostly) statically compiled binaries by default. No runtime, no interpreter, no dependencies. Python, Java, JavaScript, C#, etc. can't say the same.
- jedisct1 2y agoCongrats for the 1.0 release! doggo has been my main DNS tool for a while, now. Love it!
- mr-karan 2y agoVery kind of you, thanks! Was just mentioning on my other comment[1] about your contributions to the tool. [1]: https://news.ycombinator.com/item?id=40848420 https://news.ycombinator.com/item?id=40848420
- XiS 2y agoWould be amazing is this tool would add support for the equivalent of query type ANY
- achillean 2y agoWe 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 https://gitlab.com/shodan-public/geonet-rs
- metadat 2y agoIs 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).
- kevin_nisbet 2y agowhois 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.
- oefrha 2y ago
- robomc 2y agoI 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 2y agoLooks like once per nameserver that you're configured to use. I guess just in case they give different answers, which is uncommon in practice.
- ksynwa 2y agoWould 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.
- vladvasiliu 2y agoOh 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 2y agoTry 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/ https://dnsdiag.org/ that provides a few tools for further introspection in the many (different) answers resolvers can give.
- mr-karan 2y agoJust 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
- lemcoe9 2y agoAnother 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 https://ipkitten.com
- nullindividual 2y agoicanhazip.com is another service which does this.
- jachee 2y agoAnd the easy-to-remember-for-Unix-nerds: ifconfig.me/ip
- LargoLasskhyfv 2y agov6! Yay!
- jachee 2y agoOne of the reasons I dig it.
- fragmede 2y agoif you use curl it'll do user agent detection and just give you your ip curl ifconfig.me
- peddling-brink 2y agoOr ifconfig.co
- emmelaich 2y agoor google search, which you tell you (might be fourth or more result) https://www.google.com/search?q=what%27s+my+ip https://www.google.com/search?q=what%27s+my+ip
- 2y ago
- emmanueloga_ 2y agoIs 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 https://github.com/mr-karan/doggo
- mr-karan 2y agoWhat 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 ?
- emmanueloga_ 2y agoI did not realize the list of record types was so long! [1] But I was thinking the common ones, yes. --- 1: https://en.wikipedia.org/wiki/List_of_DNS_record_types#/media/File:All_active_dns_record_types.png https://en.wikipedia.org/wiki/List_of_DNS_record_types#/medi...
- mr-karan 2y agoThis is now live: https://doggo.mrkaran.dev/docs/features/any/ https://doggo.mrkaran.dev/docs/features/any/
- emmanueloga_ 2y agoReally nice!
- teddyh 2y agoActually authoritative list: <https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4 https://www.iana.org/assignments/dns-parameters/dns-paramete...>
- 8mobile 2y ago404 page not found, have you received many requests? The project is very interesting, I like the interface. Congratulations
- mr-karan 2y agoAh 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/ https://doggo.mrkaran.dev/docs/
- vladvasiliu 2y agoIs there a way to run the web interface locally? BTW, the "visit demo" link in the docs returns 404.
- mr-karan 2y agoSorry the demo link is fixed now: https://doggo.mrkaran.dev/ https://doggo.mrkaran.dev/ Yes, you can run the web server locally: https://github.com/mr-karan/doggo/tree/main/web https://github.com/mr-karan/doggo/tree/main/web cd web go run .
- jdoe247dog 2y agoThe q client has a feature comparison: https://github.com/natesales/q?tab=readme-ov-file#feature-comparison https://github.com/natesales/q?tab=readme-ov-file#feature-co...
- deleted 2y ago[deleted]
- moderation 2y agoAfter having issues with QUIC timeouts with Doggo, I switched to q and it has been great.
- steph-123 2y agoAn 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 https://x-cmd.com/pkg/doggo
- nedt 2y agoVery 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 2y agoJust curious, but why go through all the trouble to create a docker container for a DNS cli utility with no dependencies?
- mr-karan 2y agoLong 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 :)
- chrisandchris 2y agoI don't specifically know Ubuntu minimal. But suggesting that a minimal OS has containerd pre-installed isn't exactly the "minimal" I'm thinking of. It's a lot of code to "just run a UDP packet" IMHO.
- tlavoie 2y agoThat's also where declarative package managers such as Nix and Guix shine. You can temporarily "install" packages that can be cleaned up later, garbage-collection style. Besides being their own distros, both can be used as add-on package managers on other Linux distros, for example.
- RGBCube 2y agoHave you ever heard of Nix?
- deleted 2y ago[deleted]
- ErikBjare 2y agoIs this how the kids "rawdog" DNS these days?
- Siilwyn 2y agoI use `bore` which works about the same, interesting to see new options! https://crates.io/crates/bore https://crates.io/crates/bore
- icar 2y agoI'd not encourage the usage of an AUR helper. Just pointing to the AUR page should be enough.
- toasteros 2y agoThere's a curl | sh too. Would be kind of ironic to suffer from a DNS poisoning attack while trying to download a DNS client.