Contents
指定したドメインのNSレコードから、そのドメインを管理しているネームサーバーのホスト名を抽出
dnspython を使う。
実行方法:
上記のコードを get_ns_records.py のようなファイル名で保存します。
ターミナル(コマンドプロンプト)で以下のコマンドを実行します。
Bash
python get_ns_records.py
実行すると、ドメイン名の入力を求められるので、調査したいドメイン名(例: google.com や example.com)を入力してEnterキーを押してください。- そのドメインのNSレコード値(ネームサーバーのホスト名)がリスト形式で出力されます。
これで、指定したドメインの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)
