6 ポイント 投稿者 GN⁺ 2024-01-08 | 1件のコメント | WhatsAppで共有
  • dns.toys は、DNS クエリをコマンドインターフェースのように活用し、ターミナルで dig だけで小さなユーティリティを実行できる DNS サーバー
  • 世界時計、天気、70種類以上の単位変換、日次為替レートに基づく通貨変換のような、検索ページを開くのが面倒な作業をその場で処理できる
  • 開発者に必要な CIDR 範囲計算、UUID v4・NanoID 生成、Unix epoch 変換、基数変換のような機能も提供
  • 呼び出しは @dns.toys を指定する方式で、Bash・Fish・Zsh では dy alias を追加してより短く使える
  • 実務ツールというより、ターミナル内で素早く確認・計算する楽しさと利便性を狙ったサービスで、簡単な参照作業に向いている

DNS クエリで実行するターミナルユーティリティ

  • dns.toys は複数の機能を DNS サーバーとして提供し、ドメイン形式のクエリを dig で送って実行する
  • 時間・天気・変換

    • dig mumbai.time @dns.toys: 都市の 現在時刻 を表示
    • dig 2023-05-28T14:00-mumbai-paris/fr.time @dns.toys: 都市間の タイムゾーン変換
    • dig mumbai.weather @dns.toys: 都市の天気を表示
    • dig 42km-mi.unit @dns.toys: 70種類以上の単位間変換
    • dig 100USD-INR.fx @dns.toys: 日次為替レートに基づく通貨変換
    • dig -4 ip @dns.toys: IPv4 または IPv6 アドレスを確認
  • 計算・開発者向け機能

    • dig 10.0.0.0/24.cidr @dns.toys: サブネットで最初と最後の使用可能 IP を計算
    • dig 100dec-hex.base @dns.toys: hex、dec、oct、bin 間の 基数変換
    • dig 784783800.epoch @dns.toys: Unix timestamp を読める日付に変換
    • dig 5.uuid @dns.toys: UUID v4 を生成
    • dig 5.10.nanoid @dns.toys: 指定した長さと個数で NanoID を生成
  • おもちゃ機能

    • dig pi @dns.toys: Pi の数値を表示
    • dig 3d20/2.dice @dns.toys: 指定した個数と面数でサイコロを振る
    • dig 2.coin @dns.toys: コイン投げ
    • dig 1-100.rand @dns.toys: 範囲内の乱数を生成
    • dig excuse @dns.toys: ランダムな開発者の言い訳を表示

短く呼び出すためのシェル alias

  • dy 短縮コマンドを追加すると dy mumbai.weather のようにより短く呼び出せる
    • Bash: alias dy="dig +short @dns.toys"~/.bashrc に追加
    • Fish: alias dy="dig +noall +answer +additional $argv @dns.toys"~/.config/fish/config.fish に追加
    • Zsh: alias dy="dig +short @dns.toys"~/.zshrc に追加
  • ターミナルで多くの時間を過ごすユーザーは、重い検索ページを開かずに 単位変換 や天気確認のような作業を素早く処理できる

