11と12のリビジョン間の差分
2018-11-11 00:45:49時点のリビジョン11
サイズ: 12556
コメント:
2018-11-11 01:50:59時点のリビジョン12
サイズ: 17030
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 36: 行 36:
== マスターDNSコンテンツサーバーの基本設定 == == DNSコンテンツマスターサーバーの基本設定 ==
行 180: 行 180:
またスレーブサーバー側では default-masters で指定可能である。
行 189: 行 191:
またこれは、スレーブサーバー側で default-masters で指定可能である。
行 206: 行 210:





== DNSコンテンツスレーブサーバーの基本設定 ==
 * DNSサーバーとして [[https://www.freshports.org/dns/bind913|ports/dns/bind913]] をインストールする。
 * ここでは特にカスタムする要素は無いので、デフォルトのままとする。
 * 説明のため、稼働に必要な最低限の設定とする。

=== /etc/rc.conf ===
以下の設定を追加する。

{{{
named_enable="YES"
named_chrootdir="/var/named"
altlog_proglist="named"
}}}

※altlog_proglist が既に設定済みの場合、「{{{ named}}}」を追加する。

あるいは下記コマンドを実行する(結果は同じ)。
{{{
sysrc named_enable=YES
sysrc named_chrootdir=/var/named
sysrc altlog_proglist+=named
}}}

=== /usr/local/etc/namedb/catalog/ ディレクトリ ===
{{{
install -d -o bind -g wheel -m 0755 /usr/local/etc/namedb/catalog

}}}

=== /usr/local/etc/namedb/named.conf ===
{{{#!diff
--- /usr/local/etc/namedb/named.conf.orig 2018-10-11 00:09:07.998066000 +0900
+++ /usr/local/etc/namedb/named.conf 2018-11-10 22:10:47.557521000 +0900
@@ -16,15 +16,28 @@
        dump-file "/var/dump/named_dump.db";
        statistics-file "/var/stats/named.stats";

+ recursion no;
+ allow-query { any; };
+ allow-recursion { none; };
+ allow-query-cache { none; };
+
+ allow-new-zones yes;
+ catalog-zones {
+ zone "catalog.example"
+ zone-directory "/usr/local/etc/namedb/catalog"
+ in-memory no
+ default-masters { ns0のIPアドレス key "ns0-nsN."; };
+ };
+
 // If named is being used only as a local resolver, this is a safe default.
 // For named to be accessible to the network, comment this option, specify
 // the proper IP address, or delete this option.
- listen-on { 127.0.0.1; };
+ listen-on { any; };

 // If you have IPv6 enabled on this system, uncomment this option for
 // use as a local resolver. To give access to the network, specify
 // an IPv6 address, or the keyword "any".
-// listen-on-v6 { ::1; };
+ listen-on-v6 { any; };

 // These zones are already covered by the empty zones listed below.
 // If you remove the related empty zones below, comment these lines out.
@@ -378,3 +391,20 @@
        };
 };
 */
+
+include "/usr/local/etc/namedb/ns0-nsN.key";
+
+zone "catalog.example" {
+ type slave;
+ file "/usr/local/etc/namedb/slave/catalog.example.db";
+ notify no;
+ masters {
+ ns0のIPアドレス key "ns0-nsN.";
+ };
+ allow-query {
+ !{ !ns0のIPアドレス; any; }; key "ns0-nsN.";
+ };
+ allow-transfer {
+ none;
+ };
+};
}}}

 * DNSコンテンツスレーブサーバーとして、以下の設定を行うものとする。
   * IPv4/IPv6問わず、全てのクエリを受け付ける。
   * 再帰問い合わせには答えないものとする。
 * DNSSEC設定/運用、ログ出力設定、ビュー設定といった機能については説明しない。

