kasei_sanのブログ

かせいさんのIT系のおぼえがきです。胡乱の方はnoteとtwitterへ

DNSを良くわかっていない自分が浸透問題を理解するまでのはなし

そもそもDNSってなんだっけ?

DNSサーバは2種類

  • コンテンツサーバ (権威DNSサーバ)
  • キャッシュサーバ
    • コンテンツサーバの内容をキャッシュするサーバ

DNSは分散構成

ドメイン取得の流れ

DNSサーバが自身が知らないドメインを調べる場合

  • ルートサーバに問い合わせを行う
  • ルートサーバは、特定のゾーンとDNSサーバの組み合わせを持っているので、「そのゾーンならば、このDNSサーバに問い合わせろ」という回答をする
  • そのまま、本当にIPを持っているDNSサーバまでたらいまわしが行われる
[ルートサーバ] -> [コンテンツサーバ] -> .... -> [コンテンツサーバ]

ついでにリゾルバの話

  • アプリケーションからドメイン問い合わせがあると、DNSに問い合わせを行って回答してくれるサービス
  • linux 系だと /etc/resolv.confDNSサーバのIPを書く
    • 社内DNSサーバだったり、プロバイダのDNSだったり、 8.8.8.8 だったり

参考

DNSのレコード

DNSに格納されている情報を レコード という よく使うレコードはこんな感じ

  • Aレコード : ホスト名と、IPv4アドレスのマッピング
  • AAAAレコード : ホスト名と、IPv6アドレスのマッピング
  • CNAMEレコード : 別名を定義
    • 1つのIPアドレス複数のホスト名を持たせたい時(バーチャルホストとか)
    • あと、www.test.com と、test.com どちらでもアクセス可能にしたい時とか?
  • NSレコード : あるゾーンについてのDNSサーバの問い合わせ先
    • 自分のゾーンの場合、自分のホストが書かれている
    • たらいまわし
  • MXレコード : あるドメイン宛てのメールをどのホスト名に渡すかのマッピング
  • PTRレコード IPv4アドレスと、ホスト名のマッピング
    • Aレコードの逆。逆引きDNSで使用
  • SOAレコード : 自分が管理しているゾーンに関しての情報

ついでに、DNSを設定する時によく聞くTTLって何?

TimeToLive

  • コンテンツサーバが設定する、キャッシュサーバがそのデータを保持して良い時間
  • 単位は秒
  • DNSのデフォルトのTTL値は86400秒(24H) らしい

DNSが浸透するってどういうこと?

DNSサーバを引っ越して、Aレコードも変更した時に、引越し先のIPアドレスにアクセスされるようになるまで時間がかかる様子

何でそんなことが起こるの?

こんな流れで、親DNSサーバの中で DNSサーバのNSレコードが延々とキャッシュされつづける ため

前提

  • ドメイン : www.example.jp
  • DNSサーバ : ns-old.example.jp
  • 前提知識 : 自分が権威を持っているゾーンの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プロトコルに違反している訳ではない
  • おそらくは無駄な問い合わせをなるべくしないようにするため?

正しい方法

DNSサーバを立てた後に、親のNSレコードを切り替える前に、 DNSサーバの自ゾーンのNSレコードを新DNSサーバに切り替えておく

  • DNSサーバはどちらにせよ、新DNSサーバに問い合わせに行くことになるため、上記の問題は発生しない

あと、 bind9.2.3では、TTLをリセットしないように実装が変更された

まとめ

浸透なんてないんだよ! 単なる設定のミスで古い情報がキャッシュされつづけるだけだよ!!

次回予告

  • digコマンドの使い方について説明する

参考