C# DnsClientを使用して指定したDNSでドメイン(ホスト名)のIP解決を行う

通常Windows上ではホスト名の解決は以下の順で行われる、らしい。

  1. クライアントは、クエリの対象の名前がクライアントのものであるかどうかを確認します。
  2. クライアントは、ローカルの Hosts ファイルを検索します。
  3. ドメイン ネーム システム (DNS) サーバーへのクエリが実行されます。
  4. 名前がまだ解決されていなければ、NetBIOS 名解決の順序がバックアップとして使用されます。

参考:Windows サポート - Microsoft TCP/IP のホスト名解決の順序

上記の 3 のみを行う必要があったので「DnsClient」を使ってみることにした。
NuGet で検索すれば簡単に見つかるのでプロジェクトへインストールして使用する。

NuGet-DnsClient

ライセンス

APACHE LICENSE, VERSION 2.0(英語原文)
APACHE LICENSE, VERSION 2.0(日本語版)

環境

Windows10 pro 64bit
Visual Studio 2019

サンプルソース

DNSラウンドロビンにより一つのドメイン名に複数のIPアドレスを割り当てることも可能なので、アドレスリストを返す。

using System.Net;
using DnsClient;

/// <summary>
/// 指定したDNSサーバーで、ドメインのIP解決を行いアドレスリストを取得する
/// </summary>
/// <param name="host">ホスト名、ドメイン</param>
/// <param name="dnsServer">指定DNSアドレス</param>
/// <param name="dnsPort">基本:53ポート</param>
/// <returns>IPAddressリスト</returns>
public static List<IPAddress> DnsResolveHostAddresses(string host, string dnsServer = "192.168.0.1", int dnsPort = 53)
{
    LookupClient lookupClient = new LookupClient(new IPAddress(new byte[] {192,168,0,1 }), 53);
    DnsQuestion qes = new DnsQuestion(host, QueryType.A, QueryClass.IN);
    List<IPAddress> addrs = new List<IPAddress>();
    var res = lookupClient.Query(qes);
    if(res != null)
    {
        foreach(var r in res.Answers)
        {
            if(r.RecordType == DnsClient.Protocol.ResourceRecordType.A && r.RecordClass == QueryClass.IN)
            {
                addrs.Add(((DnsClient.Protocol.ARecord)r).Address);
            }
        }
    }
    return addrs;
}

// 呼び出し方参考
// 私の環境での優先DNSサーバアドレスは 192.168.0.1 だが
// 環境にあわせて指定すること
DnsResolveHostAddresses("ドメイン", "192.168.0.1");

上記 DnsResolveHostAddresses() での「yahoo.co.jp」様ドメインの解決結果。複数のアドレスが取得できていることが分かる。

182.22.25.124
183.79.250.123
182.22.28.252
183.79.217.124
182.22.16.251
183.79.250.251
183.79.219.252

本当に hosts の検索が行われていないか

hosts に次の行を追加してサンプルソースと pingとで試してみる。

192.168.0.99 yahoo.co.jp

サンプルソースによる解決結果。順番は違うが同じアドレスが取得できた。

183.79.217.124
183.79.250.251
182.22.16.251
183.79.219.252
183.79.250.123
182.22.25.124
182.22.28.252

ping の結果。hosts 検索が行われ、「 192.168.0.99 」と解決されていることが分かる。

ping-dns-addr

ちなみに、nslookup は hosts 検索をしていないようだった。

nslookup-dns-addr