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を行ってください。