「C Sharpとネットワーク - DNS」の版間の差分

提供: MochiuWiki : SUSE, EC, PCB

Wiki がページ「DNSレコードの存在を確認する方法(C Sharp)」を「C Sharpとネットワーク - DNS」に、リダイレクトを残さずに移動しました
編集の要約なし
1行目: 1行目:
== 概要 ==
== 概要 ==
DNSレコードの存在を確認するには、DnsClient.NETというライブラリを使用する。<br>
 
ここでは、調べたい対象のDNSのリストが記述されたファイルを順番に読み込み、存在しない場合は別ファイルに書き込む処理を行う。<br>
<br><br>
<br><br>


== サンプルコード ==
== DNSレコードの確認 ==
サンプルコードでは、LookupClientのQueryメソッドにて、対象のドメインとレコードの種類(AおよびNS)を指定して、<br>
==== DnsClient.NETライブラリとは ====
結果が0件なら存在しないと判断する。<br>
DnsClient.NETライブラリは、.NET環境で使用できる高機能なDNS (Domain Name System) クライアントライブラリである。<br>
<br>
<br>
MXレコードを対象としているが、QueryType(Enum)でレコードの種類(AおよびNS)が定義されているので、<br>
DnsClient.NETライブラリの特徴および用途を以下に示す。<br>
様々な種類のレコードを対象に調べることができる。<br>
* 主な機能
** DNSクエリの実行 (A、AAAA、CNAME、MX、NS、PTR、SOA、SRV、TXTレコード等)
**: 例: DNSレコードの存在を確認する場合
** 非同期DNSルックアップ
** DNSキャッシュのサポート
** DNSSEC (DNS Security Extensions) のサポート
** IPv4およびIPv6のサポート
<br>
* 使用目的
** ドメイン名の解決
** メールサーバーの検索 (MXレコード)
** サービスディスカバリ (SRVレコード)
** リバースDNSルックアップ
** カスタムDNSサーバの使用
<br>
* メリット
** パフォーマンスの最適化
**: システムのDNSリゾルバよりも高速な場合がある。
** 細かな制御
**: タイムアウト、リトライ、DNSサーバの選択などを詳細に設定できる。
** クロスプラットフォーム
**: Windows、Linux、MacOSで動作可能。
** 豊富な機能
**: 標準的なDNS操作に加えて、高度な機能も提供している。
<br>
* 一般的な使用シナリオ
** マイクロサービスアーキテクチャでのサービスディスカバリ
** ネットワーク診断ツール
** メールシステムの実装
** カスタムネットワークアプリケーション
<br>
==== DnsClient.NETライブラリのインストール ====
===== Riderからインストールする場合 =====
Riderを起動して、対象のプロジェクトを開く。<br>
<br>
[ツール]メニューバー - [NuGet] - [パッケージマネージャーの管理]を選択して、NuGetパッケージマネージャーを開く。<br>
または、ソリューションエクスプローラでプロジェクトを右クリックして、[NuGetパッケージの管理]を選択して、NuGetパッケージマネージャーを開く。<br>
<br>
次に、DnsClient.NETライブラリを検索する。<br>
検索バーにて、<u>DnsClient.NET</u>と入力する。<br>
<br>
DnsClient.NETライブラリのインストールする。<br>
検索結果からDnsClient.NETライブラリを選択して、[インストール]ボタンを押下する。<br>
<br>
インストールが完了した後、[閉じる]ボタンを押下してNuGetパッケージマネージャーを閉じる。<br>
<br>
===== .NET CLIからインストールする場合 =====
プロジェクトのディレクトリに移動して、<code>dotnet</code>コマンドを実行する。<br>
<br>
# 最新の安定版のDnsClient.NETライブラリをインストールする場合
dotnet add package DnsClient.NET
# 特定のバージョンを指定する場合
# 例: DnsClient.NET 1.7.0ライブラリをインストール
dotnet add package DnsClient.NET --version 1.7.0
<br>
ライブラリを追加した後、依存関係を復元する。<br>
dotnet restore
<br>
==== DNSレコードタイプの確認 ====
以下の例では、duckduckgo.comから複数のDNSレコードタイプを取得および表示している。<br>
<br>
# LookupClientクラスのインスタンスを生成する。
# 取得するレコードタイプの配列を定義する。
# 各レコードタイプに対して、DNSクエリを送信する。
# 結果を取得して、レコードタイプに応じて表示する。
<br>
<u>※注意</u><br>
<u>PTRレコードの逆引きはIPアドレスに対して行うものであることに注意する。</u><br>
<u>IPアドレスを逆にした形式 (例: 4.4.8.8.in-addr.arpa) を使用する。</u><br>
<br>
<u>SRVレコードは特定のサービスに対して使用されるため、適切なサービス名とプロトコルを指定する必要がある。</u><br>
<br>
<syntaxhighlight lang="c#">
using System;
using System.Threading.Tasks;
using DnsClient;
class Program
{
    public static async Task Main(string[] args)
    {
      var lookup = new LookupClient();
      var domain = "duckduckgo.com";
      var recordTypes = new[] {
          QueryType.A, QueryType.AAAA, QueryType.CNAME,
          QueryType.MX, QueryType.NS, QueryType.PTR,
          QueryType.SOA, QueryType.SRV, QueryType.TXT
      };
      foreach (var recordType in recordTypes) {
          Console.WriteLine($"--- {recordType} Records for {domain} ---");
          var result = await lookup.QueryAsync(domain, recordType);
          if (result.Answers.Count == 0) {
              Console.WriteLine($"No {recordType} records found.");
              continue;
          }
          foreach (var record in result.Answers) {
            switch (record)
            {
                case ARecord a:
                  Console.WriteLine($"A Record: {a.Address}");
                  break;
                case AaaaRecord aaaa:
                  Console.WriteLine($"AAAA Record: {aaaa.Address}");
                  break;
                case CNameRecord cname:
                  Console.WriteLine($"CNAME Record: {cname.CanonicalName}");
                  break;
                case MxRecord mx:
                  Console.WriteLine($"MX Record: {mx.Exchange} (Preference: {mx.Preference})");
                  break;
                case NsRecord ns:
                  Console.WriteLine($"NS Record: {ns.NSDName}");
                  break;
                case PtrRecord ptr:
                  Console.WriteLine($"PTR Record: {ptr.PtrDomainName}");
                  break;
                case SoaRecord soa:
                  Console.WriteLine($"SOA Record: Primary NS: {soa.MName}, Responsible: {soa.RName}");
                  break;
                case SrvRecord srv:
                  Console.WriteLine($"SRV Record: Target: {srv.Target}, Port: {srv.Port}, Priority: {srv.Priority}, Weight: {srv.Weight}");
                  break;
                case TxtRecord txt:
                  Console.WriteLine($"TXT Record: {string.Join(", ", txt.Text)}");
                  break;
                default:
                  Console.WriteLine($"Unknown Record Type: {record}");
                  break;
            }
          }
      }
    }
}
</syntaxhighlight>
<br>
==== DNSサーバの確認 ====
以下の例では、対象のDNSのリストが記述されたファイルを順番に読み込み、存在しない場合は別ファイルに書き込んでいる。<br>
<br>
<code>LookupClient</code>クラスの<code>Query</code>メソッドを使用して、対象のドメインとレコードの種類 (AレコードおよびNSレコード) を指定する。<br>
取得結果が無い場合は、存在しないと判断する。<br>
<br>
MXレコードを対象としているが、QueryType (Enum) でレコードの種類 (AレコードおよびNSレコード) が定義されているため、<br>
様々な種類のレコードを対象にすることができる。<br>
<br>
<br>
  <syntaxhighlight lang="c#">
  <syntaxhighlight lang="c#">
  using System;
  using System;
  using System.IO;
  using System.IO;
  using DnsClient; // DnsClientを参照に追加
  using DnsClient;
   
   
  namespace DNSRecordCheck
  namespace DNSRecordCheck;
 
