Contents

  1. history

指定したドメインのNSレコードから、そのドメインを管理しているネームサーバーのホスト名を抽出

dnspython を使う。

実行方法:

    上記のコードを get_ns_records.py のようなファイル名で保存します。

    ターミナル(コマンドプロンプト)で以下のコマンドを実行します。
    Bash

    python get_ns_records.py

    実行すると、ドメイン名の入力を求められるので、調査したいドメイン名(例: google.com や example.com)を入力してEnterキーを押してください。

これで、指定したドメインのNSレコードから、そのドメインを管理しているネームサーバーのホスト名を抽出できます。

# -*- coding: utf-8 -*-

# 必要なライブラリをインポート
import dns.resolver
import sys # 標準エラー出力用

def get_ns_record_values(domain_name):
    """
    指定されたドメイン名のNSレコードからレコード値(ネームサーバーのホスト名)を取得します。

    Args:
        domain_name (str): NSレコードを照会するドメイン名。

    Returns:
        list[str]: NSレコード値(ネームサーバーのホスト名)のリスト。
                   取得に失敗した場合やレコードが存在しない場合は空のリストを返します。
        None:      ドメインが存在しないなど、致命的なエラーが発生した場合。
                   (呼び出し元で判定しやすいように)
    """
    ns_values = []
    try:
        # 指定されたドメイン名とレコードタイプ'NS'でDNS解決を試みる
        # dns.resolver.resolve() は推奨されるメソッドです
        answers = dns.resolver.resolve(domain_name, 'NS')

        # 回答 (dns.resolver.Answer オブジェクト) の各レコードデータ (rdata) から
        # ターゲット(ネームサーバー名)を取得
        for rdata in answers:
            # rdata.target は dns.name.Name オブジェクトなので、
            # 末尾のドットを含めて文字列に変換するために str() を使用
            ns_values.append(str(rdata.target))

        return ns_values

    except dns.resolver.NXDOMAIN:
        # ドメインが存在しない場合のエラー
        print(f"エラー: ドメイン '{domain_name}' が見つかりません。", file=sys.stderr)
        return None # 致命的なエラーとして None を返す
    except dns.resolver.NoAnswer:
        # レコードが見つからない (ドメイン自体は存在する可能性がある)
        print(f"情報: ドメイン '{domain_name}' にはNSレコードが設定されていません。", file=sys.stderr)
        return [] # レコードがないだけなので空リスト
    except dns.exception.Timeout:
        # DNSクエリがタイムアウトした場合のエラー
        print(f"エラー: ドメイン '{domain_name}' のDNSクエリがタイムアウトしました。", file=sys.stderr)
        return [] # 一時的な問題かもしれないので空リスト
    except dns.resolver.NoNameservers:
         # 権威ネームサーバーに到達できない場合のエラー
         print(f"エラー: ドメイン '{domain_name}' の権威ネームサーバーに到達できませんでした。", file=sys.stderr)
         return [] # 一時的な問題かもしれないので空リスト
    except Exception as e:
        # その他の予期せぬエラー
        print(f"予期せぬエラーが発生しました ({type(e).__name__}): {e}", file=sys.stderr)
        return [] # 予期せぬエラーでも空リスト

# --- メインの実行部分 ---
if __name__ == "__main__":
    # ユーザーにドメイン名の入力を促す
    target_domain = input("NSレコードを取得したいドメイン名を入力してください (例: google.com): ")

    if target_domain:
        print(f"\n'{target_domain}' のNSレコードを検索中...")
        # 関数を呼び出してNSレコード値を取得
        ns_records = get_ns_record_values(target_domain)

        # 結果を出力
        if ns_records is None:
            # ドメインが存在しない場合など (エラーメッセージは関数内で出力済み)
            print(f"'{target_domain}' のNSレコード検索を中止しました。")
        elif ns_records:
            print(f"\n--- {target_domain} の NSレコード値 ---")
            for record in ns_records:
                print(record)
            print("------------------------------------")
        else:
            # レコードが見つからなかった、またはタイムアウト等で空リストが返された場合
            # (メッセージは関数内で出力されている場合もある)
            print(f"'{target_domain}' からNSレコード値を取得できませんでした、またはレコードが存在しません。")
    else:
        print("ドメイン名が入力されていません。", file=sys.stderr)

1. history


CategoryDns CategoryWatch CategoryTemplate

MoinQ: python/NS (last edited 2025-05-03 08:05:53 by ToshinoriMaeno)