2026年6月11日

2026年6月11日

nslookup で TTL と NS を一括確認する方法|-debug と SOA の問い合わせで、全権威サーバーと親ゾーンの値を並べる

nslookup のふだんの表示には TTL が出ませんが、-debug を付けると各レコードの TTL が表示されます。さらに、権威サーバーに再帰なしで SOA を問い合わせると、多くのサーバーは SOA と一緒に NS の一覧も返すため、シリアル番号・SOA の TTL・NS の TTL を1回の実行でまとめて確認できます。この記事では、Windows に標準で入っている nslookup を使って TTL と NS を確かめる手順と、全権威サーバーや親ゾーン(.com や .jp)の値まで一覧にする PowerShell の例、読み違えやすい点を説明します。

ふだんの表示と -debug の表示

まず、ふつうに NS を問い合わせた場合です。

nslookup -type=NS example.com. 1.1.1.1
Server:  one.one.one.one
Address:  1.1.1.1

Non-authoritative answer:
example.com	nameserver = ns1.example.net
example.com	nameserver = ns2.example.net

ネームサーバーの名前は分かりますが、TTL はありません。ここに -debug を加えると、応答のヘッダーと各セクションがそのまま表示され、レコードごとに ttl = の行が付きます。

nslookup -debug -type=NS example.com. 1.1.1.1
    QUESTIONS:
	example.com, type = NS, class = IN
    ANSWERS:
    ->  example.com
	nameserver = ns1.example.net
	ttl = 75890 (21 hours 4 mins 50 secs)
    ->  example.com
	nameserver = ns2.example.net
	ttl = 75890 (21 hours 4 mins 50 secs)

出力の先頭には、問い合わせ先のアドレスを逆引きした結果(in-addr.arpa の行)も出ますが、調べたい名前とは関係ありません。QUESTIONS: に目的の名前が出ているブロックから読みます。値はいずれも説明用の例です。

キャッシュ経由の TTL は「残り時間」

上の例の 75890 は、ゾーンに設定された値ではありません。キャッシュサーバー(ここでは 1.1.1.1)は、答えを保存してからの経過時間を差し引いた残り時間を返します。同じ問い合わせを数秒おいて繰り返すと、数字が少しずつ減っていくのが分かります。

設定値を見たいときは、そのドメインの権威サーバーに直接、再帰なしで聞きます。-debug の header flags: に auth. answer が含まれていれば、権威サーバー自身の答え、つまり TTL は設定値そのものです。

SOA を聞いて、SOA と NS を一度に見る

権威サーバーに SOA を問い合わせると、多くのサーバーは答え(ANSWERS)に SOA を、AUTHORITY RECORDS にそのゾーンの NS を入れて返します。

nslookup -debug -norecurse -type=SOA example.com. ns1.example.net
    HEADER:
	opcode = QUERY, id = 2, rcode = NOERROR
	header flags:  response, auth. answer
	questions = 1,  answers = 1,  authority records = 2,  additional = 0

    QUESTIONS:
	example.com, type = SOA, class = IN
    ANSWERS:
    ->  example.com
	ttl = 3600 (1 hour)
	primary name server = ns1.example.net
	responsible mail addr = hostmaster.example.net
	serial  = 2026101601
	refresh = 10800 (3 hours)
	retry   = 3600 (1 hour)
	expire  = 86400 (1 day)
	default TTL = 3600 (1 hour)
    AUTHORITY RECORDS:
    ->  example.com
	nameserver = ns1.example.net
	ttl = 3600 (1 hour)
    ->  example.com
	nameserver = ns2.example.net
	ttl = 3600 (1 hour)

この1回の出力から、次の値をまとめて読み取れます。

  • SOA の TTL(ANSWERS の最初の ttl)と、シリアル番号(serial)
  • ゾーンに書かれた NS の一覧と、その TTL(AUTHORITY RECORDS)
  • refresh・retry・expire:セカンダリサーバーがゾーンを取りに来る間隔などのタイマー