※カタログゾーン運用のための設定

 * 「allow-new-zones yes;」を設定する。
 * カタログゾーン設定(catalog-zones)を行う。
   * zone 設定によりカタログゾーンを指定する(指定されたゾーンの内容は別途定義)。
   * zone-directory 設定により追加されたゾーンファイルの収容先ディレクトリを指定する(デフォルトで /usr/local/etc/namedb/working)。
   * in-memory 設定によりファイルに保存するか決める(no の場合)。
   * 内部ではLMDBにより管理されている。
   * default-masters 設定によりデフォルトの masters が指定される。
   * default-masters 設定についてはマスター側のカタログゾーン内における masters.catalog.example/label.masters.catalog.example レコードでの指定と同等となる。
行 223: 行 335:
 * [[https://symas.com/lmdb/|Symas Lightning Memory-Mapped Database]]

DNSのレプリケーション設定と運用

検証環境

  • 以下のソフトウェアの利用を前提に検証を実施した。いずれも現時点で最新のリリースに基づいて検証しているが、ある程度古い環境、より新しい環境でも問題無いと思われる。
    • OS: FreeBSD 11.2-R
    • DNSコンテンツサーバー: BIND9 9.13.3
  • 上記以外の環境では、以下の点に相違が発生する。当該環境に応じて読み替えたし。
    • インストール方法
    • インストールされるディレクトリ
  • 逆に以下の点は参考にできる。
    • 設定パラメータとその意味
    • 運用事例

検証内容

  • DNSコンテンツサーバーの構築。以下の3台のDNSサーバーを構築する。
    • マスターDNSサーバー ns0.example.jp
    • スレーブDNSサーバー ns1.example.jp
    • スレーブDNSサーバー ns2.example.jp
    • いわゆる ns0.example.jp を隠れ(hidden)マスターとし、ns1.example, ns2.exmaple.jp が対外的なサービスを提供する。
  • 構成に当り、以下の機能を使用してゾーン転送(レプリケーション)を行う。
    • AFXR/IFXRによるゾーン転送。
    • TSIGキーによるマスター/スレーブの認証。
    • カタログゾーン機能による、スレーブDNSサーバーの設定フリー(たぶん)。
    • なおカタログゾーン機能はBIND9 9.11以降の機能であるため、それ未満のサーバー上では運用できない(残念)。
    • 他の実装については今時点不明。現在ドラフト状態にあり、RFCに移行するかどうかと関わってくると思われる。

レプリケーションについて

  • この手の設定を調べてみると、あまり「レプリケーション」という「言葉」は出てこない。
  • では何かというと「セカンダリDNSサーバー」「ゾーン転送」となる。
  • 言わんとすることわかるけど、レプリケーションじゃないかなぁということで、ここではそのように表現しておく。
  • マスター・スレイブ、プライマリ・セカンダリ、関係ないけど、権威サーバー・コンテンツサーバー、キャッシュサーバー・フルリゾルバ、色々と表現あるけど、適度な使い分けで。

DNSコンテンツサーバーの基本設定(準備)

DNSコンテンツマスターサーバーの基本設定

  • DNSサーバーとして ports/dns/bind913 をインストールする。

  • ここでは特にカスタムする要素は無いので、デフォルトのままとする。
  • 説明のため、稼働に必要な最低限の設定とする。

/etc/rc.conf

以下の設定を追加する。

named_enable="YES"
named_chrootdir="/var/named"
altlog_proglist="named"

※altlog_proglist が既に設定済みの場合、「 named」を追加する。

あるいは下記コマンドを実行する(結果は同じ)。

sysrc named_enable=YES
sysrc named_chrootdir=/var/named
sysrc altlog_proglist+=named

/usr/local/etc/namedb/named.conf

   1 --- /usr/local/etc/namedb/named.conf.orig       2018-09-25 03:54:24.724317000 +0900
   2 +++ /usr/local/etc/namedb/named.conf    2018-11-10 21:38:31.343856000 +0900
   3 @@ -16,15 +16,22 @@
   4         dump-file       "/var/dump/named_dump.db";
   5         statistics-file "/var/stats/named.stats";
   6 
   7 +       recursion       no;
   8 +       allow-query       { none; };
   9 +       allow-recursion   { none; };
  10 +       allow-query-cache { none; };
  11 +
  12 +       allow-new-zones yes;
  13 +
  14  // If named is being used only as a local resolver, this is a safe default.
  15  // For named to be accessible to the network, comment this option, specify
  16  // the proper IP address, or delete this option.
  17 -       listen-on       { 127.0.0.1; };
  18 +       listen-on       { any; };
  19 
  20  // If you have IPv6 enabled on this system, uncomment this option for
  21  // use as a local resolver.  To give access to the network, specify
  22  // an IPv6 address, or the keyword "any".
  23 -//     listen-on-v6    { ::1; };
  24 +       listen-on-v6    { any; };
  25 
  26  // These zones are already covered by the empty zones listed below.
  27  // If you remove the related empty zones below, comment these lines out.
  28 @@ -378,3 +385,23 @@
  29         };
  30  };
  31  */
  32 +
  33 +include "/usr/local/etc/namedb/ns0-nsN.key";
  34 +
  35 +zone "catalog.example" {
  36 +       type    master;
  37 +       file    "/usr/local/etc/namedb/master/catalog.example.db";
  38 +       notify  explicit;
  39 +       allow-query {
  40 +               { !{ !ns1のIPアドレス; any; }; key "ns0-nsN."; };
  41 +               { !{ !ns2のIPアドレス; any; }; key "ns0-nsN."; };
  42 +       };
  43 +       allow-transfer {
  44 +               { !{ !ns1のIPアドレス; any; }; key "ns0-nsN."; };
  45 +               { !{ !ns2のIPアドレス; any; }; key "ns0-nsN."; };
  46 +       };
  47 +       also-notify {
  48 +                     ns1のIPアドレス          key "ns0-nsN.";
  49 +                     ns2のIPアドレス          key "ns0-nsN.";
  50 +       };
  51 +};
  52 
  • DNS隠れコンテンツマスターサーバーとして、以下の設定を行うものとする。
    • IPv4/IPv6問わず、全てのクエリを受け付けない。
    • 原則クエリは受け付けないけど、再帰問い合わせには答えないものとする。
  • DNSSEC設定/運用、ログ出力設定、ビュー設定といった機能については説明しない。

