Linux で DNSキャッシュ

ALL
スポンサーリンク

Windows ではクライアントのDNSキャッシュはデフォルトで行われていますが、Linux はそうではありません。
そこで、LinuxクライアントでDNSキャッシュを行う方法、nscd と dnsmasq の2通りの説明です。
ここでは Ubuntu 14.04 での設定方法を説明します。

スポンサーリンク

nscdの場合

nscd は、標準Cライブラリから発行される DNS問合せをキャッシュします。
標準Cライブラリ(libc(glibc))からDNS問合せを行うアプリで効果があり、大部分のアプリが該当します。
少数ですが、nslookup や dig コマンドといった直接DNSサーバへ問合せを行うコマンドでは効果がありません。

インストールです。

apt-get install nscd

これで、以降、DNS問合せがキャッシュされます。

DNSキャッシュが効いているかの確認方法

DNS問合せがキャッシュされているかは、root で次のコマンドを実行している状態で、別ターミナルやアプリからDNS問合せを行ってみます。
(終了する場合は、CTRL-C です)

tcpdump dst port 53 -q -n

DNS問合せが行われると、下記のような表示がその都度出ます。
一方、キャッシュが有効だと、初回はDNS問合せで下記の表示が出ますが、2回目以降はDNS問合せが行われず、下記の表示は出ません。

18:49:53.291581 IP 10.0.2.15.13085 > 192.168.1.1.53: UDP, length 39

例えば、次のコマンドを実行すると、2回目はキャッシュが効いていて上記の表示は出ません。

ping www.google.co.jp -c 3

なお、nscd は DNSに限らず名前解決を行えますが、DNSキャッシュを有効にしているのは次の箇所です。
ここを no にすると、DNSキャッシュが無効になります。

/etc/nscd.conf

enable-cache            hosts           yes

dnsmasqの場合

dnsmasq ではローカルにDNSキャッシュ用のデーモンが立ち上がります。
dnsmasq をインストールすると、DNSサーバの設定ファイル /etc/resolv.conf がローカルの DNSキャッシュデーモンを参照するように書き換えられます。
これにより、大部分のDNS問合せを行うアプリで効果があります。
nscd では効果が無かった、nslookup や dig コマンドでも効果があります。

なお、dnsmasq は NetworkManager の使用の有無でインストールや設定が変わります。
Ubuntu は通常 NetworkManager が使用されています。

NetworkManager 使用の場合

インストールです。

apt-get install dnsmasq-base

注意!!
dnsmasq-base は一旦インストールしたら、アンインストールせずに dnsmasq を無効化して下さい。
アンインストールすると NetworkManager も同時に削除されて、ネットワークが使用不可になります。
dnsmasq の無効化については後述しています。

デフォルトでは DNSキャッシュのサイズが 0 になっており、キャッシュが効いていないので、キャッシュサイズを設定します。

下記を追加します。

/etc/NetworkManager/dnsmasq.d/cache

cache-size=150

設定を反映させるために、NetworkManager を再起動します。

service network-manager restart

これで、以降、DNS問合せがキャッシュされます。

実際にキャッシュが効いているかは、先の nscd の場合の「DNSキャッシュが効いているかの確認方法」を参照して下さい。

参考までに、dnsmasq は次の箇所で、NetworkManager から起動されるように設定されています。

/etc/NetworkManager/NetworkManager.conf

[main]
dns=dnsmasq

なお、dnsmasq-base は一旦インストールしたら、アンインストールせずに dnsmasq を無効化して下さい。
アンインストールすると NetworkManager も同時に削除されて、ネットワークが使用不可になります。
dnsmasq の無効化は次の手順で行います。

次のファイルを修正します。

/etc/NetworkManager/NetworkManager.conf

変更前
dns=dnsmasq
変更後
#dns=dnsmasq

NetworkManager を再起動します。

service network-manager restart

これで dnsmasq を無効化出来ました。

NetworkManager を使用していない場合

インストールです。

apt-get install dnsmasq

これで、以降、DNS問合せがキャッシュされます。

実際にキャッシュが効いているかは、先の nscd の場合の「DNSキャッシュが効いているかの確認方法」を参照して下さい。

以上、Linux でDNSキャッシュを行う方法でした。

参考

LinuxのDNSリゾルバはキャッシュはしないのか!知らなかった。。。:なんとなしの日記
nscdが保持しているキャッシュをクリアする – 元RX-7乗りの適当な日々
nscd(8): name service cache daemon – Linux man page
AmazonLinuxでDNSキャッシュを試してみた | Developers.IO

Ubuntu の DNS キャッシュ – plonk123の日記
dnsmasq – ArchWiki
Dnsmasq – Community Help Wiki
How to disable DNSMASQ in ubuntu 12.04(Precise) | Ubuntu Geek

コメント