🌊

DNSDBの使い方

2024/06/21に公開

はじめに

DNSDBを使う機会があったので備忘録を兼ねてざっくりとした使い方を説明します。
API_KEYを取得している前提で進めます。
v1とv2の二種類がありますが、v2について説明します。

とりあえずリクエスト

試しにリクエストを投げてみます。

curl -H 'X-API-Key:<API_KEY>' https://api.dnsdb.info/dnsdb/v2/lookup/rrset/name/google.com?limit=1

結果はJSONL形式で返ります。
公式にはHTTPヘッダにAccept:application/x-ndjsonを指定する必要があると書かれていますが、恐らく指定しなくてもデフォルトでJSONLが返ります。

{"cond":"begin"}
{"obj":{"count":2,"time_first":1594197706,"time_last":1594197706,"rrname":"google.com.","rrtype":"A","bailiwick":".","rdata":["64.233.161.100","64.233.161.101","64.233.161.102","64.233.161.113","64.233.161.138","64.233.161.139"]}}
{"cond":"limited","msg":"Result limit reached"}

正常な応答の場合、最初の1行は{"cond":"begin"}で始まり、最後の1行は{"cond":"limited"}もしくは{"cond":"succeeded"}で終わります。
すなわち、最後の1行が{"cond":"limited"}もしくは{"cond":"succeeded"}で終了していない場合は正しい応答ではないと想定されます。

API Key

X-API-KeyヘッダにAPI_KEYを渡す必要があります。
誤ったAPI_KEYを渡した場合やX-API-Keyヘッダが存在しない場合にはステータスコード403が返ります。

APIの種類

  • lookup
  • summarize
  • ping
  • rate_limit
    の4種類が存在しますが、主に使うのは最初の2つです。
    Base URLは https://api.dnsdb.info/dnsdb/v2/ です。

lookup API

lookup APIのは2つの検索方法が存在します。

  • rrset
  • rdata

rrset

RRsetを検索します。

lookup/rrset/TYPE/VALUE/RRTYPE/BAILIWICK
  • TYPE(必須):nameもしくはraw
  • VALUE(必須):nameの場合ドメイン名(前方一致、後方一致可)
  • RRTYPE(任意):デフォルトはANY
  • BAILIWICK(任意)

bailiwickとは

bailiwickについては公式でも説明されています。公式ドキュメントによれば、

passive DNSレプリケーションで観測されるDNSDBにおけるRRsetの"bailiwick"は、RRsetを提供するネームサーバーに委任された最も近いゾーンである。ゾーンファイルで観測されるDNSDBにおけるRRsetの"bailiwick"は、単に RRsetを含むゾーン名である。

とあります。
詳細は別記事に書きました。
https://zenn.dev/1507t/articles/3c26a2692f6718
DNSDBにおけるbailiwick(恐らく内部名のことを指している)とは、RFC8499によるシブリングドメインであると推察されます。

rdata

RDataからの逆lookupを行います。

lookup/rdata/TYPE/VALUE/RRTYPE
  • TYPE(必須):name, ip, rawのいずれか
  • VALUE(必須):nameの場合ドメイン名(前方一致、後方一致可)、ipの場合IPv4/IPv6のアドレス・プレフィックス長・アドレス範囲(スラッシュはカンマに変える必要あり)
  • RRTYPE(任意):ipの場合はA,AAAA,ANYのいずれかのみ、デフォルトはANY

例えば、Aレコードが142.250.207.46であるrdataを調べたいときには、lookup/rdata/ip/142.250.207.46/Aとします。

summarize API

summarize APIはlookup APIの結果を要約します。

クエリパラメータについて

  • limit=0とすれば最大数の結果が返る
  • aggr=tとすれば同一のrrsetが集約されなくなる
  • offset=<自然数>とした場合には、結果の順序が保持されない・結果が欠落する・結果が重複する可能性がある(クエリ毎にレスポンスを再計算するため)
  • time_*の各パラメータは、現在時刻を基準とした負数(秒)を与えることができる

拡張機能

Chromeの拡張機能を使うとGUIで簡単にリクエストできます。
公式ドキュメントに記載されていないFlexible Searchも可能です。
内部ではdnsdb/v2/glob/で始まるURLを叩いているようです(内部で叩いているURLはRecent Queriesのタブから確認できます)。

参考

公式ドキュメント

RFC

Discussion