BIND で内向き DNS Server を構築する

#【BIND で内向き DNS Server を構築する】
* bind の構築手順まとめ

# ◇ 演習環境
* OS: CentOS7

# ◇ 構築手順

## 1. インストール
* パッケージは CentOS6 までと変化なし
* セキュリティのお約束として chroot もインストール

```bash
yum install bind bind-chroot bind-utils
```

## 2. chroot ディレクトリのマウント
* bind 起動時に chroot ディレクトリをマウントしてくれるが念の為に実行する

```bash
/usr/libexec/setup-named-chroot.sh /var/named/chroot on
```

## 3. bind 設定
### a. 設定ファイル編集

```/etc/named.conf
@@ -11 +11 @@
-       listen-on port 53 { 127.0.0.1; };
+       listen-on port 53 { 127.0.0.1; 192.168.100.11; };
@@ -17 +17 @@
-       allow-query     { localhost; };
+       allow-query     { localhost; localnets; };
@@ -47,0 +51 @@
+       category lame-servers { null; };
@@ -57 +61 @@
-
+include "/etc/named/named.mydomain.org.zone";
```
* allow-query: localnets を追加し、ローカルネットワークからのクエリを許可
* lame-servers: エラーメッセージ( connection refused ) の抑止

### b. 書式確認
```
named-checkconf /etc/named.conf
```
* 標準出力にエラーが出なければ問題なし


## 4. bind 起動オプション設定
* IPv4 のみ有効化とし、IPv6 関連の余計なエラー出力を抑止する

```bash
echo 'OPTIONS="-4"' >> /etc/sysconfig/named
```

## 5. ルートゾーン更新スクリプト設置
### a. スクリプト作成  

* あまり更新されることは無いが、更新された時に備えて設置する

```/etc/cron.monthly/named.root_update
#!/bin/bash

new=`mktemp`
errors=`mktemp`

dig . ns @198.41.0.4 +bufsize=1024 > $new 2> $errors

if [ $? -eq 0 ]; then
    sort_new=`mktemp`
    sort_old=`mktemp`
    diff_out=`mktemp`
    sort $new > $sort_new
    sort /var/named/chroot/var/named/named.ca > $sort_old
    diff --ignore-matching-lines=^\; $sort_new $sort_old > $diff_out
    if [ $? -ne 0 ]; then
        (
         echo '-------------------- old named.root --------------------'
         cat /var/named/chroot/var/named/named.ca
         echo
         echo '-------------------- new named.root --------------------'
         cat $new
         echo '---------------------- difference ----------------------'
         cat $diff_out
        ) | mail -s 'named.root updated' root
        cp -f $new /var/named/chroot/var/named/named.ca
        chown named. /var/named/chroot/var/named/named.ca
        chmod 644 /var/named/chroot/var/named/named.ca
        which systemctl > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            systemctl restart named-chroot > /dev/null
        else
            /etc/rc.d/init.d/named restart > /dev/null
        fi
    fi
    rm -f $sort_new $sort_old $diff_out
else
    cat $errors | mail -s 'named.root update check error' root
fi
rm -f $new $errors
```

### b. 実行権限を付与
```bash
chmod 700 /etc/cron.monthly/named.root_update
```

## 5. 内向き Zone 定義ファイル作成
### a. Zone ファイル作成
```/etc/named/named.mydomain.org.zone
zone "mydomain.org" {
        type master;
        allow-update { localhost; localnets; };
};
zone "100.168.192.in-addr.arpa" {
        type master;
        file "100.168.192.in-addr.arpa.db";
        allow-update { localhost; localnets; };
};
```
* allow-update: DDNS 設定の追加。dhcp から IP を払い出した際にゾーン更新を行う。

### b. 書式確認
```
named-checkconf /etc/named/named.mydomain.org.zone
```
* 標準出力にエラーが出なければ問題なし

## 6. 内向き Zone 設定 (正引き)
### a. Zone ファイル作成
```/var/named/mydomain.org.db
$TTL    86400
@       IN      SOA     mydomain.org.     root.mydomain.org. (
                                      2016050401 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN NS    mydomain.org.
        IN MX 10 mydomain.org.
@       IN A     192.168.100.11
*       IN A     192.168.100.11

master  IN A     192.168.100.11
```

### b. 書式確認
```bash
named-checkzone mydomain.org /var/named/mydomain.org.db
```
* OK が出れば記述誤り無し

## 7. 内向き Zone 設定 (逆引き)
### a. Zone ファイル作成
```/var/named/100.168.192.in-addr.arpa.db
$TTL    86400
@       IN      SOA     mydomain.org.     root.mydomain.org. (
                                      2016050401 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN NS   mydomain.org.
11      IN PTR  mydomain.org.

11      IN PTR  master
```

### b. 書式確認
```bash
named-checkzone 100.168.192.in-addr.arpa /var/named/100.168.192.in-addr.arpa.db
```
* OK が出れば記述誤り無し

## 8. 所有者変更
```bash
chown named:named /var/named -R
```

## 9. firewalld 設定
### a. アクセス許可設定追加
```
firewall-cmd --add-service=dns --zone=public --permanent
```

### b. 設定反映
```
firewall-cmd --reload
```

### c. 反映確認
```
firewall-cmd --list-all
```
* services に dns が追加されれば反映完了

## 10. BIND 起動設定

### a. BIND 起動
```bash
systemctl start named-chroot.service
```

### b. BIND 自動起動設定追加
```bash
systemctl enable named-chroot.service
```

### c. BIND 起動確認
```bash
systemctl status named-chroot.service
```
* 下記2つが確認出来れば起動完了
 1. Loaded: loaded (/usr/lib/systemd/system/named-chroot.service; __enabled__; vendor preset: disabled)
 2. Active: __active (running)__


## 11. Network 設定

a. インターフェースへ DNS 設定追加

```bash
vim /etc/sysconfig/network-scripts/ifcfg-enp0s3
----
-PEERDNS="yes"
+PEERDNS="no"
+DNS1="192.168.100.11"
```

* PEERDNS: DHCP を使用している場合、PEERDNS="no" を追加して DCHP から DNS 設定を受け取らないようにする
* DNS1: 自分自身を DNS サーバとして設定

b. 設定反映

```bash
systemctl restart NetworkManager
```

## 12. 動作確認

* ANSWER SECTION に設定した IP アドレスの応答があれば設定完了

```bash
dig master.mydomain.org @localhost
```