サイズ: 7159
コメント:
|
サイズ: 12556
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 20: | 行 20: |
* いわゆる ns0.example.jp をヒドゥンマスターとし、ns1.example, ns2.exmaple.jp が対外的なサービスを提供する。 | * いわゆる ns0.example.jp を隠れ(hidden)マスターとし、ns1.example, ns2.exmaple.jp が対外的なサービスを提供する。 |
行 34: | 行 34: |
= マスターDNSコンテンツサーバーの基本設定 = | = DNSコンテンツサーバーの基本設定(準備) = == マスターDNSコンテンツサーバーの基本設定 == |
行 60: | 行 62: |
+++ /usr/local/etc/namedb/named.conf 2018-10-09 00:36:27.390945000 +0900 @@ -8,6 +8,22 @@ // simple mistakes, you can break connectivity for affected parties, // or cause huge amounts of useless Internet traffic. +include "/usr/local/etc/namedb/rndc.key"; +include "/usr/local/etc/namedb/ns1-rndc.key"; +include "/usr/local/etc/namedb/ns2-rndc.key"; + +controls { + inet * port * allow { + 127.0.0.1; ::1; + ns1.example.jpのIPアドレス; + ns2.example.jpのIPアドレス; + } keys { + rndc-key; + ns1-rndc-key; + ns2-rndc-key; + }; +}; + options { // All file and path names are relative to the chroot directory, // if any, and should be fully qualified. @@ -16,15 +32,22 @@ |
+++ /usr/local/etc/namedb/named.conf 2018-11-10 21:38:31.343856000 +0900 @@ -16,15 +16,22 @@ |
行 89: | 行 68: |
+ allow-query { any; }; | + allow-query { none; }; |
行 109: | 行 88: |
}}} * DNSコンテンツサーバーとして、以下の設定を行うものとする。 * IPv4/IPv6問わず、全てのクエリを受け付ける。 * 再帰問い合わせには答えないものとする。 * よって本設定が行われているゾーン情報のみクエリに対して答える(ルートゾーンを含む)。 |
@@ -378,3 +385,23 @@ }; }; */ + +include "/usr/local/etc/namedb/ns0-nsN.key"; + +zone "catalog.example" { + type master; + file "/usr/local/etc/namedb/master/catalog.example.db"; + notify explicit; + allow-query { + { !{ !ns1のIPアドレス; any; }; key "ns0-nsN."; }; + { !{ !ns2のIPアドレス; any; }; key "ns0-nsN."; }; + }; + allow-transfer { + { !{ !ns1のIPアドレス; any; }; key "ns0-nsN."; }; + { !{ !ns2のIPアドレス; any; }; key "ns0-nsN."; }; + }; + also-notify { + ns1のIPアドレス key "ns0-nsN."; + ns2のIPアドレス key "ns0-nsN."; + }; +}; }}} * DNS隠れコンテンツマスターサーバーとして、以下の設定を行うものとする。 * IPv4/IPv6問わず、全てのクエリを受け付けない。 * 原則クエリは受け付けないけど、再帰問い合わせには答えないものとする。 |
行 120: | 行 122: |
* スレーブDNSサーバーからのRNDCを許可するためのアクセス制御を設定する(たぶん、まだ未確認)。 * このアクセス制御は、TSIGキーとIPアドレスの組み合わせとして許可することができないため、TSIGキーの配布は運用でカバーすること。 * 一応バインド(inet ~ port ~)する単位で制御することは可能だが、IPアドレスはともかくポート番号まで変えると運用が面倒なので、ここではしない。 |
* カタログゾーン(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アドレス; }; }}} デフォルトの設定となるため、今後追加されるゾーンに対しては、特に指定せずとも、指定されたマスターサーバーよりゾーン転送しようとするようになる。 ==== label.masters.catalog.example ==== 本レコード設定は、Aレコード・TXTレコードを、【スレーブサーバー】に対して、以下の設定を行うのと同等となる。 {{{ server ns0のIPアドレス { keys "ns0-nsN."; }; }}} ==== allow-query.catalog.example ==== 本レコード設定は、[[https://tools.ietf.org/html/rfc3123|APRレコード]]を、【スレーブサーバー】に対して、以下の設定を行うのと同等となる。 {{{ allow-query { any; }; }}} 本設定によりスレーブサーバー側の設定に寄らず、本設定が「デフォルト」として機能する。 ==== allow-transfer.catalog.example ==== 本レコード設定は、[[https://tools.ietf.org/html/rfc3123|APRレコード]]を、【スレーブサーバー】に対して、以下の設定を行うのと同等となる。 {{{ allow-trasnfer { none; }; }}} 本設定によりスレーブサーバー側の設定に寄らず、本設定が「デフォルト」として機能する。 = 付録1.APRレコード = * APRレコードは早々見ないレコードなので簡単に解説。 * 1レコード中に複数指定可能。 * {{{[ |!]<1|2>:<IPv4|IPv6>/<プレフィックス>}}} という4つの構成からなる。 * 先頭の「!」が無い場合はマッチ、ある場合は「マッチしない」を意味する。 * 次の「1」または「2」はアドレスファミリーを意味し、1=「IPv4」、2=「IPv6」となる。 * 指定されたIPv4ないしはIPv6はどのような表現でもかまわないが、内部では最小限の長さの表現(省略)に縮退される。 * プレフィックスにより指定されたアドレスの範囲が指定される。 |
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アドレス; };
デフォルトの設定となるため、今後追加されるゾーンに対しては、特に指定せずとも、指定されたマスターサーバーよりゾーン転送しようとするようになる。
label.masters.catalog.example
本レコード設定は、Aレコード・TXTレコードを、【スレーブサーバー】に対して、以下の設定を行うのと同等となる。
server ns0のIPアドレス { keys "ns0-nsN."; };
allow-query.catalog.example
本レコード設定は、APRレコードを、【スレーブサーバー】に対して、以下の設定を行うのと同等となる。
allow-query { any; };
本設定によりスレーブサーバー側の設定に寄らず、本設定が「デフォルト」として機能する。
allow-transfer.catalog.example
本レコード設定は、APRレコードを、【スレーブサーバー】に対して、以下の設定を行うのと同等となる。
allow-trasnfer { none; };
本設定によりスレーブサーバー側の設定に寄らず、本設定が「デフォルト」として機能する。
付録1.APRレコード
- APRレコードは早々見ないレコードなので簡単に解説。
- 1レコード中に複数指定可能。
[ |!]<1|2>:<IPv4|IPv6>/<プレフィックス> という4つの構成からなる。
- 先頭の「!」が無い場合はマッチ、ある場合は「マッチしない」を意味する。
- 次の「1」または「2」はアドレスファミリーを意味し、1=「IPv4」、2=「IPv6」となる。
- 指定されたIPv4ないしはIPv6はどのような表現でもかまわないが、内部では最小限の長さの表現(省略)に縮退される。
- プレフィックスにより指定されたアドレスの範囲が指定される。