注意したいのは default TTL という表示です。Windows の nslookup はこう表示しますが、中身は SOA の最後の値(MINIMUM)で、現在の DNS では「存在しない名前」や「その種別のレコードが無い」という否定の答えをキャッシュする時間の計算に使われます(RFC 2308)。各レコードの TTL の既定値という意味ではないので、ゾーンの TTL を確かめる目的ではレコードごとの ttl を見てください。

また、AUTHORITY に NS を入れるかどうかはサーバーの実装や設定しだいです。筆者が試した範囲でも、SOA の問い合わせに NS を添えない DNS 事業者がありました。その場合は -type=NS で同じサーバーにもう一度問い合わせます。

親ゾーン側の NS と TTL も見る

NS の情報は、自分のゾーンの中だけでなく、親ゾーン(.com なら .com のサーバー、.jp なら .jp のサーバー)にも委任の情報として登録されています。レジストラの管理画面で設定したネームサーバーが反映されているかは、こちらで確かめます。

# .com の場合
nslookup -debug -norecurse -type=NS example.com. a.gtld-servers.net
# .jp の場合
nslookup -debug -norecurse -type=NS example.jp. a.dns.jp

親ゾーンのサーバーはドメインの答えそのものを持っていないため、header flags: に auth. answer が無く、AUTHORITY RECORDS に NS が並ぶ形(委任の案内)で返ってきます。ここに出る TTL は TLD の運営者が決めた値で、子ゾーン側で設定した NS の TTL と違うことがよくあります。筆者が確認した .jp のドメインでは、親側が 86400 秒(1日)、子側が 3600 秒(1時間)でした。

キャッシュサーバーが親と子のどちらの TTL を使うかは実装によって異なります。DNS 事業者を移すときは、子側の TTL を下げても親側の値の分だけ旧サーバーに問い合わせが残る可能性がある、と見込んで旧サーバーをしばらく止めずにおくのが安全です。

全権威サーバー・複数ドメインを一括で並べる

権威サーバーが複数あるときは、すべてに同じ問い合わせをして値をそろえて比べます。1台だけシリアルが古い、1台だけ応答しない、といった状態は、事業者側の同期の遅れや設定漏れの手がかりになります。次の PowerShell の例は、ドメインごとに NS を引き、各ネームサーバーに SOA と NS を再帰なしで問い合わせて表にします。

param([string[]]$Zones = @('example.com.'))

# nslookup を実行し、最後のまとめ部分(区切り線より後ろ)だけを返す
function Get-NsSummary($type, $name, $server) {
    $text = (cmd /c "nslookup -debug -norecurse -type=$type $name $server 2>&1") -join "`n"
    # 指定したサーバーに聞けていなければ空を返す
    if ($text -notmatch "Address:\s+$([regex]::Escape($server))") { return '' }
    return ($text -split '------------')[-1]
}

# ネームサーバー名をアドレスに変換する(IPv4 を優先し、無ければ IPv6)
function Get-ServerAddress($nsName) {
    foreach ($t in 'A', 'AAAA') {
        $r = Resolve-DnsName $nsName -Type $t -Server 1.1.1.1 -DnsOnly -ErrorAction SilentlyContinue |
            Where-Object { $_.Type -eq $t } | Select-Object -First 1
        if ($r) { return $r.IPAddress }
    }
    return ''
}

foreach ($zone in $Zones) {
    $nsList = cmd /c "nslookup -type=NS $zone 1.1.1.1 2>nul" |
        Select-String 'nameserver = (\S+)' |
        ForEach-Object { $_.Matches[0].Groups[1].Value } |
        Sort-Object -Unique

    foreach ($ns in $nsList) {
        $ip = Get-ServerAddress $ns
        $soa = ''; $nsr = ''
        if ($ip) {
            $soa = Get-NsSummary 'SOA' $zone $ip
            $nsr = Get-NsSummary 'NS' $zone $ip
        }
        $serial = [regex]::Match($soa, 'serial\s+=\s+(\d+)').Groups[1].Value
        if (-not $serial) { $serial = '応答なし' }
        [pscustomobject]@{
            Zone   = $zone
            Server = "$ns ($ip)"
            Serial = $serial
            SoaTTL = [regex]::Match($soa, 'ttl = (\d+)').Groups[1].Value
            NsTTL  = [regex]::Match($nsr, 'ttl = (\d+)').Groups[1].Value
        }
    }
}

