2026年9月26日

2026年9月26日

Unboundキャッシュの残りTTLを確認する方法|dig・unbound-controlでの見方と、TTL設定の見直し

Unboundのキャッシュに残っているレコードのTTLは、Unbound自身に dig で問い合わせて答えのTTL欄を見るのが手軽で、より詳しく調べたいときは unbound-control dump_cache でキャッシュの中身を出力して確認します。この記事では、残りTTLの見方、特定の名前だけキャッシュを消す方法、そしてキャッシュの保持時間に関わる設定(cache-max-ttl、cache-min-ttl、prefetch など)の見直し方を、自分で運用している Unbound を前提に説明します。

Unbound と 1.1.1.1 のようなパブリックDNSとで応答がずれる問題の合わせ方は別記事で扱っています。この記事は、手元の Unbound のキャッシュ状態を確かめることに絞っています。

方法1: digで残りTTLを確認する

もっとも簡単なのは、Unbound が待ち受けているアドレスに dig で問い合わせる方法です。

dig @127.0.0.1 www.example.com A +noall +answer

出力は次のような形になります。

www.example.com.    2873    IN    A    203.0.113.10

2列目の 2873 が、Unbound のキャッシュに残っている秒数です。数秒おいて同じコマンドを実行し、この数字が減っていればキャッシュから返されています。数字が設定値(権威DNSのTTL)に戻っていれば、キャッシュが切れて新しく取り直したことを意味します。

権威DNSに直接問い合わせた値と比べると、Unbound がどれだけの時間キャッシュするつもりかが分かります。

dig @ns1.example-dns.net www.example.com A +noall +answer

注意点として、dig で問い合わせると、キャッシュにない名前は Unbound がその場で解決してキャッシュに載せます。「調べたせいでキャッシュされた」状態になることを覚えておいてください。

方法2: unbound-controlでキャッシュの中身を確認する

unbound-controlを使えるようにする

unbound-control を使うには、unbound.conf で remote-control を有効にしておく必要があります。

remote-control:
    control-enable: yes
    # 証明書を使わず、ローカルのUNIXソケットで操作する場合の例
    control-interface: /run/unbound.ctl

TCPで接続する構成では、unbound-control-setup で鍵と証明書を作成します。ディストリビューションのパッケージによっては最初から有効になっていることもあるため、まず unbound-control status が通るかを試してください。設定を変えたら、unbound-checkconf で文法を確認してから再起動します。

dump_cacheでキャッシュを出力する

sudo unbound-control dump_cache > /tmp/unbound-cache.txt
grep -i '^www\.example\.com\.' /tmp/unbound-cache.txt

dump_cache は、レコード単位のキャッシュ(rrset cache)と、問い合わせ結果単位のキャッシュ(message cache)の内容をテキストで出力します。レコードの行に表示されるTTLは、残りの秒数として出力されます。出力の形式はバージョンによって違いがあるため、手元の出力で example.com などを検索しながら読み取ってください。

キャッシュが大きいサーバーでは出力が数百MBになることもあり、出力中は処理の負荷が上がります。利用者の多い時間帯の本番サーバーでは避けるか、まずステージングで所要時間を確かめてください。また、出力ファイルには利用者が問い合わせた名前が含まれるため、扱いには注意が必要です。

lookupで問い合わせ先を確認する

sudo unbound-control lookup example.com

lookup は、キャッシュに入っているレコードそのものではなく、その名前を解決するときに Unbound がどのネームサーバーに問い合わせるか(委任情報)を表示します。古いネームサーバーが残っていないかを調べるときに使います。

統計でキャッシュの効き具合を見る

sudo unbound-control stats_noreset | grep -E 'cachehits|cachemiss|prefetch|cache.count'

total.num.cachehits と total.num.cachemiss の比率から、キャッシュがどれだけ使われているかが分かります。stats_noreset は統計をリセットせずに表示するコマンドです(stats はリセットされる点に注意してください)。

特定の名前のキャッシュを消す

古い値が残っていて、TTLが切れるのを待てない場合は、名前を指定して消せます。

# 主なレコード種類(A、AAAA、MX、CNAMEなど)をまとめて消す
sudo unbound-control flush www.example.com

# 種類を指定して消す
sudo unbound-control flush_type www.example.com TXT

# そのドメイン配下をまとめて消す
sudo unbound-control flush_zone example.com

# NXDOMAIN などの否定応答のキャッシュだけを消す
sudo unbound-control flush_negative

消したあとに方法1の dig を実行し、TTLが権威DNSの設定値から始まっていれば、取り直しができています。なお、unbound-control reload は設定を読み直すと同時にキャッシュ全体を消します。名前を絞って消したいだけなら flush 系を使います。

TTLの保持時間に関わる設定を見直す

Unbound は、権威DNSのTTLをそのまま使うのが基本ですが、次の設定で上限や下限が変わります。現在の値は unbound-control get_option で確認できます。

sudo unbound-control get_option cache-max-ttl
sudo unbound-control get_option cache-min-ttl
sudo unbound-control get_option prefetch
  • cache-max-ttl: キャッシュする最長時間です。既定値は86400秒(1日)で、権威DNSのTTLがこれより長くても、この値で切られます。
  • cache-min-ttl: キャッシュする最短時間です。既定値は0です。大きくすると問い合わせは減りますが、権威DNS側が短いTTLで切り替えを準備していても、その意図より長く古い値を返すことになります。上げる場合は慎重に検討してください。
  • cache-max-negative-ttl: 存在しない名前の結果をキャッシュする最長時間です。
  • prefetch: yes にすると、TTLの残りが1割を切ったレコードに問い合わせが来たとき、裏で取り直します。よく使われる名前でキャッシュ切れの待ち時間を減らせます。
  • serve-expired: yes にすると、TTL切れのレコードを一時的に返しながら裏で取り直します。権威DNSが落ちたときの耐性は上がりますが、古い値を返す時間が延びるため、関連する serve-expired-ttl などと合わせて設計します。

設定値やオプションの既定は、Unbound のバージョンで変わることがあります(2026年10月現在)。手元のバージョンは unbound -V で確認し、そのバージョンの man unbound.conf を参照してください。変更する前には unbound.conf をバックアップし、unbound-checkconf で確認してから反映します。

キャッシュせずに中身だけ見たい場合

dig +norecurse で問い合わせると、本来は「キャッシュにあるものだけ答えて」という意味になります。ただし Unbound の access-control で allow としか許可していない場合、再帰なしの問い合わせは拒否されます。キャッシュの中身だけを覗く用途には allow_snoop が必要ですが、外部から自由に覗かれると問い合わせ履歴の推測に使われるため、許可する範囲はローカルや管理用のアドレスに限ってください。

まとめ

  • 残りTTLは、dig @127.0.0.1 名前 の答えの2列目で確認でき、時間をおいて減っていればキャッシュから返されています。
  • 詳しく見るなら unbound-control dump_cache、問い合わせ先は lookup、効き具合は stats_noreset で確認します。
  • 古い値は flush、flush_type、flush_zone で名前を絞って消せます。reload はキャッシュ全体を消します。
  • 保持時間は cache-max-ttl、cache-min-ttl、prefetch、serve-expired で変わります。変更の前にはバックアップと unbound-checkconf を行ってください。

お気軽にご相談ください

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