そもそもDNSってなんだっけ?
DNSサーバは2種類
DNSは分散構成
- トップレベルドメイン(.comとか)から、階層構造にいくつものDNSサーバが立っている
- 特定のDNSサーバが管理するドメインの範囲のことを ゾーン と言う
- 一番上のDNSサーバを DNSルートサーバ という
ドメイン取得の流れ
- ルートサーバに問い合わせを行う
- ルートサーバは、特定のゾーンとDNSサーバの組み合わせを持っているので、「そのゾーンならば、このDNSサーバに問い合わせろ」という回答をする
- そのまま、本当にIPを持っているDNSサーバまでたらいまわしが行われる
[ルートサーバ] -> [コンテンツサーバ] -> .... -> [コンテンツサーバ]
ついでにリゾルバの話
参考
DNSのレコード
DNSに格納されている情報を レコード という よく使うレコードはこんな感じ
- Aレコード : ホスト名と、IPv4アドレスのマッピング
- AAAAレコード : ホスト名と、IPv6アドレスのマッピング
- CNAMEレコード : 別名を定義
- NSレコード : あるゾーンについてのDNSサーバの問い合わせ先
- 自分のゾーンの場合、自分のホストが書かれている
- たらいまわし
- MXレコード : あるドメイン宛てのメールをどのホスト名に渡すかのマッピング
- PTRレコード IPv4アドレスと、ホスト名のマッピング
- Aレコードの逆。逆引きDNSで使用
- SOAレコード : 自分が管理しているゾーンに関しての情報
ついでに、DNSを設定する時によく聞くTTLって何?
TimeToLive
DNSが浸透するってどういうこと?
DNSサーバを引っ越して、Aレコードも変更した時に、引越し先のIPアドレスにアクセスされるようになるまで時間がかかる様子
何でそんなことが起こるの?
こんな流れで、親DNSサーバの中で 旧DNSサーバのNSレコードが延々とキャッシュされつづける ため
前提
引越前、旧DNSサーバのゾーン情報を親DNSサーバはキャッシュしている
親DNSサーバのキャッシュ
www.example.jp. 10 IN A 192.0.2.1 example.jp. 100 IN NS ns-old.example.jp.
10秒後、Aレコードのキャッシュが切れて、NSレコードのキャッシュが残っている状態になる
親DNSサーバのキャッシュ
example.jp. 90 IN NS ns-old.example.jp.
この時に、www.example.jp
について問い合わせが発生
- 親DNSは、NSレコードのキャッシュを元に 旧DNS に問い合わせを行う
- 旧DNSは、古いIPを返す
- その内容でAレコードがキャッシュされる
- その後、 NSレコードのTTLがリセットされる!!!!!!
親DNSサーバのキャッシュ
www.example.jp. 10 IN A 192.0.2.1 example.jp. 100 IN NS ns-old.example.jp.
元に戻ったよ!
これが延々と繰り返されると、親DNSサーバはいつまでも旧DNSの情報をキャッシュしつづけてしまうよね...
なんでTTLをリセットとかするの?
正しい方法
新DNSサーバを立てた後に、親のNSレコードを切り替える前に、 旧DNSサーバの自ゾーンのNSレコードを新DNSサーバに切り替えておく
あと、 bind9.2.3では、TTLをリセットしないように実装が変更された
まとめ
浸透なんてないんだよ! 単なる設定のミスで古い情報がキャッシュされつづけるだけだよ!!
次回予告
- digコマンドの使い方について説明する