※カタログゾーン運用のための設定

  • 「allow-new-zones yes;」を設定する。
  • カタログゾーン(catalog.example)を定義する。
  • このゾーンはゾーンのフリしたカタログ管理用データベースを意味し、その具体性はゾーンファイル(/usr/local/etc/namedb/master/catalog.example.db)にて定義される。
  • よって named.conf レベルの設定では他のマスターゾーン定義と変わらない。
  • ゾーンの命名規則については「catalog.組織名」辺りが妥当と思われる(本サイトで言うなら catalog.ninth-nine など)。
  • 「catalog.localhost」辺りは実在しそうなゾーンっポイので止めておいた方がいいと思われ。

※catalog.exmaple ゾーンに関する諸設定

  • マスターゾーンである。
    • マスターゾーン変更に対する通知(Notification)は明示的に指定する(notify および also-notify 設定)。
    • スレイブサーバーからのSOAクエリがあるので答えられるように設定(allow-query)。
    • スレイブサーバーからのゾーン転送に答えられるように設定(allow-transfer)
  • いずれも、内容に改ざんが無いことを証明するため、TSIGキーで保護する(暗号化を意味するわけでは無い)。

/usr/local/etc/namedb/ns0-nsN.key

以下のコマンドを使用してTSIGキーを作成する。内容例については特に記載しない。

tsig-keygen -a hmac-sha256 ns0-nsN. > /usr/local/etc/namedb/ns0-nsN.key
chown bind:wheel /usr/local/etc/namedb/ns0-nsN.key
chmod 0400       /usr/local/etc/namedb/ns0-nsN.key

