権威サーバとキャッシュサーバの構築

balaeniceps-rex DNS

インターネットのDNS問い合わせと同等の仕組みをローカル環境に構築します。
ローカル環境に、権威サーバ、キャッシュサーバを用意し、再帰問い合わせ、非再帰問い合わせ(反復問い合わせ)をローカル環境内で完結させます。

※ここでは実際に設定、動作したものを掲載していますが、内容について保証するものではありません。流用される場合は各自の責任でお願いします。

構築する環境の要件等については 「ローカル環境にDNS問い合わせの仕組みを構築」 をご参照ください。

全体の構築作業は以下のとおりですが、今回は「① 権威サーバとキャッシュサーバの構築」を実施します。

① 権威サーバとキャッシュサーバの構築
権威サーバの DNSSEC 対応
test.com ゾーンの追加とゾーン転送の設定
④ test.com ゾーン転送の TSIG 対応(作成中)
⑤ test.com ゾーン転送の DNSSEC 対応(作成中)

今回の構築範囲は下図のとおりです。

dns-structure-physical-1

権威サーバの設定

本環境の権威サーバでは1つの BIND で複数のドメイン(ルート(.)、jp、com、test.co.jp)を管理します。

NS レコードの定義

実際の インターネットの委任情報 を参考に、各ドメインの NS レコードの定義は下表のとおりとします。
IPv4 にはプライベートアドレスを割り当て、IPv6 にはユニークローカルIPv6ユニキャストアドレス(ULA) (*1) を割り当てます。

ドメインNS名アドレス
ルート(.)[x-z].gtld-servers.net.172.18.1.[4-6], fd00::[4-6]
jp[x-z].dns.jp.172.18.1.[8-10], fd00::[8-a]
com[x-z].gtld-servers.net.172.18.1.[12-14], fd00::[c-e]
test.co.jpns[1,2].test.jp.172.18.1.[16,17], fd00::[10-11]

*1 IPv6 については勉強不足ですが、これがIPv4のプライベートアドレスに近いと思われるため。

権威サーバ(BIND)のコンフィグ設定

BINDの named.conf について、わかる範囲で解説します。

acl でアドレス範囲の別名を定義します。
本権威サーバでは各ドメインの NS に割り当てるアドレス範囲をわかりやすくするために定義しています。listen-on ステートメント等で、具体的な IP アドレスの代わりに、ここで定義した別名を指定します。
例えば、ルート(.)の NS では [x,y,z].gtld-servers.net に対して 172.18.1.[4,5,6] を割り当て、listen するアドレスを root_ip4 の範囲に制限します。
root_ip4(172.18.1.4/30)の範囲には、172.18.1.7 も含まれますが、NS に割り当てられない(= listen しない)アドレスのため、172.18.1.7 はホストのインターフェースには設定しないこととします。root_ip4 以外の定義についても同様の考え方で設定します。
(ホストに割り当てられているアドレスについては ip-a.log をご参照ください。)

acl root_ip4            { 172.18.1.4/30;  };
acl root_ip6            { fd00::4/126;    };
acl jp_ip4              { 172.18.1.8/30;  };
acl jp_ip6              { fd00::8/126;    };
acl com_ip4             { 172.18.1.12/30; };
acl com_ip6             { fd00::c/126;    };
acl test-co-jp_ip4      { 172.18.1.16/30; };
acl test-co-jp_ip6      { fd00::10/126;   };

listen-on で、この BIND で管理するドメイン(ルート(.)、jp、com、test.co.jp)の NS に割り当てられているアドレスを listen します。

  listen-on port 53 {
//    any; 127.0.0.1;
    root_ip4;
    jp_ip4;
    com_ip4;
    test-co-jp_ip4;
  };
  listen-on-v6 port 53 {
//    any; ::1;
    root_ip6;
    jp_ip6;
    com_ip6;
    test-co-jp_ip6;
  };

全てのリゾルバの IP アドレスからのクエリに応答します。(allow-query=any)
権威サーバなので再帰問合せのクエリには応答しません。(recursion=no, allow-recursion=none)
権威サーバなのでキャッシュでの応答はしません。(allow-query-cache=none)

  recursion         no;
  allow-query       { any; };
  allow-recursion   { none; };
  allow-query-cache { none; };

のちほど DNSSEC に対応する予定ですが、ここでは一旦 DNSSEC を無効とします。

  dnssec-enable     no;
  dnssec-validation no;

