内部向けDNS構築・解説 CentOS7.1

#概要
CentOS7.1を使用して、内部向けDNSを構築します。
DNSサーバーとして、BIND 9.9.4を使用します。
各種サイトや構築を通じて、自分なりの理解した内容などを記載していきます。



以下URLを参考にしました。
http://centossrv.com/bind.shtml
http://www.itmedia.co.jp/keywords/bind_tsukuru_dns_server.html
http://www.atmarkit.co.jp/ait/articles/0309/09/news001.html
http://www.atmarkit.co.jp/ait/articles/0310/15/news001.html
http://qiita.com/shrkw/items/8410e9cb65eb789a40e1

#DNS構築
##DNSインストールディレクトリ構成

CentOS7.1でyumコマンドを使用した、BINDのディレクトリ構成を下に書きます。

![DNSインストールディレクトリ構成.png](https://qiita-image-store.s3.amazonaws.com/0/104247/01d62fe3-4b4b-b386-a419-04b85c774b25.png)


chrootとは
BINDのサービス「named-chroot」によって、DNSのプロセスがアクセス可能な範囲を制限します。
内部的にchrootコマンドを使用しているはずです（名前的に）
DNSでなぜ必要かというと、DNSサーバーは基本的に世界中に公開するので、悪い人から攻撃を受ける恐れがあります。
そこで、DNS関係のプロセスの参照出来る範囲を制限することにより、
万が一ユーザー権限を奪われてしまっても、大事なファイルは参照出来なくさせます。
今回のDNS設定では /var/named/chroot/ が DNSプロセスにとってのルートディレクトリになります。
詳しくはhttp://www.atmarkit.co.jp/ait/articles/0309/09/news001.html


##インストール
bind(DNSサーバープログラム)と、bind-chroot(BIND用にカスタマイズされたchrootプログラム？)をインストールします。

```
[root@mng-server ~]# yum -y install bind bind-chroot
```


bind-chrootのインストールで生成された、chroot化スクリプトを実行します。

```
[root@mng-server ~]# /usr/libexec/setup-named-chroot.sh /var/named/chroot on
```

これを実行することにより、以下のようにディレクトリやファイルがマウントされます。
スクリプトをoffにすると、mount先のファイルが綺麗になくなって、mount元にのみ存在します。
また、BIND設定完了後に起動するサービス「named-chroot」によっても、マウントされます。
今まで触っていたファイルが急に消えてなくなるように見えるため、注意が必要です。

| mount元 | mount先 |
|:-----------|:------------|
| /etc/named | /var/named/chroot/etc/named |
| /etc/named.root.key     | /var/named/chroot/etc/named.root.key |
| /etc/named.conf       | /var/named/chroot/etc/named.conf |
| /etc/named.rfc1912.zone | /var/named/chroot/etc/named.rfc1912.zones |
| /etc/rndc.key | /var/named/chroot/etc/rndc.key | 
| /etc/named.iscdlv.key | /var/named/chroot/etc/named.iscdlv.key | 
| /run/named | /var/named/chroot/run/named |
| /var/named | /var/named/chroot/var/named | 
| /usr/lib64/bind | /var/named/chroot/usr/lib64/bind | 


##named.confの作成

各種サイトを調べて、自分なりの理解した内容を書きます。
間違っている可能性も十分あるので注意してください。

BINDを構築する上での、大元の設定ファイルが　named.conf です。
今回の構成では、/var/named/chroot/etc/named.conf が格納先になります。
chrootでマウントされているので、実体は/etc/named.confに有ります。

まずはファイル全体の中身を以下のように変更します。
環境に依存する内容もあるので、適宜修正してください。

```/var/named/chroot/etc/named.conf
/* 内部セグメントを定義 */
acl "mylabo-network" {
        192.168.11.0/24;
        192.168.12.0/24;
        192.168.13.0/24;
        192.168.14.0/24;
        192.168.15.0/24;
};

options {
        #listen-on port 53 { 127.0.0.1; };
        listen-on-v6 port 53 { ::1; } ; //IPv6は使用しません
        version         "unknown";
        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";
        allow-query     { localhost; mylabo-network; }; //内部セグメントからの問い合わせのみ許可します

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion yes; // インターネットに接続するので、フルサービスリゾルバ(キャッシュサーバ)としても動作させます

        /* DNSSECは無効にします */
        dnssec-enable no;
        dnssec-validation no;
        //dnssec-lookaside auto;
        managed-keys-directory "/var/named/dynamic";

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        /* 自分自身で名前解決出来ない場合は、上位のDNSサーバー(自宅ルーター)にフォワードします */
        forwarders {
                192.168.11.1;
        };
        forward only;


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

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
        category lame-servers { null; }; //追加(error (connection refused) resolvingというエラーログの出力抑止)
};

view "internal" {
        /* 最上部で定義したローカルネットワークを、内部問い合わせとして定義します */
        match-clients { localhost; mylabo-network; };
        match-destinations { localhost; mylabo-network; };

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

        /* 正引きゾーン */
        zone "mylabo.local" IN {
                type master;
                file "mylabo.local.lan";
        };

        /* 逆引きゾーン */
        zone "11.168.192.in-addr.arpa" {
                type master;
                file "11.168.192.in-addr.arpa.rev";
        };

        zone "14.168.192.in-addr.arpa" {
                type master;
                file "14.168.192.in-addr.arpa.rev";
        };

        zone "15.168.192.in-addr.arpa" {
                type master;
                file "15.168.192.in-addr.arpa.rev";
        };

        include "/etc/named.rfc1912.zones"; //localhostなどの定義
        include "/etc/named.root.key";
};

/* 内部むけDNSなので、外部向けのViewはコメントアウト
view "external" {
        match-clients { any; };
        match-destinations { any; };
        recursion no;
};
 */
```

###named.confの構成について
named.confは大きく分けて、↓の4種類のカテゴリに分かれます。

```
acl "任意のacl名称" {
        省略
};

options {
        省略
};

logging {
        省略
};

view "任意のview名称" {
        省略
};
```

一つずつ簡単に解説します。
####1カテゴリ目：acl(access control list)
named.confを編集していく上で、ネットワークアドレスなどを指定して、
アクセス可否などを設定する箇所があります。
例えば5セグメントを指定したい時は、5セグメント分書いても動作しますが、
いちいち書くのがめんどくさいので、名前を付ける事が出来ます。

今回のサンプルではmylabo-networkを定義しました。

```named.confのacl抜粋
/* 内部セグメントを定義 */
acl "mylabo-network" {
        192.168.11.0/24;
        192.168.12.0/24;
        192.168.13.0/24;
        192.168.14.0/24;
        192.168.15.0/24;
};
```

↑の定義をすると、↓のように、他の設定項目で使用できる名前となります。

```
allow-query     { localhost; mylabo-network; }; //内部セグメントからの問い合わせのみ許可します
```
　

####2カテゴリ目：options
BINDの色々な動作を指定します。
大事なポイントやデフォルトから変更したところを説明していきます。
　

```named.confのoption抜粋
#listen-on port 53 { 127.0.0.1; };
listen-on-v6 port 53 { ::1; } ; //IPv6は使用しません
```

BINDが名前解決を受け付けるNICインターフェースのIPアドレスを指定します。
例えば「listen-on port 53 { 127.0.0.1; };」の設定値なら、「127.0.0.1」のインターフェースへの
アクセスのみ受け付ける形になるので、自分自身しか名前解決をすることが出来ない構成になります。
それでは困るので、コメントアウトします。
「listen-on-v6 port 53 { ::1; } ;」はIPv6なので、今回は使用しません。
このまま自分自身のみ受け付ける設定にします。
　
　

```named.confのoption抜粋
version         "unknown";
```

BINDのバージョンを記載している箇所になりますが、ここに正しいバージョン書くと
外部からのBINDのバージョンを確認出来てしまうので、
脆弱性を攻撃されやすくなってしまいます。
なので、unknownにして隠します。
　
　

```named.confのoption抜粋
directory       "/var/named";
```

named.confが4カテゴリに分けられるうちの、3カテゴリ目(logging)、4カテゴリ目(view)で
各種ファイルへの参照を指定するのですが、それらのカレントディレクトリをここで指定します。
今回の構成ではchroot構成なので、絶対パスは「/var/named/chroot/var/named」です。
混乱しやすいところなので注意しましょう。
　
　

```named.confのoption抜粋
allow-query     { localhost; mylabo-network; }; //内部セグメントからの問い合わせのみ許可します
```

名前解決を受け付ける、DNSクライアントのIPアドレスを指定します。
mylabo-network は1カテゴリ目(acl)で定義しました。
　
　

```named.confのoption抜粋
recursion yes; // インターネットに接続するので、フルサービスリゾルバ(キャッシュサーバ)としても動作させます
```

yesにすると、自分自身で解決出来ない問い合わせに対して、ほかのDNSサーバたちを使用して再帰問い合わせをします。
noではしません。
　
　

```named.confのoption抜粋
/* DNSSECは無効にします */
dnssec-enable no;
dnssec-validation no;
//dnssec-lookaside auto;
managed-keys-directory "/var/named/dynamic";
```

DNSSECというセキュリティ機能の仕様有無を指定します。
公開鍵暗号方式を使用してセキュィティ向上を図るようです。
今回は使用しません。
　
　

```named.confのoption抜粋
/* 自分自身で名前解決出来ない場合は、上位のDNSサーバー(自宅ルーター)にフォワードします */
forwarders {
        192.168.11.1;
};
forward only;
```
コメントにも書いてますが、他のDNSへフォワードする際のIPアドレスを指定します。
「forward only;」の箇所がよくわかってないので、詳しい方、是非教えてください。

forward には二種類の指定があり、 only か first です。

以下説明引用
このオプションは、forwarders オプションが記述されているときのみ有効になる。 
first を指定すると、最初に（キャッシュの中に答えが見つからなければ） forwarders で指定した
ネームサーバに問い合わせ、もし答えが得られなければ次に自分自身で答えを見つけようとする。 
only を指定すると、単純に forwarders で指定したネームサーバに問い合わせる。 
デフォルトは first。
LAN 内のネームサーバのような、インターネットに直接問い合わせをさせたくないサーバで使用される。
引用終了

onlyにするとインターネット上にあるサーバーの名前解決(google.co.jp)が出来たのですが、
firstではできませんでした。
上記の説明では、firstでも外部へ名前解決してくれそうな内容ですが、してくれませんでした。謎です。


####3カテゴリ目：logging

DNSの各種ログファイルの出力を設定します。

```named.confのlogging抜粋
channel default_debug {
        file "data/named.run";
        severity dynamic;
};
category lame-servers { null; }; //追加(error (connection refused) resolvingというエラーログの出力抑止)
```

上記はデフォルトのログ出力に、「category lame-servers { null; };」を加えました。



また、BINDの名前解決をする際のデバッグ出力の例を以下に書きます。

```
logging {
        channel "default_debug" {
                file "data/named.run";
                severity debug;
                print-time yes;
                print-severity yes;
                print-category yes;
        };
        
        category queries { "default_debug"; };
        category resolver { "default_debug"; };
        
        category lame-servers { null; }; //追加(error (connection refused) resolvingというエラーログの出力抑止)
```   

channel "default_debug"のseverity をdebugにすることにより、ログ出力のレベルを指定します。

下記3種類のyesの指定は、ログ内に時間やログの内容・ログレベル(debugとかinfoとか)を出力します。
これら出力されないとわかりにくいので、yesが良いと思います。
print-time yes;
print-severity yes;
print-category yes;

ログ出力の例

```
18-Dec-2015 23:49:38.702 queries: info: client 127.0.0.1#54599 (torapc.mylabo.local): view internal: query: torapc.mylabo.local IN A + (127.0.0.1)
18-Dec-2015 23:49:38.703 queries: info: client 127.0.0.1#57318 (3.11.168.192.in-addr.arpa): view internal: query: 3.11.168.192.in-addr.arpa IN PTR + (127.0.0.1)
18-Dec-2015 23:49:39.705 queries: info: client 127.0.0.1#34290 (3.11.168.192.in-addr.arpa): view internal: query: 3.11.168.192.in-addr.arpa IN PTR + (127.0.0.1)
18-Dec-2015 23:49:45.654 queries: info: client 127.0.0.1#38613 (google.co.jp): view internal: query: google.co.jp IN A + (127.0.0.1)
18-Dec-2015 23:49:45.654 resolver: debug 1: createfetch: google.co.jp A
18-Dec-2015 23:49:45.669 queries: info: client 127.0.0.1#33558 (207.126.194.173.in-addr.arpa): view internal: query: 207.126.194.173.in-addr.arpa IN PTR + (127.0.0.1)
18-Dec-2015 23:49:45.669 resolver: debug 1: createfetch: 207.126.194.173.in-addr.arpa PTR
18-Dec-2015 23:49:46.669 queries: info: client 127.0.0.1#51301 (207.126.194.173.in-addr.arpa): view internal: query: 207.126.194.173.in-addr.arpa IN PTR + (127.0.0.1)
```

↓のページにloggingの詳細が書かれています。
http://www.atmarkit.co.jp/ait/articles/0310/15/news001.html


####4カテゴリ目：view

viewの基本的な使い方は、内部向けの名前解決の処理方法と、外部向けの処理方法を分けて設定することが出来ます。

view "internal" で内部向けの設定、view "external"で外部向けの設定を加えるのが一般的です。
viewの名前は任意の名前を設定することが出来ます。

```named.confのview抜粋
/* 最上部で定義したローカルネットワークを、内部問い合わせとして定義します */
match-clients { localhost; mylabo-network; };
match-destinations { localhost; mylabo-network; };
```

viewで処理するための条件をここで指定します。
match-clientsでは、名前解決の要求元のIPアドレスを指定します。
自分自身と、内部ネットワークをview "internal"として定義します。

match-destinationsの指定は、BINDサーバーのインターフェースのIPアドレスを指定します。
例えば、192.168.15.1のインターフェース用のviewを定義、
192.168.16.1用のviewを定義、といったようにインターフェースごとに処理方法を分けることが可能です。
今回は特に分割する必要がないので、「localhost; mylabo-network;」としてますが、
これはネットワークアドレスでの指定ですので、正確な指定ではありませんね(´-`)
　

```named.confのview抜粋
zone "." IN {
        type hint;
        file "named.ca";
};
```

DNSのルートドメインの指定です。
この指定は他のサーバーでも同一のものになります。
type でhintと指定しているので、ルートドメイン用の定義になります。
file で指定しているのが、他のファイルへの参照を表しています。
optionカテゴリのdirectoryでカレントディレクトリを指定していますので、
「/var/named/chroot/var/named/named.ca」のファイルを参照してください、という意味になります。
chroot環境なので、注意が必要です。

named.caファイルは、インストール時にデフォルトで生成されます。
　

```named.confのview抜粋
/* 正引きゾーン */
zone "mylabo.local" IN {
        type master;
        file "mylabo.local.lan";
};
```

正引き用のゾーンの指定です。
zone でDNSのサフィックスを定義できます。
type でmasterと指定しているので、DNSプライマリサーバーであることを表しています。
slave と指定すると、セカンダリサーバーとなります。
fileで正引き用のゾーンファイルを指定しています。
「/var/named/chroot/var/named/mylabo.local.lan」を参照します。
　

```named.confのview抜粋
/* 逆引きゾーン */
zone "11.168.192.in-addr.arpa" {
        type master;
        file "11.168.192.in-addr.arpa.rev";
};

zone "14.168.192.in-addr.arpa" {
        type master;
        file "14.168.192.in-addr.arpa.rev";
};

zone "15.168.192.in-addr.arpa" {
        type master;
        file "15.168.192.in-addr.arpa.rev";
};
```

逆引き用のゾーンの指定です。
zoneの指定方法が特殊ですが、それ以外は正引き用と変わりません。
今回逆引きしたいのは3セグメントあるので、3つの定義があります。

192.168.11.0/24のセグメント用の定義が一番上のものになります。
ネットワークセグメントを逆順に記載するのと、末尾に「.in-addr.arpa」を追加する必要があります。
「.in-addr.arpa」を付与することで、正引きと同じ機能を使って、逆引きを出来るようにします。

例）
torapc.mylabo.local→正引き→192.168.11.3
3.11.168.192.in-addr.arpa→正引き→torapc.mylabo.local

「3.11.168.192.in-addr.arpa」というホスト名として、正引きをする処理となります。
　
　

```named.confのview抜粋
include "/etc/named.rfc1912.zones"; //localhostなどの定義
include "/etc/named.root.key";
```
named.confファイルは、includeを使用して、外部にあるファイルから定義を引用することが出来ます。
ローカルホストの定義や、ルートドメイン用のファイルは、それぞれのBINDで定義するよりも
一個のファイルを流用したほうが整理しやすくなります。

「named.rfc1912.zones」の中身を下に書きます。

```named.rfc1912.zones
// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package 
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
// and http://www.ietf.org/internet-drafts/draft-ietf-dnsop-default-local-zones-02.txt
// (c)2007 R W Franks
// 
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

zone "localhost.localdomain" IN {
type master;
file "named.localhost";
allow-update { none; };
};

zone "localhost" IN {
type master;
file "named.localhost";
allow-update { none; };
};



zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};


zone "1.0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};


zone "0.in-addr.arpa" IN {
type master;
file "named.empty";
allow-update { none; };
};
```

IPv4, IPv6のローカルホスト用の正引き、逆引きが定義されていることがわかります。


##ゾーンファイルの作成

ゾーンファイル(名前解決のための情報)を作成します。
今回の例では正引き1種類。
逆引き3種類のファイルを作成します。

###正引き用ファイルについて
/var/named/chroot/var/named/の直下に
mylabo.local.lanファイルを作成します。

```/var/named/chroot/var/named/mylabo.local.lan
$TTL 3600
@                IN      SOA mng-server.mylabo.local. root.mylabo.local. (
                         2015121701 ; serial
                         3600       ; refresh 1hr
                         900        ; retry 15min
                         604800     ; expire 1w
                         86400      ; min 24hr
)

                 IN      NS     mng-server.mylabo.local.
torapc           IN      A      192.168.11.3
storage          IN      A      192.168.14.253
ESXi-Primary     IN      A      192.168.15.50
ESXi-Secondary   IN      A      192.168.15.51
vCenter          IN      A      192.168.15.252
mng-server       IN      A      192.168.15.253
```

各種要素を下で説明していきます。

```mylabo.local.lan抜粋
$TTL 3600
```

3600秒間(1時間)このゾーンの内容が、他のDNSサーバーにキャッシュされることを表しています。
これを長くしすぎると、ゾーンファイルを更新しても、なかなか他のサーバーへ情報が浸透しないことになります。
即反映させるには、ほかのDNSサーバーのキャッシュを全てクリアする必要があるのですが、
現実的ではありません。というかムリです。なのでそこそこの時間にするのが良いのかなと思います。
　


```mylabo.local.lan抜粋
@                IN      SOA mng-server.mylabo.local. root.mylabo.local. (
                         2015121701 ; serial
                         3600       ; refresh 1hr
                         900        ; retry 15min
                         604800     ; expire 1w
                         86400      ; min 24hr
)
```

SOA(Start Of Authority)レコードの定義です。
SOAレコードについて簡単に説明すると、「私はこのドメインの情報を管理します」という宣言です。
上記の例では、「mylabo.local」ドメインを管理しているDNSサーバーは、
「mng-server.mylabo.local.」ということを表しています。
（ドメインの正確な定義については無視します）

それでは1つずつ解説していきます。

@
自分自身のゾーン名を表しています。直接 mng-server.mylabo.local.と書いても問題ありません。

IN
決まり文句です。InterNetから取られているとか、INternet から取られているとか言われています。（どっちでもいい）

SOA
レコードの種類を表しています。IN SOAとか、IN NSとか、INT A とか指定が可能です。

mng-server.mylabo.local.
MNAMEです。
ゾーンファイルの基となるデータを持つネームサーバの名前を表しています。
基本的に自分自身になります。

root.mylabo.local. 
RNAMEです。このゾーンを管理する管理者のメールアドレスを表しています。
メールアドレスの@を.に変換するらしいので、
root@mylabo.local. というメールアドレスになります。


(　)でくくられた各種設定値
DNSセカンダリサーバーと連携する際の各種設定値を指定することが出来ます。

serial
ゾーンファイルのバージョンを表す数字です。
年月日2桁の昇順の数字 を書く場合が多いです。
ゾーンファイルが大きいと新しいバージョンと認識されるので、
セカンダリサーバーはプライマリサーバーのバージョンを見に行き、
バージョンが大きければゾーン転送をすることになります。
年月日で書くと、管理しやすいことがわかります。

refresh
ゾーンの情報をリフレッシュするまでの時間です。
DNSセカンダリサーバはゾーン転送をした後、この時間経過後、
ゾーンの更新がされたかを問い合わせ、必要に応じて再度データを手に入れようとします
この時に、上のserialを使用してバージョンを比較します。

retry
refreshでゾーン情報の更新ができなかった場合に、
retryで指定された時間後に再度リフレッシュを試みます。

expire
何らかの理由でゾーン情報のリフレッシュができない状態が続いた場合、
セカンダリネームサーバが持っているデータをどれだけの時間利用してもよいかを示します。

min（Negative cache TTL）
ネガティブキャッシュとは、存在しないドメイン名であるという情報のキャッシュを意味します
（ネガティブキャッシュの維持する時間）
存在しないことを問い合わせの都度確認すると時間がかかりますし、上位DNSサーバーへの負荷もかかるので、
キャッシュとして保持します。
　
　

```mylabo.local.lan抜粋
                 IN      NS     mng-server.mylabo.local.
```

NSレコードです。決まり文句なので、自分自身の情報を書きましょう
　

```mylabo.local.lan抜粋
torapc           IN      A      192.168.11.3
share-storage    IN      A      192.168.14.253
ESXi-Primary     IN      A      192.168.15.50
ESXi-Secondary   IN      A      192.168.15.51
vCenter          IN      A      192.168.15.252
mng-server       IN      A      192.168.15.253
```

Aレコードです。各種ホスト名のIPアドレスを定義していきます。

###逆引き用ファイルについて
3セグメント分の逆引き用ファイルを作成します。

基本的には正引き用ファイルと構成は同じです。
Aレコードの代わりにPTRレコードで、逆引き用の情報を定義します。

```/var/named/chroot/var/named/11.168.192.in-addr.arpa.rev
$TTL 3600
@                IN      SOA mng-server.mylabo.local. root.mylabo.local. (
                         2015121701 ; serial
                         3600       ; refresh 1hr
                         900        ; retry 15min
                         604800     ; expire 1w
                         86400      ; min 24hr
)

                 IN      NS     mng-server.mylabo.local.
3                IN      PTR    torapc.mylabo.local.
```

```/var/named/chroot/var/named/14.168.192.in-addr.arpa.rev
$TTL 3600
@                IN      SOA mng-server.mylabo.local. root.mylabo.local. (
                         2015121701 ; serial
                         3600       ; refresh 1hr
                         900        ; retry 15min
                         604800     ; expire 1w
                         86400      ; min 24hr
)

                 IN      NS     mng-server.mylabo.local.
253              IN      PTR    share-storage.mylabo.local.
```


```/var/named/chroot/var/named/15.168.192.in-addr.arpa.rev
$TTL 3600
@                IN      SOA mng-server.mylabo.local. root.mylabo.local. (
                         2015121701 ; serial
                         3600       ; refresh 1hr
                         900        ; retry 15min
                         604800     ; expire 1w
                         86400      ; min 24hr
)

                 IN      NS     mng-server.mylabo.local.
50               IN      PTR    ESXi-Primary.mylabo.local.
51               IN      PTR    ESXi-Secondary.mylabo.local.
252              IN      PTR    vCenter.mylabo.local.
253              IN      PTR    mng-server.mylabo.local.
```

##ファイアウォールのDNSポート解放

firewalldを使用してDNSポート(TCP:53 UDP:53)を解放します。

参考にしました
http://qiita.com/shrkw/items/8410e9cb65eb789a40e1


firewalldを止めていたので、有効にします。

```
[root@mng-server ~]# systemctl start firewalld
[root@mng-server ~]#
[root@mng-server ~]# systemctl enable firewalld
ln -s '/usr/lib/systemd/system/firewalld.service' '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
ln -s '/usr/lib/systemd/system/firewalld.service' '/etc/systemd/system/basic.target.wants/firewalld.service'
[root@mng-server ~]# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since 日 2015-12-20 13:47:27 JST; 12s ago
 Main PID: 2201 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─2201 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

12月 20 13:47:27 mng-server.mylabo.local systemd[1]: Started firewalld - dynamic firewall daemon.

```
　
　
firewalldで現在使用しているゾーンを表示します。

```
[root@mng-server ~]# firewall-cmd --list-all
public (default, active)
  interfaces: eno16777984
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
```
　

eno16777984のインターフェースが、ゾーンpublicで稼働しています。
servicesの項目が、ポート解放しているサービスです。
dnsが無いので追加しますが、その前にdnsサービスの定義内容を念のため確認します。

```
[root@mng-server ~]# cat /usr/lib/firewalld/services/dns.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>DNS</short>
  <description>The Domain Name System (DNS) is used to provide and request host and domain names. Enable this option, if you plan to provide a domain name service (e.g. with bind).</description>
  <port protocol="tcp" port="53"/>
  <port protocol="udp" port="53"/>
</service>
```

tcp 53, udp 53が定義されています。


ではpublicゾーンにdnsを追加します。

```
[root@mng-server ~]# firewall-cmd --list-services --zone=public  --permanent
dhcpv6-client ssh
[root@mng-server ~]# firewall-cmd --add-service=dns --zone=public --permanent
success
[root@mng-server ~]# firewall-cmd --list-services --zone=public  --permanent
dhcpv6-client dns ssh
```

リロードして有効化します。

```
[root@mng-server ~]# firewall-cmd --reload
success
```


##BIND起動

ここまで構築したら、あとはサービス起動できます。

```
[root@mng-server named]# systemctl start named-chroot
[root@mng-server named]# systemctl enable named-chroot ← 自動起動設定
ln -s '/usr/lib/systemd/system/named-chroot.service' '/etc/systemd/system/multi-user.target.wants/named-chroot.service'
```

##名前解決確認
###正引き

digコマンドで正引きを確認します。

```file:digコマンド
[root@mng-server ~]# dig torapc.mylabo.local.

; <<>> DiG 9.9.4-RedHat-9.9.4-18.el7_1.5 <<>> torapc.mylabo.local.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45901
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;torapc.mylabo.local.           IN      A

;; ANSWER SECTION:
torapc.mylabo.local.    3600    IN      A       192.168.11.3

;; AUTHORITY SECTION:
mylabo.local.           3600    IN      NS      mng-server.mylabo.local.

;; ADDITIONAL SECTION:
mng-server.mylabo.local. 3600   IN      A       192.168.15.253

;; Query time: 0 msec
;; SERVER: 192.168.15.253#53(192.168.15.253)
;; WHEN: 木 12月 17 23:03:49 JST 2015
;; MSG SIZE  rcvd: 105
```

;; ANSWER SECTION:の1行下に名前解決のレコードが表示されました。


###逆引き

こちらもdigコマンド -x で逆引きを確認します。

```file:digコマンド
[root@mng-server named]# dig -x 192.168.11.3

; <<>> DiG 9.9.4-RedHat-9.9.4-18.el7_1.5 <<>> -x 192.168.11.3
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54774
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;3.11.168.192.in-addr.arpa.     IN      PTR

;; ANSWER SECTION:
3.11.168.192.in-addr.arpa. 3600 IN      PTR     torapc.mylabo.local.

;; AUTHORITY SECTION:
11.168.192.in-addr.arpa. 3600   IN      NS      mng-server.mylabo.local.

;; ADDITIONAL SECTION:
mng-server.mylabo.local. 3600   IN      A       192.168.15.253

;; Query time: 0 msec
;; SERVER: 192.168.15.253#53(192.168.15.253)
;; WHEN: 木 12月 17 23:18:13 JST 2015
;; MSG SIZE  rcvd: 128
```