class Program
  {
  {
     class Program
     public static async void Main(string[] args)
     {
     {
       static async void Main(string[] args)
       // LookupClientクラスのインスタンスを生成
      {
      var lookupClient = new LookupClient();
          // LookupClientクラスのインスタンスを生成
          var lookupClient = new LookupClient();
   
   
          using (var sreader = new StreamReader(@"C:\domains.txt"))
      using (var sreader = new StreamReader(@"C:\domains.txt")) {
           {
           while (!sreader.EndOfStream) {
            while (!sreader.EndOfStream)
             // 調査対象のリストから1行ずつ読み込み
             {
            var line = await sreader.ReadLineAsync();
                // 調査対象のリストから1行ずつ読み込み
                var line = await sreader.ReadLineAsync();
   
   
                using (var swriter = File.AppendText(@"C:\ignores.txt"))
            using (var swriter = File.AppendText(@"C:\ignores.txt")) {
                 {
                 // 読み込んだDNSを問い合わせる(QueryType.MX : MXレコードを対象とする)
                  // 読み込んだDNSを問い合わせる(QueryType.MX : MXレコードを対象とする)
                var result = lookupClient.Query(line, QueryType.MX);
                  var result = lookupClient.Query(line, QueryType.MX);
   
   
                  if (result.Answers.Count == 0)
                if (result.Answers.Count == 0) {
                   // 結果が0件の場合は存在しないと判断
                   // 結果が0件の場合は存在しないと判断
                      // 別ファイル(ignores.txt)に書き込む
                  // 別ファイル (ignores.txt) に書き込む
                      swriter.WriteLine(line);
                  swriter.WriteLine(line);
                  }
                 }
                 }
             }
             }

2024年8月21日 (水) 10:22時点における版

概要



DNSレコードの確認

DnsClient.NETライブラリとは

DnsClient.NETライブラリは、.NET環境で使用できる高機能なDNS (Domain Name System) クライアントライブラリである。

DnsClient.NETライブラリの特徴および用途を以下に示す。

  • 主な機能
    • DNSクエリの実行 (A、AAAA、CNAME、MX、NS、PTR、SOA、SRV、TXTレコード等)
      例: DNSレコードの存在を確認する場合
    • 非同期DNSルックアップ
    • DNSキャッシュのサポート
    • DNSSEC (DNS Security Extensions) のサポート
    • IPv4およびIPv6のサポート


  • 使用目的
    • ドメイン名の解決
    • メールサーバーの検索 (MXレコード)
    • サービスディスカバリ (SRVレコード)
    • リバースDNSルックアップ
    • カスタムDNSサーバの使用


  • メリット
    • パフォーマンスの最適化
      システムのDNSリゾルバよりも高速な場合がある。
    • 細かな制御
      タイムアウト、リトライ、DNSサーバの選択などを詳細に設定できる。
    • クロスプラットフォーム
      Windows、Linux、MacOSで動作可能。
    • 豊富な機能
      標準的なDNS操作に加えて、高度な機能も提供している。


  • 一般的な使用シナリオ
    • マイクロサービスアーキテクチャでのサービスディスカバリ
    • ネットワーク診断ツール
    • メールシステムの実装
    • カスタムネットワークアプリケーション


DnsClient.NETライブラリのインストール

Riderからインストールする場合

Riderを起動して、対象のプロジェクトを開く。

[ツール]メニューバー - [NuGet] - [パッケージマネージャーの管理]を選択して、NuGetパッケージマネージャーを開く。
または、ソリューションエクスプローラでプロジェクトを右クリックして、[NuGetパッケージの管理]を選択して、NuGetパッケージマネージャーを開く。

次に、DnsClient.NETライブラリを検索する。
検索バーにて、DnsClient.NETと入力する。

DnsClient.NETライブラリのインストールする。
検索結果からDnsClient.NETライブラリを選択して、[インストール]ボタンを押下する。

インストールが完了した後、[閉じる]ボタンを押下してNuGetパッケージマネージャーを閉じる。

.NET CLIからインストールする場合

プロジェクトのディレクトリに移動して、dotnetコマンドを実行する。

# 最新の安定版のDnsClient.NETライブラリをインストールする場合
dotnet add package DnsClient.NET

# 特定のバージョンを指定する場合
# 例: DnsClient.NET 1.7.0ライブラリをインストール
dotnet add package DnsClient.NET --version 1.7.0


ライブラリを追加した後、依存関係を復元する。

dotnet restore


DNSレコードタイプの確認

以下の例では、duckduckgo.comから複数のDNSレコードタイプを取得および表示している。

  1. LookupClientクラスのインスタンスを生成する。
  2. 取得するレコードタイプの配列を定義する。
  3. 各レコードタイプに対して、DNSクエリを送信する。
  4. 結果を取得して、レコードタイプに応じて表示する。


※注意
PTRレコードの逆引きはIPアドレスに対して行うものであることに注意する。
IPアドレスを逆にした形式 (例: 4.4.8.8.in-addr.arpa) を使用する。

SRVレコードは特定のサービスに対して使用されるため、適切なサービス名とプロトコルを指定する必要がある。

 using System;
 using System.Threading.Tasks;
 using DnsClient;
 
 class Program
 {
    public static async Task Main(string[] args)
    {
       var lookup = new LookupClient();
       var domain = "duckduckgo.com";
 
       var recordTypes = new[] { 
          QueryType.A, QueryType.AAAA, QueryType.CNAME, 
          QueryType.MX, QueryType.NS, QueryType.PTR, 
          QueryType.SOA, QueryType.SRV, QueryType.TXT 
       };
 
       foreach (var recordType in recordTypes) {
          Console.WriteLine($"--- {recordType} Records for {domain} ---");
          var result = await lookup.QueryAsync(domain, recordType);
 
          if (result.Answers.Count == 0) {
              Console.WriteLine($"No {recordType} records found.");
              continue;
          }
 
          foreach (var record in result.Answers) {
             switch (record)
             {
                case ARecord a:
                   Console.WriteLine($"A Record: {a.Address}");
                   break;
                case AaaaRecord aaaa:
                   Console.WriteLine($"AAAA Record: {aaaa.Address}");
                   break;
                case CNameRecord cname:
                   Console.WriteLine($"CNAME Record: {cname.CanonicalName}");
                   break;
                case MxRecord mx:
                   Console.WriteLine($"MX Record: {mx.Exchange} (Preference: {mx.Preference})");
                   break;
                case NsRecord ns:
                   Console.WriteLine($"NS Record: {ns.NSDName}");
                   break;
                case PtrRecord ptr:
                   Console.WriteLine($"PTR Record: {ptr.PtrDomainName}");
                   break;
                case SoaRecord soa:
                   Console.WriteLine($"SOA Record: Primary NS: {soa.MName}, Responsible: {soa.RName}");
                   break;
                case SrvRecord srv:
                   Console.WriteLine($"SRV Record: Target: {srv.Target}, Port: {srv.Port}, Priority: {srv.Priority}, Weight: {srv.Weight}");
                   break;
                case TxtRecord txt:
                   Console.WriteLine($"TXT Record: {string.Join(", ", txt.Text)}");
                   break;
                default:
                   Console.WriteLine($"Unknown Record Type: {record}");
                   break;
             }
          }
       }
    }
 }


DNSサーバの確認

以下の例では、対象のDNSのリストが記述されたファイルを順番に読み込み、存在しない場合は別ファイルに書き込んでいる。

LookupClientクラスのQueryメソッドを使用して、対象のドメインとレコードの種類 (AレコードおよびNSレコード) を指定する。
取得結果が無い場合は、存在しないと判断する。

MXレコードを対象としているが、QueryType (Enum) でレコードの種類 (AレコードおよびNSレコード) が定義されているため、
様々な種類のレコードを対象にすることができる。

 using System;
 using System.IO;
 using DnsClient;
 
 namespace DNSRecordCheck;

 class Program
 {
    public static async void Main(string[] args)
    {
       // LookupClientクラスのインスタンスを生成
       var lookupClient = new LookupClient();
 
       using (var sreader = new StreamReader(@"C:\domains.txt")) {
          while (!sreader.EndOfStream) {
             // 調査対象のリストから1行ずつ読み込み
             var line = await sreader.ReadLineAsync();
 
             using (var swriter = File.AppendText(@"C:\ignores.txt")) {
                // 読み込んだDNSを問い合わせる(QueryType.MX : MXレコードを対象とする)
                var result = lookupClient.Query(line, QueryType.MX);
 
                if (result.Answers.Count == 0) {
                   // 結果が0件の場合は存在しないと判断
                   // 別ファイル (ignores.txt) に書き込む
                   swriter.WriteLine(line);
                }
             }
          }
       }
    }
 }