Debian GNU/Linux―に限らないが―には、Lightwight Resolver (lwres) のデーモンとライブラリがあって、これを使うとWindowsと同じようにDNSのクライアントキャッシュが利くようになるという情報を仕入れたので、使えるように設定してみた。
単純に lwresd パッケージをインストールしてもいいんだけど、こちらではDNSアップデートのために bind9 をインストールしているので、/etc/bind/named.conf.options に以下を追加して named に仕事をさせることにする。
lwres { };
次に libnss-lwres パッケージをインストールして、/etc/nsswitch.conf の hosts の項目を以下のように変更する。
hosts: hosts lwres [NOTFOUND=return] dns
[NOTFOUND= 以降は本来不要なんだけど、もしものときのために入れておくことにする。
tcpdump で lo インターフェースの通信を拾ってみると、lwresプロトコルのパケットが飛んでいるようなので、ひとまず設定完了!
従来のリゾルバーだと、プロセスごとに動作が独立なので、あるプロセスのDNS探索の結果が別のプロセスで再利用されないわけで、ルーターやプロバイダーから知らされたDNSサーバーがキャッシュを実装していないと、プロセスの起動直後はホスト名解決に時間が掛かることもあるらしい。
Lightweight Resolverでは、Cライブラリに含まれていた従来のリゾルバーの機能を別プロセスに分離して集約するので、システム全体のキャッシュとして使えるようになる模様。
DNSのキャッシュだけならローカルでキャッシュサーバーを動かすという方法もあるんだけど、別途フォワーダーの設定とかしないといけないので、/etc/resolv.conf を変更しなくていい―そのままフォワーダーのアドレスとして使える―Lightweight Resolverの方法はスマートだと思う。