DNS Toys (2022) リリース
(dns.toys)- dns.toys は、DNS クエリをコマンドインターフェースのように活用し、ターミナルで
digだけで小さなユーティリティを実行できる DNS サーバー - 世界時計、天気、70種類以上の単位変換、日次為替レートに基づく通貨変換のような、検索ページを開くのが面倒な作業をその場で処理できる
- 開発者に必要な CIDR 範囲計算、UUID v4・NanoID 生成、Unix epoch 変換、基数変換のような機能も提供
- 呼び出しは
@dns.toysを指定する方式で、Bash・Fish・Zsh ではdyalias を追加してより短く使える - 実務ツールというより、ターミナル内で素早く確認・計算する楽しさと利便性を狙ったサービスで、簡単な参照作業に向いている
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に追加
- Bash:
- ターミナルで多くの時間を過ごすユーザーは、重い検索ページを開かずに 単位変換 や天気確認のような作業を素早く処理できる
1件のコメント
Hacker News のコメント
以前、自分で動的 DNS ユーティリティを作ったとき、自分のマシンの IP アドレスを「安定的に」計算するために使っていたちょっとしたトリックを思い出した
OpenDNS リゾルバ(
resolver1.opendns.comなど)は、myip.opendns.comを実際の IP アドレスに解決してくれる。接続状態に応じて A または AAAA レコードが返り、これらのリゾルバの IP はたいてい エニーキャスト IP なので、いつ落ちるかわからない中央集権的な HTTP サービスに問い合わせるより少し速いだろうと信じたいもちろん OpenDNS もいつか消えるかもしれないが、無数の「自分の IP アドレスは何?」HTTP サービスよりはそのリスクがましだと思う。DNS はもともとドメイン名より広い範囲のデータを扱うよう意図されていた、という話も聞いたことがあり、TXT レコードのようなものがその痕跡だ。このサイトは DNS で得られる実用性 をうまく示している
dig @ns1-1.akamaitech.net ANY whoami.akamai.net +shortdig @ns1.google.com TXT o-o.myaddr.l.google.com +shortcurl -4si0A "" https://www.youtube.com|sed -n '/ip=/{s/.*ip=//;s/\\.*//p;};'|uniqOpenDNS と 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=/pCloudflare の 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 も参考になる
ただし Cloudflare が運営する https://icanhazip.com/ もあり、こちらのほうがより安定している可能性が高そうだ
https://ipv4.icanhazip.com/
https://ipv6.icanhazip.com/
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点間の最短距離を求める厄介な級数を避けられる
少し関連するものとして、英国の事業者一覧を DNS ルックアップで提供するサービスもある。DNS サービスで DNS 以外のデータ を提供するという、同じ発想だ
https://www.num.uk/
ただ、ロードマップを見ると、もうサービスを維持していないようにも見える
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 にはあるので、それはよい
https://dns.lookup.dog/
digを使う必要はない。nslookupやhostでも動くWindows にも DNS ルックアップ用のツールは何かあるはずだ
このスレッドの愚か者のために、5 歳児に説明するみたいに話してもらえる? 面白いのは分かるけど、理解できない。どう動くのかも分からないし、自分が無知なのは分かっている
たとえば
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 = ...1AAAA IP = ...2ここで
Aはレコード種別だ。しかし、他のレコード種別もあるTXT gender = 'male'ふつう DNS について暗黙のうちに真だと思われている前提がいくつかある。人々は DNS を他のサービスへ行くための交換台のように使い、その中の値はたいてい静的だというものだ
ここではドメインに応じて変わる値を返しているので、まったく違うことをしている。これを実現するには 自作の DNS サーバー が必要だが、DNS プロトコル自体はかなり単純だ
このハックが巧妙なのは、DNS が最も広く使われ、最もよくサポートされているプロトコルの 1 つであり、主要なプログラミングライブラリがどれも対応していて、OS に最初から入っているコマンドラインツールも多いからだ。DNS 上でサービスとして提供すれば、最小限の依存関係でツールやライブラリからアクセスできる
また DNS を一般的なインターネットサービスの交換台ではなく、アプリケーションサービス として直接使うことになり、DNS システムはこう使うものだという一般的な前提をひっくり返す。既存ソフトウェアに組み込むときも複雑な統合がいらず、DNS リクエストは一般的なウェブ API より直感的だとさえ言える。検閲耐性の面でも利点が大きい可能性がある
HTTP でウェブサーバーにリクエストするように、DNS プロトコルで DNS サーバーとやり取りする。
telnetで HTTP や SMTP リクエストを真似するのと似ていて、特定のルール集合に従って特定種類のサーバーと通信しているわけだこのサーバーは結果を返す前にある程度の計算を行うが、そこが通常は静的だと期待される大半の 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のどのサブドメインでも提供されていないのは意外だ。そうすれば特別なネームサーバーを使わなくても解決できるのに最近は主にこれを使っている
https://addr.tools/
https://dnscheck.tools/
https://myip.addr.tools/help