allow-transfer は、自身のゾーンデータの転送を許可するかどうかの設定です。
ルート(.)、jp、com、test.co.jp については、ゾーン転送を行わないため許可しません。
のちほど test.com を追加し、このゾーンの転送についての設定を行う予定です。

  allow-transfer    { none; };

allow-update は、Dynamic DNS に対応するかどうかの設定です。本環境では対応しません。

  allow-update      { none; };

1つの BIND で複数のドメインを管理するため、ドメインごとに view を設定します。
view の名前は任意ですが、本環境ではわかりやすくするためドメインを表す名前にしています。

view "ROOT" {
  …
};

view "JP" {
  …
};

view "COM" {
  …
};

view "TEST.CO.JP" {
  …
};

以下、view 内のステートメントについての説明です。

match-clients と match-destinations に指定されるアドレスで、受け付けるクエリを制限します。
match-clients はリゾルバ側、match-destinations は権威サーバ(BIND)側のアドレス指定です。(any は全てのアドレスを許可します)

  match-clients { any; };
  match-destinations { root_ip4; root_ip6; };

zone ではドメインで管理するゾーンについての定義を行います。
zone 名にはドメイン名(下記例では”.”)を指定します。type にはゾーンのタイプを、file にはゾーンファイルを指定します。

  zone "." IN {
//    type hint;
    type master;
//    file "named.ca";
    file "root.zone";
  };

ルート(.)ゾーンの場合、デフォルトでは type には hint が指定されており、file で指定されている named.ca ファイルには外部ルートへの接続情報(ルートヒント:インターネット上のルートサーバの一覧)が登録されています。
本環境でのルート(.)への参照は、ローカル環境内で完結させるため、type は master とし、file には ルートサーバのリソースレコード等を登録したゾーンデータファイル(通常のゾーンデータファイルと同じフォーマット)を指定しています。

type への指定が master と slave の場合、ゾーン転送時の役割を示します。master が指定されたゾーンはデータを送信する側、slave が指定されたゾーンはデータを受信する側です。(ルート(.)以外のゾーンでは、デフォルトで master が指定されています。master を指定した場合、必ずゾーン転送を行う必要があるというわけではありません。)

前述のとおり、file にはゾーン情報(リソースレコード等)が登録されたファイルのパスを指定します。指定が絶対パスではない場合、directory ステートメント(default:/var/named)からの相対パスとなります。

ルート(.)以外のゾーンの設定についても同様となるため説明は割愛させていただきます。

権威サーバ(BIND)のゾーン設定

本環境で設定するゾーンファイルを以下に示します。

ドメインゾーンファイル
ルート(.)root.zone
jpjp.zone
comcom.zone
test.co.jptest.co.jp.zone

構文チェック

named.conf の設定完了後、構文をチェックします。(何も表示されなければOK)

[root@auth ~]# named-checkconf
[root@auth ~]#

ゾーンファイルの構文をチェックします。(OKが表示されればOK)

[root@auth ~]# named-checkzone . /var/named/root.zone
…
OK
[root@auth ~]# named-checkzone jp /var/named/jp.zone
…
OK
[root@auth ~]# named-checkzone com /var/named/com.zone
…
OK
[root@auth ~]# named-checkzone test.co.jp /var/named/test.co.jp.zone
…
OK
[root@auth ~]#

named サービスを再起動します。

[root@auth ~]# systemctl restart named
[root@auth ~]#

権威サーバの疎通確認

www.test.co.jp の名前解決を実施した場合、キャッシュサーバからは、
→ ルート(.)の NS
→ jp の NS
→ test.co.jp の NS
の順番に非再帰問合せ(反復問合せ)が行われます。

同様に www.test.com の名前解決を実施した場合、
→ ルート(.)の NS
→ com の NS
→ test.com の NS
の順番に非再帰問合せ(反復問合せ)が行われます。(*1)

この動作を模倣し、NS 個別に疎通確認を行います。(*2)

*1 test.com はのちほど追加する予定ですので、現時点では com の NS には test.com に関するリソースレコードは登録されていません。(com の NS に対する test.com の問い合わせ結果はNXDOMAINとなります)

*2 DNSクエリには”再帰問合せ”と”非再帰問合せ(反復問合せ)”を区別するための RD ビットが設定されています。ビットが 1 の場合は再帰問合せ、0 の場合は非再帰問合せ(反復問合せ)となります。通常、クライアントからキャッシュサーバへは RD = 1(再帰問合せ)、キャッシュサーバから権威サーバへは RD=0(非再帰問合せ)で問い合わせが行われます。dig に +norec オプションを指定することで、RD=0(非再帰問合せ)として問い合わせを行うことができます。