1件のコメント

 
GN⁺ 2024-01-08
Hacker News のコメント
  • 以前、自分で動的 DNS ユーティリティを作ったとき、自分のマシンの IP アドレスを「安定的に」計算するために使っていたちょっとしたトリックを思い出した
    OpenDNS リゾルバ(resolver1.opendns.com など)は、myip.opendns.com を実際の IP アドレスに解決してくれる。接続状態に応じて A または AAAA レコードが返り、これらのリゾルバの IP はたいてい エニーキャスト IP なので、いつ落ちるかわからない中央集権的な HTTP サービスに問い合わせるより少し速いだろうと信じたい
    もちろん OpenDNS もいつか消えるかもしれないが、無数の「自分の IP アドレスは何?」HTTP サービスよりはそのリスクがましだと思う。DNS はもともとドメイン名より広い範囲のデータを扱うよう意図されていた、という話も聞いたことがあり、TXT レコードのようなものがその痕跡だ。このサイトは DNS で得られる実用性 をうまく示している

    • Google と Akamai も DNS サービスを提供している
      dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
      dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
    • OpenDNS と YouTube では、どちらがより落ちやすいだろうか
      curl -4si0A "" https://www.youtube.com|sed -n '/ip=/{s/.*ip=//;s/\\.*//p;};'|uniq
      OpenDNS と Cloudflare では、どちらがより落ちやすいだろうか。下の方法はどの Cloudflare IP アドレスでも動作し、TLS も不要
      printf 'GET /cdn-cgi/trace HTTP/1.0\r\nHost: cloudflare.com |nc -vvn 104.18.25.13 80 |sed -n /ip=/p
      Cloudflare の IP 一覧は curl -4si0A "" https://api.cloudflare.com/client/v4/ips で取得できる。クライアント IP アドレスを Web ページや HTTP ヘッダーに表示するサイトは非常に多く、必ずしも「What is my IP」サイトである必要はない
      Cloudflare 経由の特定リクエストをブロックする Web サイトも選択肢になる。たとえば StackOverflow に User-Agent ヘッダーなしで HTTP リクエストを送ればよい
      curl -si40A "" http://stackoverflow.com|sed -n '/cf-footer-ip">/{s/.*">//;s/<.*//p;}'
      自分の IP アドレスが何十万もの Web サイトに表示されるのに、「What is my IP」サイトが成功したのはかなり驚きだ。DNS の有用性については、https://www.netmeister.org/blog/dns-rrs.html も参考になる
    • IP を返す HTTP サービスの多くは、稼働率 の面であまり信頼できなさそうだという意見に同意する
      ただし Cloudflare が運営する https://icanhazip.com/ もあり、こちらのほうがより安定している可能性が高そうだ
      https://ipv4.icanhazip.com/
      https://ipv6.icanhazip.com/
    • とても良いアイデアだ。STUN プロトコル よりずっとシンプルに見える
  • Julia Evans の熱心なファンだが、DNS 関連の便利なおもちゃもいくつか作っている
    https://jvns.ca/
    https://dns-lookup.jvns.ca/
    https://messwithdns.net/

  • 関連記事
    DNS Toys - https://news.ycombinator.com/item?id=31704789 - 2022年6月、コメント104件
    DNS Toys: Useful utilities and services over DNS - https://news.ycombinator.com/item?id=31637226 - 2022年6月、コメント1件

  • このプロジェクトの作者が最近行った発表で、プロジェクトがどのように生まれたかという 面白い裏話 が語られている
    https://youtu.be/ANmFZ8rbmnc?si=ndEWH4xY2oxJuEnB

  • 奇妙なことに
    dig A0.0,0.0/0.0,90.0.aerial @dns.toys

    dig A0.0,0.0/90.0,0.0.aerial @dns.toys
    はどちらも TXT "aerial distance = 10007.06 KM" を返す
    赤道周長は 40,075.017km、極周長は 40,007.863km だ。地球が仮想的な 牛の形 をしていると仮定しても大きな害はなく、楕円体表面に沿った2点間の最短距離を求める厄介な級数を避けられる

    • 興味深いね。その2つの周長の値は、自分が思っていたより実際にはずっと近い
  • 少し関連するものとして、英国の事業者一覧を DNS ルックアップで提供するサービスもある。DNS サービスで DNS 以外のデータ を提供するという、同じ発想だ
    https://www.num.uk/
    ただ、ロードマップを見ると、もうサービスを維持していないようにも見える

    • 「濫用」という言葉は、「SOAP や XHR は HTTP の『濫用』だ」のような意味でない限り、使わないほうがよい
      IN(internet) クラスは今では進化の果てにそびえるセコイアのような存在だが、カンブリア紀には CH(chaos) や HS(hesiod) クラスもあった。そうしたプロジェクトの目的や目標を見直してみる価値はある
      むしろ今日の濫用は、再送のための 10 ミリ秒ウィンドウや qname 最小化のように、クラウドベースのウェブサービス、つまり「happy eyeballs」だけに最適化して、他のすべてを犠牲にしていることに近い。たとえば バッファブロート のような問題もあまり意識されていないように見える。A/AAAA 解決の外側にも、まったく別の世界がある
      インターネット会議の廊下で、ポケットプロテクターを付けた 2 人がチャンバラをしている、少なくとも鉛筆で突き合っているような光景も、別に珍しくはない。RFC は "Request For Comments" であり、BCP(Best Current Practice) は日常的に無視される
  • 気に入った。ただ dig がすべてのプラットフォームに入っていればよかったのにと思う
    Windows では使えないのでいつも苛立つし、確認してみたら Debian にも標準では入っていない。もちろん簡単にインストールできる。OpenBSD と Mac OS X にはあるので、それはよい

    • Dog は クロスプラットフォーム で、JSON 出力のような便利な機能もある
      https://dns.lookup.dog/
    • 必ずしも dig を使う必要はない。nslookuphost でも動く
      Windows にも DNS ルックアップ用のツールは何かあるはずだ
  • このスレッドの愚か者のために、5 歳児に説明するみたいに話してもらえる? 面白いのは分かるけど、理解できない。どう動くのかも分からないし、自分が無知なのは分かっている

    • 本質的には、カスタム DNS サーバー を通じて存在しないドメインを解決している
      たとえば dig 100USD-INR.fx @dns.toys は、「dns.toys を DNS サーバーとして使って 100USD-INR.fx を解決しろ」という意味だ。すると実際の答えを含んだ TXT レコードが返ってくる
      .fx は存在しないドメインなので、誰かになりすましているわけではないし、@dns.toys@8.8.8.8 のようなものに変えれば何も解決されない
    • news.ycombinator.com のようなサイトを思い浮かべればよい。ブラウザはその名前で特別なサーバーに IP を問い合わせる。そのドメインには、ざっくり言えばこんな形で保存されているかもしれない
      A IP = ...1
      AAAA IP = ...2
      ここで A はレコード種別だ。しかし、他のレコード種別もある
      TXT gender = 'male'
      ふつう DNS について暗黙のうちに真だと思われている前提がいくつかある。人々は DNS を他のサービスへ行くための交換台のように使い、その中の値はたいてい静的だというものだ
      ここではドメインに応じて変わる値を返しているので、まったく違うことをしている。これを実現するには 自作の DNS サーバー が必要だが、DNS プロトコル自体はかなり単純だ
      このハックが巧妙なのは、DNS が最も広く使われ、最もよくサポートされているプロトコルの 1 つであり、主要なプログラミングライブラリがどれも対応していて、OS に最初から入っているコマンドラインツールも多いからだ。DNS 上でサービスとして提供すれば、最小限の依存関係でツールやライブラリからアクセスできる
      また DNS を一般的なインターネットサービスの交換台ではなく、アプリケーションサービス として直接使うことになり、DNS システムはこう使うものだという一般的な前提をひっくり返す。既存ソフトウェアに組み込むときも複雑な統合がいらず、DNS リクエストは一般的なウェブ API より直感的だとさえ言える。検閲耐性の面でも利点が大きい可能性がある
    • DNS サーバーを、別のポートと別のプロトコルを使う特殊なウェブサーバーだと思えばよい
      HTTP でウェブサーバーにリクエストするように、DNS プロトコルで DNS サーバーとやり取りする。telnet で HTTP や SMTP リクエストを真似するのと似ていて、特定のルール集合に従って特定種類のサーバーと通信しているわけだ
      このサーバーは結果を返す前にある程度の計算を行うが、そこが通常は静的だと期待される大半の DNS レコードと異なる点だ
    • DNS プロトコルは、単に UDP 上のテキストというわけではない。DNS リクエストを作るとき、システムはソケットを開いてその中に google.com と書き、応答を読む、というものではない
      サーバーが DNS サーバーとして正しく設定されていれば、適切な DNS レコードを再びテキストで返す。google.com は負荷分散に使われる何らかのサブドメインを指す CNAME なので、サーバーは CNAME blabla.google.com のように答え、望むなら blabla.google.com まで一緒に解決して追加問い合わせの手間を省くこともできる
      ある RFC で定義された DNS プロトコルでは、リクエストとレスポンスを特定の方法で行うよう定めている。そのうちの 1 つは、存在しないトップレベルドメイン、たとえば現時点では存在しない .time に対して、サーバーは nxdomain を返さなければならないというものだ。しかし現実には、サーバーが現在時刻のような任意の値を返すことを止める技術的な仕組みはない
      一般論として見れば、公開・私設を問わず DNS 運用者がデタラメなデータを返さないだろうという期待だけが、利用者を守っているすべてだ。HTTPS はある程度これを緩和するが、DNS レコード自体は事実上 いくらでも偽造可能 で、後から取り消す方法もない
  • これらの機能が dns.toys のどのサブドメインでも提供されていないのは意外だ。そうすれば特別なネームサーバーを使わなくても解決できるのに

    • デフォルトのネームサーバーを使うと、キャッシュのような一般的な DNS の複雑さ がすべて入り込んでくる
  • 最近は主にこれを使っている
    https://addr.tools/
    https://dnscheck.tools/
    https://myip.addr.tools/help