BIND(DNS)での備忘メモ。

BINDの最新版は、http://www.isc.org/で入手できる。
現時点では、9.3.2か、8.4.7と書かれていた。
DNSは、BINDが事実上の標準で、他にMicrosoftなどから出ていたかな?
とりあえず、最近、思いっきり苦しめられた現象があったので、今後の覚書として書いておこうと思った。
さらっと、表層的なもの・直接関係するものだけ書いて、不明点はまた必要になったその時に調べなおそう。


DNSのリプレース案件。
最新版をダウンロードして、configureして、makeして、make install という、UNIX系OSでのインストール作法で入れたまでは良かった。
設定ファイルは、基本的にリプレース前のものを流用し、競合にならない程度に改造した。
でも、問合せに対する回答が、性能の劣るリプレース前サーバに比べて異様に遅い。


DNSIPアドレスは仮に192.168.1.253として。
たとえば…
dig @192.168.1.253 www.google.co.jp
とか、
nslookup www.google.co.jp 192.168.1.253
とか、コマンドを打ってみる。


1回目はタイムアウトして失敗し、2回目以降はリアルタイムでの応答といった具合。
キャッシュ時間が切れたら、またタイムアウトして失敗…
そんな応答状態だった。
不定期に遅いならともかく、1回目が確実にタイムアウト
設定ミスを疑ったけど、変更したのはネットワーク関係の部分のみ。
正常稼動しているサーバのバックアップHDDを流用して、そこに設定ファイルを入れてみたけど同じ症状。
もちろん、IPアドレスやらネットマスクやらの、足回りの設定は調整している。
でも、応答が返るし、他のDNSではまったく問題ないのでネットワークの問題はない。
BINDも、何回か再インストールしてチェックしてみたけど、毎回同じ挙動。


結局、突破口を開いたのはパケットキャプチャで、直接パケットを見ていた同僚。
それは…


ここで、別の話題。
世界中でインターネットに接続される中、xxx.xxx.xxx.xxx と、4オクテット*1で構成されるIPアドレスで、不足が懸念材料となっている。
IPアドレスの枯渇で考案されたのが、6オクテットで構成される、IPv6の技術だ。
本題とは関係ないけど、セキュリティなども考慮した次世代ネットワーク技術のことで、2の128乗個(340,282,366,920,938,463,463,374,607,431,768,211,456=約340澗)のIPアドレスがある。先行して利用されているMACアドレスのほうが先に枯渇しそうな感じw
で、このIPv6、思想的には「いつの間にか身近に存在し、利用される技術を目指す」といった事が語られている。
WindowsXPだってIPv6を扱えるので、身近には存在してる。
でも、利用されてるか?


簡単に言うと、今回、僕がDNSでぶつかった問題も、これに起因してる。
具体的には、RFC2671により定義されている EDNS0 という拡張命令に原因があると、教えてくれた。
DNSプロトコルで、Standard query A XXXX.co.jp というパケットの中から「Additional records」という、EDNS0無効時にはないデータを見つけて分かったという。
以前にもバイナリでソフトの挙動を読んだりしてたし、アナタは一体ナニモノですか?


DNSパケットのデータ長は最大512byteで定義されている。
IPv6アドレスでは格納しきれない事があり、必須機能とされるが…
とりあえず社内はまだIPv6を利用した環境では無い。
なのに、DNSIPv6ネットワークを探すからタイムアウトするまで応答が無くなる。
1回目の問合せで応答できる訳が無い。


解決方法は至ってシンプル。
1つ目は、forwarders を使っている場合。
/etc/named.confで、serverディレクティブに edns no; を追加する。
上記の仮環境で例えれば…
server 192.168.1.253 { edns no; };
といった感じ。


もうひとつは…もしかすると解決方法じゃないかもしれないけど、インストール時の configure に、引数として"--disable-ipv6"をつけて実行し、ソースから再インストールを行う。


僕はとりあえず、2つとも実行した。
開発環境だったということもあって、再インストールは気兼ねなく出来た。
今のところ、リアルタイムで応答している。


今回は、反省点が大きい。
周りが優秀すぎてヒーコラ言っているようじゃ…もっと深いところまで注意深く見れるようにならないとなぁ。

*1:1オクテットは、8bit。基本的に1byteと同じだけど、1byteは8bitで無いことがある