/usr/local/etc/namedb/master/catalog.example.db

$TTL    3600
@               IN      SOA     . . ( 1 86400 3600 86400 3600 )
                IN      NS      invalid.
version         IN      TXT     "1"
masters         IN      A       ns0のIPv4アドレス
label.masters   IN      A       ns0のIPv4アドレス
label.masters   IN      TXT     "ns0-nsN."
allow-query     IN      APL      1:0/0  2:0/0
allow-transfer  IN      APL     !1:0/0 !2:0/0
  • ゾーン定義ではSOAとNSレコードの指定が必須なので、
    • 特に意味を持たないのでSOAの指定はシンプルに(だそうで)。
    • NSレコードも参照されないのでテキトーに(だそうで)。
  • よって、「version」レコード(つまり version.catalog.example.)が最低でも必須となる。
    • これはテキストレコードで、現時点で「1」だけとなる。
    • 今後カタログゾーン自体の仕様変更があれば、この「version」の指定が変わることが予定されている(「1」以外の指定の場合の振る舞いは知らない)。
  • 「masters」レコードにて、スレイブサーバーでの「masters」のデフォルトの設定を指定することができる(後述)。
    • デフォルトなので後で指定するゾーン毎にこの設定は変更できる。
  • 「label.masters」レコードにて、指定サーバーに対するTSIGキー名を指定することができる(後述)。
    • デフォルトなので後で指定するゾーン毎にこの設定は変更できる。
  • もちろんではあるが、これらレコードの設定は「catalog.example」ゾーン自体には適用されない。

masters.catalog.example

本レコード設定は、指定されたAレコード(orAAAAレコード)を、スレーブサーバーに対して、以下の設定を行うのと同等となる。

masters {
    ns0のIPアドレス;
};

デフォルトの設定となるため、今後追加されるゾーンに対しては、特に指定せずとも、指定されたマスターサーバーよりゾーン転送しようとするようになる。

またスレーブサーバー側では default-masters で指定可能である。

label.masters.catalog.example

本レコード設定は、Aレコード・TXTレコードを、【スレーブサーバー】に対して、以下の設定を行うのと同等となる。

server ns0のIPアドレス {
    keys "ns0-nsN.";
};

またこれは、スレーブサーバー側で default-masters で指定可能である。

allow-query.catalog.example

本レコード設定は、APRレコードを、【スレーブサーバー】に対して、以下の設定を行うのと同等となる。

allow-query { any; };

本設定によりスレーブサーバー側の設定に寄らず、本設定が「デフォルト」として機能する。

allow-transfer.catalog.example

本レコード設定は、APRレコードを、【スレーブサーバー】に対して、以下の設定を行うのと同等となる。

allow-trasnfer { none; };

本設定によりスレーブサーバー側の設定に寄らず、本設定が「デフォルト」として機能する。

DNSコンテンツスレーブサーバーの基本設定

  • DNSサーバーとして ports/dns/bind913 をインストールする。

  • ここでは特にカスタムする要素は無いので、デフォルトのままとする。
  • 説明のため、稼働に必要な最低限の設定とする。

/etc/rc.conf

以下の設定を追加する。

named_enable="YES"
named_chrootdir="/var/named"
altlog_proglist="named"

※altlog_proglist が既に設定済みの場合、「 named」を追加する。

あるいは下記コマンドを実行する(結果は同じ)。

sysrc named_enable=YES
sysrc named_chrootdir=/var/named
sysrc altlog_proglist+=named

/usr/local/etc/namedb/catalog/ ディレクトリ

install -d -o bind -g wheel -m 0755 /usr/local/etc/namedb/catalog