ns_check.ps1 などの名前で保存し、.\ns_check.ps1 -Zones 'example.com.','example.jp.' | Format-Table -AutoSize のように実行します。出力の形は次のとおりです(値は例)。

Zone         Server                         Serial     SoaTTL NsTTL
----         ------                         ------     ------ -----
example.com. ns1.example.net (192.0.2.53)   2026101601 3600   3600
example.com. ns2.example.net (198.51.100.53) 2026101601 3600   3600

スクリプトを作るときのポイントは3つです。

  • ネームサーバー名を先にアドレスへ変換してから nslookup に渡しています。理由は次の節で説明します。
  • -debug の出力は、最後の区切り線(------------)より後ろに、答えのまとめが出ます。ここだけを読むと、先頭の逆引きの行を拾わずに済みます。
  • Windows PowerShell 5.1 で日本語のコメントや文字列を含むスクリプトを実行する場合は、ファイルを「UTF-8(BOM 付き)」で保存します。BOM なしの UTF-8 だと文字化けして構文エラーになります。PowerShell 7 ではこの問題は起きにくくなっています(2026年10月現在)。

組織のネットワークで外部の DNS サーバーへの直接の問い合わせが禁止されている場合は、許可を得てから実行してください。

読み違えやすい点

サーバー名を引けないと、黙って既定のサーバーに聞いてしまう

Windows の nslookup は、問い合わせ先に指定したサーバー名のアドレスを引けないと、*** Can't find server address for 'ns3.example.net': と表示したうえで、PC に設定された既定のサーバーに問い合わせを続けます。エラーで止まらないため、キャッシュサーバーの答えを権威サーバーの答えと取り違えやすい点に注意してください。出力の Address: の行が、意図したサーバーのアドレスになっているかを毎回確かめます。上のスクリプトでアドレスを先に求めて照合しているのはこのためです。

IPv6 だけのネームサーバー

ネームサーバーの中には、IPv6 のアドレス(AAAA)しか持たないものがあります。手元の回線が IPv4 だけだと、そのサーバーには届かず「応答なし」になります。サーバーの故障とは限らないので、IPv6 が使える環境で確かめてから判断します。

名前の末尾のドットと DNS サフィックス

社内ネットワークの PC では、名前に DNS サフィックス(社内ドメイン名)が自動で足されることがあります。example.com. のように末尾にドットを付けると、その名前だけを問い合わせます。

ANY でまとめて取ろうとしない

-type=ANY で全レコードを一度に取ろうとしても、現在は多くのサーバーが最小限の答えしか返しません(RFC 8482)。TTL と NS の確認には、SOA と NS を個別に聞く方法が向いています。

Linux や macOS の nslookup

Linux や macOS の nslookup は BIND 由来の別の実装で、-debug の表示の形が Windows と違います。同じスクリプトは使えないので、それらの環境では dig の +noall +answer などで確かめるほうが手早いです。

まとめ

  • nslookup で TTL を見るには -debug を付けます。キャッシュサーバー経由の TTL は残り時間で、設定値を見るには権威サーバーに -norecurse で聞きます。
  • 権威サーバーに SOA を聞くと、SOA の TTL・シリアル・NS の一覧と TTL を1回で確認できることが多いです。NS を添えないサーバーには NS を別に聞きます。
  • default TTL の表示は SOA の MINIMUM で、否定の答えのキャッシュ時間に使われる値です。
  • 親ゾーン側の NS と TTL は TLD のサーバーに聞き、子ゾーン側の値と並べて確認します。
  • 全権威サーバーの一括確認では、サーバー名を先にアドレスへ変換し、Address: の行で問い合わせ先を確かめます。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