条件付きフォワーダ機能

![dns.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/ef8a955b-b8d6-a812-f510-c3632db563d1.png)

クライアント(resolve.conf)からの問い合わせ先になっていたDNSはそのままにして、
別ドメインの名前解決を行う必要が発生したため、DNSフォワーダ機能を利用。
検証した時の設定値を以下に記載。

## 目的
１．クライアントからbind#1で管理するドメインのホスト名を解決できること

```bash:
nslookup www.gh.co.jp
```
⇒成功

２．クライアントからbind#1で管理するドメインのサブドメインのホスト名を解決できること

```bash:
nslookup www.private.gh.co.jp
```
⇒成功

３．クライアントからbind#1からフォワードされたドメインのホスト名を解決できること

```bash:
nslookup  www.private.domain.local
```
⇒成功
　dnssecを有効の状態でやる場合、鍵の作成やゾーンファイルの署名が必要になる模様
　今回は用意する予定はないため、"dnssec-enable no"としています。


## 環境
AzureでRHEL(IaaS)を3台構築

|#|種別|用途|IPアドレス|resolve.conf|
|---|---|---|---|---|
|1|クライアントPC|クライアント見立てのPC|10.0.0.4|10.0.0.5|
|2|bind#1|クライアントから見たときのDNS|10.0.0.5|10.0.0.5|
|3|bind#2|bind#1で管理していないドメインをマスターで保持|10.0.0.6|10.0.0.6|

# bind#1 の設定

## named.conf

```bash:/etc/named.conf
options {
        listen-on port 53 { 127.0.0.1; 10.0.0.0/24; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { localhost; 10.0.0.0/24; };
        allow-transfer  { none; };

        recursion yes;          /*再起問い合わせは有効化しないとフォワードリクエストで名前解決不可*/
        dnssec-enable no;       /*dnssecを無効化しないとフォワードできない*/
        dnssec-validation no;   /*dnssecを無効化しないとフォワードできない*/

        bindkeys-file "/etc/named.root.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };

        /*Debugのためにログ出力*/
        channel "queries_log" {
                file "/var/log/queries.log" versions 10 size 100M;
                severity info;
                print-time yes;
        };
        category queries { "queries_log"; };
};

/* メインドメイン(gh.co.jp) は "#1 master/#2 slave" */
zone "gh.co.jp" IN {
       type master;
       file "gh.co.jp.zone";
};

/* サブドメイン(private.gh.co.jp) は "#1 stub/#2 master" */
/* stub設定にすることで#2の設定変更のみで良い構成とした */
zone "private.gh.co.jp" IN {
       type stub;
       file "slaves/private.gh.co.jp.zone";
       masters {10.0.0.6;};
};

/* ローカルドメイン(private.domain.local) は "#1 forward/#2 master" */
zone "private.domain.local" IN {
       type forward;
       forward only;
       forwarders { 10.0.0.6; };
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
```

## zone

```bash:/var/named/gh.co.jp.zone
$TTL    86400

@       IN      SOA     ns1.gh.co.jp. root.gh.co.jp.    (
        2020020804
        3600
        900
        604800
        86400
)

@                      IN      NS      ns1
ns1                    IN      A       10.0.0.5
www                    IN      CNAME   ns1

private                IN      NS      ns2.private
ns2.private            IN      A       10.0.0.6
```

```bash:/var/named/slaves/private.gh.co.jp.zone
$ORIGIN .
$TTL 86400      ; 1 day
private.gh.co.jp        IN SOA  ns2.private.gh.co.jp. root.private.gh.co.jp. (
                                2020021101 ; serial
                                3600       ; refresh (1 hour)
                                900        ; retry (15 minutes)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      ns2.private.gh.co.jp.
$ORIGIN private.gh.co.jp.
ns2                     A       10.0.0.6
```

# bind#2 の設定

## named.conf

```bash:/etc/named.conf
options {
        listen-on port 53 { 127.0.0.1; 10.0.0.0/24; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { localhost; 10.0.0.0/24; };
        allow-transfer  { none; };

        recursion no;          /*#2は再起問い合わせしないのでno*/
        dnssec-enable no;       /*dnssecを無効化しないとフォワードできなかった*/
        dnssec-validation no;   /*dnssecを無効化しないとフォワードできなかった*/

        bindkeys-file "/etc/named.root.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };

        /*Debugのためにログ出力*/
        channel "queries_log" {
                file "/var/log/queries.log" versions 10 size 100M;
                severity info;
                print-time yes;
        };
        category queries { "queries_log"; };
};

/* サブドメイン(private.gh.co.jp) は "#1 stub/#2 master" */
/* stub設定にすることで#2の設定変更のみで良い構成とした */
/* stub用にゾーン転送設定を入れてある */
zone "private.gh.co.jp" IN {
        type master;
        file "private.gh.co.jp.zone";
        notify explicit;
        also-notify { 10.0.0.5; };
        allow-transfer { 10.0.0.5; };
};

/* ローカルドメイン(private.domain.local) は "#1 forward/#2 master" */
zone "private.domain.local" IN {
        type master;
        file "private.domain.local.zone";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
```

## zone

```bash:/var/named/private.domain.local.zone
$TTL    86400

@       IN      SOA     ns3.private.domain.local. root.private.domain.local.    (
        2020020813     ;Serial
        3600           ;Reflesh
        900            ;Retry
        604800         ;Expire
        86400          ;Minimum
)
;
                       IN      NS      ns3.private.domain.local.
;
ns3                    IN      A       10.0.0.6
www                    IN      CNAME   ns3
```