/usr/local/etc/namedb/named.conf

   1 --- /usr/local/etc/namedb/named.conf.orig       2018-10-11 00:09:07.998066000 +0900
   2 +++ /usr/local/etc/namedb/named.conf    2018-11-10 22:10:47.557521000 +0900
   3 @@ -16,15 +16,28 @@
   4         dump-file       "/var/dump/named_dump.db";
   5         statistics-file "/var/stats/named.stats";
   6 
   7 +       recursion       no;
   8 +       allow-query       { any;  };
   9 +       allow-recursion   { none; };
  10 +       allow-query-cache { none; };
  11 +
  12 +       allow-new-zones yes;
  13 +       catalog-zones {
  14 +               zone            "catalog.example"
  15 +               zone-directory  "/usr/local/etc/namedb/catalog"
  16 +               in-memory       no
  17 +               default-masters { ns0のIPアドレス key "ns0-nsN."; };
  18 +       };
  19 +
  20  // If named is being used only as a local resolver, this is a safe default.
  21  // For named to be accessible to the network, comment this option, specify
  22  // the proper IP address, or delete this option.
  23 -       listen-on       { 127.0.0.1; };
  24 +       listen-on       { any; };
  25 
  26  // If you have IPv6 enabled on this system, uncomment this option for
  27  // use as a local resolver.  To give access to the network, specify
  28  // an IPv6 address, or the keyword "any".
  29 -//     listen-on-v6    { ::1; };
  30 +       listen-on-v6    { any; };
  31 
  32  // These zones are already covered by the empty zones listed below.
  33  // If you remove the related empty zones below, comment these lines out.
  34 @@ -378,3 +391,20 @@
  35         };
  36  };
  37  */
  38 +
  39 +include "/usr/local/etc/namedb/ns0-nsN.key";
  40 +
  41 +zone "catalog.example" {
  42 +       type    slave;
  43 +       file    "/usr/local/etc/namedb/slave/catalog.example.db";
  44 +       notify  no;
  45 +       masters {
  46 +               ns0のIPアドレス key "ns0-nsN.";
  47 +       };
  48 +       allow-query {
  49 +               !{ !ns0のIPアドレス; any; }; key "ns0-nsN.";
  50 +       };
  51 +       allow-transfer {
  52 +               none;
  53 +       };
  54 +};
  55 
  • DNSコンテンツスレーブサーバーとして、以下の設定を行うものとする。
    • IPv4/IPv6問わず、全てのクエリを受け付ける。
    • 再帰問い合わせには答えないものとする。
  • DNSSEC設定/運用、ログ出力設定、ビュー設定といった機能については説明しない。

※カタログゾーン運用のための設定

  • 「allow-new-zones yes;」を設定する。
  • カタログゾーン設定(catalog-zones)を行う。
    • zone 設定によりカタログゾーンを指定する(指定されたゾーンの内容は別途定義)。
    • zone-directory 設定により追加されたゾーンファイルの収容先ディレクトリを指定する(デフォルトで /usr/local/etc/namedb/working)。
    • in-memory 設定によりファイルに保存するか決める(no の場合)。
    • 内部ではLMDBにより管理されている。
    • default-masters 設定によりデフォルトの masters が指定される。
    • default-masters 設定についてはマスター側のカタログゾーン内における masters.catalog.example/label.masters.catalog.example レコードでの指定と同等となる。

付録1.APRレコード

  • APRレコードは早々見ないレコードなので簡単に解説。
  • 1レコード中に複数指定可能。
  • [ |!]<1|2>:<IPv4|IPv6>/<プレフィックス> という4つの構成からなる。

  • 先頭の「!」が無い場合はマッチ、ある場合は「マッチしない」を意味する。
  • 次の「1」または「2」はアドレスファミリーを意味し、1=「IPv4」、2=「IPv6」となる。
  • 指定されたIPv4ないしはIPv6はどのような表現でもかまわないが、内部では最小限の長さの表現(省略)に縮退される。
  • プレフィックスにより指定されたアドレスの範囲が指定される。

参考文献

bind9/DNSのレプリケーション設定と運用 (最終更新日時 2019-05-08 19:35:18 更新者 NorikatsuShigemura)