HTTP経由で世界中のネームサーバーを使いDNSクエリを実行する

本稿では、HTTP経由でDNSクエリを実行できるAPIサービスについて紹介します。
これらサービスを活用することで、DNSレコード情報を、世界のさまざまな場所にある複数のネームサーバーを使って照合することが可能です。

これにより、ドメインのレコードに変更を加えた際の「DNS伝播（DNS propagation）」や、「位置情報認識DNSサーバー（geo-aware DNS servers）」、および「エニーキャストDNS展開（Anycast DNS deployments）」の検証とトラブルシューティングに使用することができます。

# HTTP経由でDNSクエリを実行できるAPIサービス
|サービス名|URL|特徴|
|:---|:---|:---|
|Multilocation DNS Looking Glass（DNS-LG）|http://www.dns-lg.com/|9か国に24のノードを使い分けることができる。HTTP経由でDNSクエリを実行し、IPv4アドレスとIPv6アドレスの両方の逆PTRレコードの取得が可能。JSONエンコードされたDNS応答を出力|
|RRDA(RRDA REST DNS API)|https://www.statdns.com/tools/|DNS-LGをサポートするAPI、オープンソースプロジェクトとして公開|
|DNS Bajaj|http://www.zonecut.net/dns/index.cgi|ネームサーバー間の相互関係を[Graphviz](http://www.graphviz.org/)を使ってグラフ描画することができる。|
|DNS Propagation Checker|https://www.whatsmydns.net/|DNS伝播の状況について世界地図に描画し確認することができる。|
|Multi Server DNS Lookup (DNS Lookingglass)|https://isc.sans.edu/tools/dnslookup.html|ホスト名に対して一括して異なる国のDNSサーバにて検索ができる。|
|Dig web interface|https://www.digwebinterface.com/|Webインターフェイスをもつdigコマンド。詳細なオプションスイッチを指定することができる。|
|Web-based Dig|https://networking.ringofsaturn.com/Tools/dig.php| |
|KLOTH.NET|http://www.kloth.net/services/dig.php| |
|HScripts.com|https://www.hscripts.com/tools/HDNT/dns-record.php| |

# Multilocation DNS Looking Glass（DNS-LG）の使用例
ここでは、DNS-LGを使用し、ホストアドレスの取得（Aレコード）を行います。
次の実行例では、エニーキャストノードとして、`google1`（8.8.8.8, AS15169）を指定しています。DNS-LGではこのほか24のノードを使い分けることが可能です。詳細な指定方法は[DNS-LGのサイト](http://www.dns-lg.com/)を確認してください。

```bash
$ curl http://www.dns-lg.com/google1/qiita.com/a 
{
    "question": [
        {
            "name": "qiita.com.",
            "type": "A",
            "class": "IN"
        }
    ],
    "answer": [
        {
            "name": "qiita.com.",
            "type": "A",
            "class": "IN",
            "ttl": 59,
            "rdlength": 4,
            "rdata": "52.199.34.118"
        },
        {
            "name": "qiita.com.",
            "type": "A",
            "class": "IN",
            "ttl": 59,
            "rdlength": 4,
            "rdata": "52.199.172.165"
        },
        {
            "name": "qiita.com.",
            "type": "A",
            "class": "IN",
            "ttl": 59,
            "rdlength": 4,
            "rdata": "54.65.34.62"
        }
    ]
}
```

さらに、`jq`コマンドを使い、JSON形式のデータからIPアドレスの値だけを抽出します。

```bash
$ curl -s http://www.dns-lg.com/google1/qiita.com/a | jq -r '.answer[].rdata'
52.199.34.118
52.199.172.165
54.65.34.62
```

なお、`curl`コマンドの`-s`オプションは、不要なプログレスメーターを除去するために指定してあります。

```プログレスメーター
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   735  100   735    0     0   1101      0 --:--:-- --:--:-- --:--:--  1101
```

# dig コマンドの使用例
ローカル環境では、`dig`コマンドを実行し、DNSクエリを実行することができます。
ここでは、`+noall`オプションを指定し、統計、コメント、その他のIPアドレスに直接関連しない情報を無効にしています。
また、`+answer`オプションを指定し、必要なDNSサーバーからの回答のみを出力するように指定しています。

```bash
$ dig +noall +answer qiita.com
qiita.com.		21	IN	A	52.199.172.165
qiita.com.		21	IN	A	54.65.34.62
qiita.com.		21	IN	A	52.199.34.118
```

`+short`オプションを指定し、IPアドレス情報のみを出力するように指定しています。

```bash
$ dig qiita.com +short
52.199.172.165
54.65.34.62
52.199.34.118
```

# dig コマンドの batch mode
`dig`コマンドでは、ドメイン名のリストに従って再帰的に調査するモードがあります。これを batch mode と呼びます。

1. エディタを使用し、新規テキストファイルを作成します。ここでは、`nano digginIt01.txt`または`nano digginIt02.txt`コマンド構文を実行します。

    ```
    $ nano digginIt01.txt
    ```

2. 新規テキストファイルにて、ドメイン名のリストを作成します。ここでは異なるオプションスイッチを指定した二つの例を示しています。なお、コマンドを正しく機能させるためには、それぞれのコマンドが独立した行になっていることに注意してください。

    ```digginIt01.txt
    +nocmd +noall +answer qiita.com
    +nocmd +noall +answer blog.qiita.com
    ```

    ```digginIt02.txt
    +short qiita.com
    +short blog.qiita.com
    ```

3. `dig`コマンドにて`-f`オプションを指定し、`digginIt0*.txt`ファイルを読み込みます。このときの実行結果は次のとおりです。

    ```digginIt01.txtを指定した実行結果
    $ dig -f digginIt01.txt
    qiita.com.              5       IN      A       52.199.172.165
    qiita.com.              5       IN      A       54.65.34.62
    qiita.com.              5       IN      A       52.199.34.118
    blog.qiita.com.         5       IN      A       13.35.67.23
    blog.qiita.com.         5       IN      A       13.35.67.56
    blog.qiita.com.         5       IN      A       13.35.67.76
    blog.qiita.com.         5       IN      A       13.35.67.89
    ```

    ```digginIt02.txtを指定した実行結果
    $ dig -f digginIt02.txt
    52.199.172.165
    54.65.34.62
    52.199.34.118
    13.35.67.23
    13.35.67.76
    13.35.67.56
    13.35.67.89
    ```

# 参考情報
- SecurityTrails, IP lookup: Top 8 ways to perform an IP address lookup, https://securitytrails.com/blog/ip-lookup-strategy
- Lee Allen (著), Kevin Cardwell (著), Advanced Penetration Testing for Highly-Secured Environments - Second Edition
- jq コマンドを使う日常のご紹介, https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af