[root@auth ~]# dig @172.18.1.4 www.test.co.jp a +norec +noall +authority +additional
jp.                     604800  IN      NS      x.dns.jp.
jp.                     604800  IN      NS      z.dns.jp.
jp.                     604800  IN      NS      y.dns.jp.
x.dns.jp.               604800  IN      A       172.18.1.8
y.dns.jp.               604800  IN      A       172.18.1.9
z.dns.jp.               604800  IN      A       172.18.1.10
x.dns.jp.               604800  IN      AAAA    fd00::8
y.dns.jp.               604800  IN      AAAA    fd00::9
z.dns.jp.               604800  IN      AAAA    fd00::a
[root@auth ~]# dig @172.18.1.8 www.test.co.jp a +norec +noall +authority +additional
test.co.jp.             604800  IN      NS      ns1.test.jp.
test.co.jp.             604800  IN      NS      ns2.test.jp.
ns1.test.jp.            604800  IN      A       172.18.1.16
ns2.test.jp.            604800  IN      A       172.18.1.17
[root@auth ~]# dig @172.18.1.16 www.test.co.jp a +norec +short
1.2.3.4
[root@auth ~]#
[root@auth ~]# dig @172.18.1.4 www.test.com a +norec +noall +authority +additional
com.                    604800  IN      NS      z.gtld-servers.net.
com.                    604800  IN      NS      y.gtld-servers.net.
com.                    604800  IN      NS      x.gtld-servers.net.
x.gtld-servers.net.     604800  IN      A       172.18.1.12
y.gtld-servers.net.     604800  IN      A       172.18.1.13
z.gtld-servers.net.     604800  IN      A       172.18.1.14
x.gtld-servers.net.     604800  IN      AAAA    fd00::c
y.gtld-servers.net.     604800  IN      AAAA    fd00::d
z.gtld-servers.net.     604800  IN      AAAA    fd00::e
[root@auth ~]# dig @172.18.1.12 www.test.com a +norec

; <<>> DiG 9.11.36-RedHat-9.11.36-16.el8_10.2 <<>> @172.18.1.12 www.test.com a +norec
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 39622
;; flags: qr aa; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 8523b6a8f788f4d657efb60466fa4137a3f7284cba48b211 (good)
;; QUESTION SECTION:
;www.test.com.                  IN      A

;; AUTHORITY SECTION:
com.                    604800  IN      SOA     x.gtld-servers.net. root.com. 0 86400 3600 604800 2000000

;; Query time: 0 msec
;; SERVER: 172.18.1.12#53(172.18.1.12)
;; WHEN: Mon Sep 30 15:12:07 JST 2024
;; MSG SIZE  rcvd: 128

[root@auth ~]#

キャッシュサーバの設定

クライアントからのDNSクエリに対する回答がキャッシュサーバにキャッシュされている場合、キャッシュから回答を返します。
キャッシュされていない場合、DNSクエリに対する回答を取得するため、権威サーバへの非再帰問い合わせ(反復問い合わせ)を行います。
デフォルトでは非再帰問い合わせ(反復問い合わせ)はインターネット上のルート(.)の NS から開始されますが、本環境ではローカル環境に構築したルート(.)の NS から開始するようにキャッシュサーバの設定を変更します。

キャッシュサーバ(BIND)のコンフィグ設定

BINDの named.conf について、わかる範囲で解説します。

acl でアドレス範囲の別名を定義します。
本キャッシュサーバでは、アクセスを許可するクライアントのアドレス範囲をわかりやすくするために定義しています。allow-query ステートメント等で、具体的な IP アドレスの代わりに、ここで定義した別名を指定します。

acl "MySubnet" { 127.0.0.1; 172.18.1.0/24;  };

キャッシュサーバなので再帰問合せのクエリに対応します。(recursion=yes)
指定アドレス範囲のクライアントに対してのみ、再帰問合せを許可します。(allow-query=MySubnet, allow-recursion=MySubnet)
指定アドレス範囲のクライアントに対してのみ、キャッシュでの応答を許可します。(allow-query-cache=MySubnet)

  recursion          yes;
  allow-query        { MySubnet; };
  allow-recursion    { MySubnet; };
  allow-query-cache  { MySubnet; };

のちほど DNSSEC に対応する予定ですが、ここでは一旦 DNSSEC を無効とします。

  dnssec-enable     no;
  dnssec-validation no;

