DNS周辺技術勉強会 #dnstudy 01 に参加してきた

6/18 に、DNS周辺技術勉強会 #dnstudy 01 に参加してきました。

お題は、以下の 2 つでした。

  • DNS 再入門
  • Unbound 入門

Unbound の話が聞ける!ということで参加したのですが、"DNS 再入門" の方の内容も予想以上にすばらしかったです。

自分的に勉強になった点を、かいつまんで書いてみようと思います。

DNS 再入門

ドメイン名

絶対ドメイン名 (完全ドメイン名)

各ノードのラベルを下位のノードから上位のノードへドットでつないだ物。
空のラベルがつくルートノードまでをつなぐので、最後はドットで終わる。

相対ドメイン名

最後がドットで終っていないと、相対ドメイン名として扱われる。
親のドメイン名に対して相対的に表したドメイン名。

FQDN

トップレベルドメインまでをドットでつないだ物。
ルートドメインに対する相対ドメイン名と考えると良い。

※ 情報源が wiki ですが、FQDN の厳密な定義は無いようです。
Fully Qualified Domain Name

ドメイン名の管理

各ドメインの権威ネームサーバは、そのドメインから始まるツリーを管理している。
ドメインツリーを管理する単位をゾーンと呼ぶ。

各ドメインのゾーンは、サブドメインのゾーンを分割することができ、分割されたゾーンの管理権限を他のネームサーバに譲ることができる。
これを権限委譲とよぶ。

サブドメイン毎にゾーンを分割しなければならないという勘違いが多い。

DNS のプレイヤー

スタブリゾルバ

名前解決を要求するクライアント側の機能。
OS やライブラリの機能として実装されている。
フルサービスリゾルバに要求を出すのみ。
キャッシュ機能を持っても良い。

フルサービスリゾルバ

スタブリゾルバから要求を受け、権威ネームサーバに対して反復的な問い合わせを行なう。
"ネームサーバ"、"キャッシュサーバ" といったら通常はこれを指す。
キャッシュ機能を持たなければならない。

権威ネームサーバ

権威をもっていない情報については提供しない。
"コンテンツサーバ" はこれを指す。

リソースレコード

SOA

ゾーンの権威の開始を示すレコード。
ゾーンについての情報を記載する。

@ IN SOA ns.example.jp. hostmaster.example.jp. (
              2011062401   ;Serial
              3600         ;Refresh
              600          ;Retry
              604800       ;Expire
              600 )        ;Minimum

Serial
ゾーンを更新したら増やす。
慣例的に、日付++連番が使われることが多い。

Refresh
セカンダリネームサーバが、プライマリネームサーバに更新を確認する間隔。

Retry
セカンダリネームサーバが更新に失敗した際、再度更新を試みるまでの間隔。

Expire
セカンダリネームサーバが情報を更新できないとき、セカンダリネームサーバが情報を利用していい時間。

Minimum (Negative Cache TTL)
ネガティブキャッシュを保持する時間。 ネガティブキャッシュは、"ドメインが存在しない" といったような結果をキャッシュすること。 元々はゾーンのリソースレコードの最小の TTL を表した。

PTR
"1 つの IP アドレスに対して PTR レコードは 1 つだけしか記述できない" というのは誤り。
複数の PTR レコードを記述できる。

Unbound 入門

Unbound とは

BIND の代替をめざしたキャッシュサーバで、

  • 設定が容易
  • フルスペックなキャッシュサーバ
  • 機能限定の権威サーバ
  • 高い処理性能

などが特徴である。

NLnet Labs が開発・保守を行なっている。
NLnet Labs は、ルートサーバでも利用されている権威ネームサーバ NSD の開発元。

設定や留意点など

設定ファイルは、unbound.conf のみ。
デフォルトでは localhost からのみアクセス許可。
お決まりのゾーン (ループバックの正引き逆引き等) は組み込み済みなので、ゾーンファイルを記述する必要がない。

DNS ラウンドロビンには非対応で、キャッシュした内容をそのままの順番で回答する。

プライベートアドレスの逆引き用にキャッシュサーバ・権威サーバを指定する場合、AS112 対策で NXDOMAIN が返される。

stub-zone:  
    name: "0.168.192.in-addr.arpa."
    stub-addr: 192.0.2.1

このようなときは、local-zone で transparent を指定する。

local-zone: "0.168.192.in-addr.arpa." transparent  

キャッシュ汚染への高い耐性

  • ランダムなクエリー ID
  • ランダムなソースポート番号
  • ランダムなディスティネーションアドレスの利用
  • ランダムなソース IP アドレスの利用
  • クエリーの際に、大文字小文字をランダムに混ぜる

によって、キャッシュ汚染への高い耐性がある。

感想など

DNS 再入門、とても勉強になりました。
スタブリゾルバ・フルサービスリゾルバ・権威ネームサーバの違いや、SOA レコードの意味など、いままでなんとなくの理解だった事について、詳しく知ることができました。

さっそく、自宅の内向き DNS を djbdns から NSD+Unbound に変えてみました。
設定簡単でとてもいいです。