2 ポイント 投稿者 GN⁺ 2024-07-02 | 1件のコメント | WhatsAppで共有
  • 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 またはコマンドライン引数で ndotssearch の設定を使用できる
  • 複数のリゾルバを指定でき、クエリ戦略もユーザーがカスタマイズ可能
  • IPv4 と IPv6 の両方をサポートする
  • doggo.mrkaran.devWeb インターフェースを提供している
  • zshfish 用のシェル補完を提供する
  • 対応プラットフォームは Linux、macOS、Windows、FreeBSD、NetBSD

1件のコメント

 
GN⁺ 2024-07-02
Hacker Newsのコメント
  • すごく良さそう。なぜ作ったのか、設計上の判断や舞台裏の背景をもっと共有してもらえる?

    • 学習も兼ねた趣味のサイドプロジェクトとして作った。2021年にK8sクラスターをかなり扱っていたときに ndots を知って、ホスト環境のせいで予想外の挙動に遭わない、使いやすいDNSクライアントを作りたくなった。
      普段使っているGoで作り、どうしても必要でない限り外部依存を増やしたくなかったのでCLIフレームワークは使わなかった。特に、色や書式付きのヘルプテキストをレンダリングする小さな help.go ユーティリティを作った部分が気に入っている。
      時間が経つにつれて良い外部コントリビューションももらえたし、特に @jedisct1 が DNSCryptサポート を追加してくれたのは大きかった。v1.0のリリースは1年以上ずっと先延ばしになっていたけれど、生活や他のプロジェクト、それに少しの先延ばし癖が重なって、先週ようやく締め切りを決めて押し切った。
      ndots に関する記事: https://mrkaran.dev/posts/ndots-kubernetes/
  • 名前のセンスが素晴らしい。doggo は dig するのが好きな犬だから

    • 今日知ったけど dog もある。たぶん dig のよくあるタイプミスでもあるんだろうね
  • Dockerイメージがあるのもいい。ドキュメントに、実行後の掃除用の --rm と色表示用の -t オプションを加えるとよさそう。
    docker run --rm -it ghcr.io/mr-karan/doggo:latest mrkaran.dev MX

    • 気になるんだけど、依存関係のない DNS CLIユーティリティ のために、わざわざDockerコンテナを用意するだけの手間をかける理由ってある?
  • ちょっと間抜けな質問かもしれないけど、どうして出力が全部 2回ずつ 出るの?
    doggo google.com を実行すると 127.0.2.2:53127.0.2.3:53 から同じAレコードがそれぞれ出てきて、doggo news.ycombinator.com でも同じように2つのネームサーバーの結果が表示される

    • 設定された ネームサーバーごとに1回ずつ 出力されているように見える。実際にはまれだけど異なる答えを返すこともあるから、そのためだと思う
    • 自分のAdGuard DNSサーバーで試したら項目は1つだけだった。ネームサーバー設定に関係していそう。
      @1.1.1.1 みたいなカスタムネームサーバーを指定して再現できる? doggo google.com --short142.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 を思い出す

    • doggo のGitHub READMEによると、Rustで書かれた dog に完全に着想を得ていて、Rustは知らないけれど機能を追加したかったので、GoでDNSクライアントを一から書いてみる良い機会にしたとのこと。
      それで名前も dog + go => doggo になった
    • 残念ながら dogメンテナンスされていない ように見える
  • こういうツールってGoで書かれることが多いけど、何か理由があるのかな? 標準ライブラリ のおかげなのか、それとも単なる偶然なのか気になる

    • Goは基本的にたいてい 静的コンパイルされたバイナリ を作ってくれる。ランタイムも、インタープリタも、依存関係もいらない。
      Python、Java、JavaScript、C# などで同じことを言うのは難しい
    • 文化的な理由かもしれない。Goは DevOps/クラウドインフラ の分野で露出が多い。
      k8s や Terraform、その provider のような多くのツールがGoで書かれていて、社内ツール作成ではPythonと人気を競っている印象
    • このケースでは、作者がすでにGoを知っていたから使ったように見える。
      READMEによると、Rustで書かれた dog に着想を得たが、Rustは知らないものの機能を追加したかったので、GoでDNSクライアントを自作してみたとのこと。だから名前も dog + go => doggo
      https://github.com/ogham/dog
    • Goは仕事を終わらせてくれるし、その成果物は今後も長く持つ
    • もちろん、名前をダジャレにできるからでもある
  • これは Dog と関係ある? 機能はほぼ同じに見える。
    どちらも実行する特定のクエリ(A、AAAA など)を要求するけど、なぜデフォルトを全レコードへのクエリにしないんだろう? 少なくとも単一ドメインを問い合わせるときはそうできそうに思える。
    https://github.com/mr-karan/doggo

    • ここでいう 全レコード とは正確には何を意味するの? dig はデフォルトでAレコードだけを表示するし、自分もその動作を同じにした。
      可能なすべてのレコードタイプ全部のことを言っているのか、それとも MX, AAAA, A, CNAME, TXT みたいな一般的なものをいくつか指しているのか気になる
  • 1.0リリースおめでとう。doggo はしばらくの間、自分の メインのDNSツール だったし、本当に気に入っている