DNSのSOAレコードにminimumというレコードがある。

「過去にはキャッシュサーバがキャッシュレコードを保持する期間として使われていましたが、RFC2308 によりドメイン名が存在しなかったという情報を保持する期間 (ネガティブキャッシュ) として変更され、無駄な DNS トラフィックを低減させる働きを行っています。」

http://www.dns.jp/ncache-ja.html

http://www.soi.wide.ad.jp/class/20020036/slides/11/index_56.html

ということで、自社のDNSサーバは10mにしていたのですが、たまたま顧客のDNSサーバがminimumの値を86400(1d)に設定してあり、短めにした方が良いですよー、と言っては見たものの、長く設定してしまった場合どういうことになるのか良くわかっていなかったので、これを機に試してみることにした。

 

RFC2308によると、NXDOMAIN、NODATA等のNegative Responseが返されると、ネガティブキャッシュが行われるようである。

http://www.ietf.org/rfc/rfc2308.txt?number=2308

Negative Responseには、これ以外にも、Server Failure、Dead / Unreachable Serverがあるが、その場合は、ネガティブキャッシュは5分を超えてはならないとの記述がある。

まず、弊社のネームサーバの設定を見ると、SOAレコードは次の様になっている。

$TTL 1d
@       IN      SOA     diva.clustcom.com.  ktaka.clustcom.com. (
                        2006110505 ; serial
                        1h ; refresh
                        10m ; retry
                        4w ; expire
                        10m ; ttl
                        )

手元のLinux PC x60から、SOAを引いてみると、次の様なレスポンスが返って来る。

ktaka@x60:~$ host -t SOA clustcom.com
clustcom.com has SOA record diva.clustcom.com. ktaka.clustcom.com. 2006110505 3600 600 2419200 600

この最後のフィールドがネガティブキャッシュの期間である。

ここで x60で、キャッシュ専用のnamedを稼働させる。

x60:/etc/bind# more named.conf
options {
    directory "/etc/bind";
    listen-on { 127.0.0.1; };
    allow-query {
        127.0.0.1;
    };
    version "unknown";
    max-cache-size 60M;
};
controls {
    inet 127.0.0.1 port 953
    allow { 127.0.0.1; } keys { "rndc-key"; };
};

zone "." {
        type hint;
        file "/etc/bind/db.root";
};

x60:/etc/bind# /etc/init.d/bind9  restart
Stopping domain name service...: bind.
Starting domain name service...: bind.

存在しない、ホストの名前解決をしてみる

 x60:~# rndc flush; host hello.clustcom.com localhost ; rndc dumpdb
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases:

Host hello.clustcom.com not found: 3(NXDOMAIN)

すると次のネガティブキャッシュが作成される。

x60:~# egrep hello  /etc/bind/named_dump.db
hello.clustcom.com.     599     \-ANY   ;-$NXDOMAIN

今度は、ネームサーバ上でminimumの値を変えて同じことを試してみた。

60(1m)を指定した場合→ネガティブキャッシュのキャッシュ時間は、1分になる。

x60:~# rndc flush; host hello.clustcom.com localhost ; rndc dumpdb
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases:

Host hello.clustcom.com not found: 3(NXDOMAIN)
x60:~# egrep hello  /etc/bind/named_dump.db
hello.clustcom.com.     60      \-ANY   ;-$NXDOMAIN

86400(1d)を指定した場合→ネガティブキャッシュのキャッシュ時間は、3時間になる。

x60:~# rndc flush; host hello.clustcom.com localhost ; rndc dumpdb
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases:

Host hello.clustcom.com not found: 3(NXDOMAIN)
x60:~# egrep hello  /etc/bind/named_dump.db
hello.clustcom.com.     10800   \-ANY   ;-$NXDOMAIN

86400を指定しているにもかかわらず、10800に丸められるのは、下の記述と符合する。

http://www.dns.jp/ncache-ja.html

 

さて、上記に見られるように、SOAのminimumフィールドの値によって、NXDOMAINのキャッシュ時間が決められることがわかった。

これにより、影響を受けるのはどういう場合かを考えてみると、つぎの様なシナリオが思い浮かぶ。

シナリオ1

ユーザーが管理者にDNS登録を依頼する。

ユーザーが待ち切れずに名前解決を試み、NXDOMAINが、近所のキャッシュサーバに例えば3時間キャッシュされる。

その直後に、DNS登録が完了する

しかしながら、ユーザーはNXDOMAINのキャッシュが消える3時間後まで、 名前解決を確認できない。

シナリオ2

ユーザーが携帯電話のWEBサーバ用に、DNS登録を依頼する。

ユーザーが待ち切れずに、携帯電話からWEBサーバにアクセスしようとする。

携帯電話会社にある、DNSキャッシュサーバに、NXDOMAINが3時間キャッシュされる。

その直後に、DNS登録が完了する。

シナリオ2などは、特に緊急にWEBサイトを開設したい場合など、キャッシュが消えるまで携帯電話実機での動作確認もできず、イライラの原因となるであろう。

まともな開発会社であれば、DNS登録などは、事前に十分な余裕を持って登録が済むように業務フローが確立されていると思われるが、やはりそうであっても、確認洩れで慌ててDNS登録を行うようなシチュエーションも目にして来たので、やはり、ネガティブキャッシュは短めにしておいた方が良さそうだと思う。