zone “.” にはルートサーバの情報が定義されています。
キャッシュサーバが非再帰問い合わせ(反復問い合わせ)でルートサーバへアクセスする場合、ここの情報を参照します。
file に指定されているデフォルトの named.ca ファイルには外部ルートへの接続情報(ルートヒント:インターネット上のルートサーバの一覧)が登録されています。本環境ではローカル環境に構築したルートサーバの情報を登録したファイル(localhints.ca)を file に指定しています。

zone "." IN {
        type hint;
//        file "named.ca";
        file "localhints.ca";
};

構文チェック

named.conf の設定完了後、構文をチェックします。(何も表示されなければOK)

[root@cache ~]# named-checkconf
[root@cache ~]#

named サービスを再起動します。

[root@cache ~]# systemctl restart named
[root@cache ~]#

キャッシュサーバの疎通確認

キャッシュをクリア。

[root@cache ~]# rndc flush
[root@cache ~]#

www.test.co.jp の A レコードをクエリ要求。

[root@cache ~]# dig @127.1 www.test.co.jp a +short
1.2.3.4

com の NS レコードをクエリ要求。

[root@cache ~]# dig @127.1 com ns

; <<>> DiG 9.11.36-RedHat-9.11.36-16.el8_10.2 <<>> @127.1 com ns
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50883
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 7

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 7bdfd3b946a8de7af548117866fa4a2b59c0d5030910d7de (good)
;; QUESTION SECTION:
;com.                           IN      NS

;; ANSWER SECTION:
com.                    604778  IN      NS      y.gtld-servers.net.
com.                    604778  IN      NS      z.gtld-servers.net.
com.                    604778  IN      NS      x.gtld-servers.net.

;; ADDITIONAL SECTION:
z.gtld-servers.net.     604778  IN      A       172.18.1.14
y.gtld-servers.net.     604778  IN      A       172.18.1.13
x.gtld-servers.net.     604778  IN      A       172.18.1.12
z.gtld-servers.net.     604778  IN      AAAA    fd00::e
y.gtld-servers.net.     604778  IN      AAAA    fd00::d
x.gtld-servers.net.     604778  IN      AAAA    fd00::c

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Sep 30 15:50:19 JST 2024
;; MSG SIZE  rcvd: 256

[root@cache ~]#

キャッシュの登録状況を確認します。

[root@cache ~]# rndc dumpdb
[root@cache ~]# cat /var/named/data/cache_dump.db
;
; Start view _default
;
;
; Cache dump of view '_default' (cache _default)
;
; using a 0 second stale ttl
$DATE 20240930070253
; authanswer
.                       604786  IN NS   x.root-servers.net.
                        604786  IN NS   z.root-servers.net.
                        604786  IN NS   y.root-servers.net.
; authanswer
com.                    604793  NS      y.gtld-servers.net.
                        604793  NS      z.gtld-servers.net.
                        604793  NS      x.gtld-servers.net.
; glue
jp.                     604786  NS      z.dns.jp.
                        604786  NS      x.dns.jp.
                        604786  NS      y.dns.jp.
; glue
test.co.jp.             604786  NS      ns1.test.jp.
                        604786  NS      ns2.test.jp.
; authanswer
www.test.co.jp.         604786  A       1.2.3.4
; glue
x.dns.jp.               604786  A       172.18.1.8
; glue
                        604786  AAAA    fd00::8
; glue
y.dns.jp.               604786  A       172.18.1.9
; glue
                        604786  AAAA    fd00::9
; glue
z.dns.jp.               604786  A       172.18.1.10
; glue
                        604786  AAAA    fd00::a
; glue
ns1.test.jp.            604786  A       172.18.1.16
; glue
ns2.test.jp.            604786  A       172.18.1.17
; glue
x.gtld-servers.net.     604793  A       172.18.1.12
; glue
                        604793  AAAA    fd00::c
; glue
y.gtld-servers.net.     604793  A       172.18.1.13
; glue
                        604793  AAAA    fd00::d
; glue
z.gtld-servers.net.     604793  A       172.18.1.14
; glue
                        604793  AAAA    fd00::e
; glue
x.root-servers.net.     604786  A       172.18.1.4
; glue
                        604786  AAAA    fd00::4
; glue
y.root-servers.net.     604786  A       172.18.1.5
; glue
                        604786  AAAA    fd00::5
; glue
z.root-servers.net.     604786  A       172.18.1.6
; glue
                        604786  AAAA    fd00::6
…
タイトルとURLをコピーしました