Doggo - ユーザーフレンドリーなコマンドライン DNS クライアント
(doggo.mrkaran.dev)- Doggoは、DNS ルックアップ結果を色分けと表形式で表示するコマンドラインクライアントで、ターミナルで人が読みやすい出力を目指している
- 自動化環境ではJSON 出力を使用でき、応答時間の計測やデバッグモードにより問題分析にも活用できる
- DNS over HTTPS、TLS、QUIC、TCP、UDP、DNSCrypt など複数の転送プロトコルを 1 つのツールで扱える
- EDNS Client Subnet、NSID、DNS Cookies、EDNS Padding、Extended DNS Errors といったEDNS 機能と glue record の処理をサポートする
- Linux、macOS、Windows、FreeBSD、NetBSD で動作し、Web インターフェースとシェル補完まで提供しているため、ローカル CLI とブラウザの両方で利用できる
ターミナルで読みやすい DNS ルックアップ
- Doggoは人のためのコマンドライン DNS クライアントを掲げている
- デフォルト出力は色分けと表ベースの形式で構成されており、DNS 応答を素早く見渡しやすい
- スクリプト化やパースが必要な場合はJSON 出力を利用できる
- デバッグモードと応答時間の計測をあわせて提供し、ルックアップ結果だけでなく動作過程も確認できる
サポートする DNS プロトコルとデータ
- 複数の DNS 転送プロトコルをサポートする
- DNS over HTTPS
- DNS over TLS
- DNS over QUIC
- DNS over TCP
- DNS over UDP
- DNSCrypt
- EDNS 関連機能も幅広く含まれる
- EDNS Client Subnet(ECS) による位置認識レスポンス
- Name Server Identifier(NSID)
- DNS Cookies
- EDNS Padding
- Extended DNS Errors(EDE)
- additional section のglue recordや補助的な DNS データを処理できる
- Internationalized Domain Names(IDN) は自動punycode 変換をサポートする
- Reverse DNS lookup と AA、AD、CD、DO などさまざまな DNS フラグも扱える
設定、リゾルバ、実行環境
resolv.confまたはコマンドライン引数でndotsとsearchの設定を使用できる- 複数のリゾルバを指定でき、クエリ戦略もユーザーがカスタマイズ可能
- IPv4 と IPv6 の両方をサポートする
- doggo.mrkaran.dev でWeb インターフェースを提供している
zshとfish用のシェル補完を提供する- 対応プラットフォームは Linux、macOS、Windows、FreeBSD、NetBSD
1件のコメント
Hacker Newsのコメント
すごく良さそう。なぜ作ったのか、設計上の判断や舞台裏の背景をもっと共有してもらえる?
ndotsを知って、ホスト環境のせいで予想外の挙動に遭わない、使いやすいDNSクライアントを作りたくなった。普段使っているGoで作り、どうしても必要でない限り外部依存を増やしたくなかったのでCLIフレームワークは使わなかった。特に、色や書式付きのヘルプテキストをレンダリングする小さな help.go ユーティリティを作った部分が気に入っている。
時間が経つにつれて良い外部コントリビューションももらえたし、特に @jedisct1 が DNSCryptサポート を追加してくれたのは大きかった。v1.0のリリースは1年以上ずっと先延ばしになっていたけれど、生活や他のプロジェクト、それに少しの先延ばし癖が重なって、先週ようやく締め切りを決めて押し切った。
ndotsに関する記事: https://mrkaran.dev/posts/ndots-kubernetes/名前のセンスが素晴らしい。doggo は dig するのが好きな犬だから
digのよくあるタイプミスでもあるんだろうねDockerイメージがあるのもいい。ドキュメントに、実行後の掃除用の
--rmと色表示用の-tオプションを加えるとよさそう。docker run --rm -it ghcr.io/mr-karan/doggo:latest mrkaran.dev MXちょっと間抜けな質問かもしれないけど、どうして出力が全部 2回ずつ 出るの?
doggo google.comを実行すると127.0.2.2:53と127.0.2.3:53から同じAレコードがそれぞれ出てきて、doggo news.ycombinator.comでも同じように2つのネームサーバーの結果が表示される@1.1.1.1みたいなカスタムネームサーバーを指定して再現できる?doggo google.com --shortは142.250.185.238を1つだけ返したこのツールが
ANYと同等の クエリタイプ をサポートしてくれると本当にうれしい近いうちにリリースする予定
いいプロジェクト。去年 x-cmd pkg を開発していたときに知って、そのときの最新版は0.5.7だったけど、今は1.0.2なのでバージョン更新が必要そう
デモ動画もある: https://x-cmd.com/pkg/doggo
https://github.com/ogham/dog を思い出す
dogに完全に着想を得ていて、Rustは知らないけれど機能を追加したかったので、GoでDNSクライアントを一から書いてみる良い機会にしたとのこと。それで名前も
dog + go => doggoになったdogは メンテナンスされていない ように見えるこういうツールってGoで書かれることが多いけど、何か理由があるのかな? 標準ライブラリ のおかげなのか、それとも単なる偶然なのか気になる
Python、Java、JavaScript、C# などで同じことを言うのは難しい
k8s や Terraform、その provider のような多くのツールがGoで書かれていて、社内ツール作成ではPythonと人気を競っている印象
READMEによると、Rustで書かれた
dogに着想を得たが、Rustは知らないものの機能を追加したかったので、GoでDNSクライアントを自作してみたとのこと。だから名前もdog + go => doggo。https://github.com/ogham/dog
これは Dog と関係ある? 機能はほぼ同じに見える。
どちらも実行する特定のクエリ(A、AAAA など)を要求するけど、なぜデフォルトを全レコードへのクエリにしないんだろう? 少なくとも単一ドメインを問い合わせるときはそうできそうに思える。
https://github.com/mr-karan/doggo
digはデフォルトでAレコードだけを表示するし、自分もその動作を同じにした。可能なすべてのレコードタイプ全部のことを言っているのか、それとも
MX, AAAA, A, CNAME, TXTみたいな一般的なものをいくつか指しているのか気になる1.0リリースおめでとう。doggo はしばらくの間、自分の メインのDNSツール だったし、本当に気に入っている