DNSサーバ構築手順(ソースからBIND 9.10.1-P1をインストール + 内部向け権威DNSサーバ構築)

はじめに
===

CentOS 6.6サーバにソースからBIND 9.10.1-P1をインストールし、内部向けの権威DNSサーバを構築する手順です。

BINDはyumでインストールできますが、BIND脆弱性対応等により、yumのパッケージが提供されるより早く最新バージョンのBINDをインストールしたいといった事があるかと思います。

今回の例では、新しく構築したCentOS 6.6サーバ(BINDがインストールされていないサーバ)に対して、ソースファイルからBIND 9.10.1-P1をインストールする手順について記載致します。

<del> 構築するBINDサーバには例示用として「test.example.com」ゾーンを作成し、digコマンドで、本ゾーンの名前解決(正引き)を行うところまで記載致します。</del>

　　↓

構築するBINDサーバには例示用として「test.example.com」と「100.51.192.in-addr.arpa」ゾーンを作成し、digコマンドで、本ゾーンに対する名前解決(正引きと逆引き)を行うところまで記載致します。

今回構築するDNSサーバの用途
===

今回の例で、BIND 9.10.1-P1をインストールするCentOS 6.6サーバは、プライベートなネットワーク内のマシンやサーバからの名前解決でのみ利用する内部向け権威DNSサーバとして構築します。

なお、プライベートなネットワーク内のマシンやサーバから、digやnslookupコマンドを使用せずに内部向けゾーンの名前解決を行えるようにする為には、DNSフォワーダや再帰検索を担う内部向けのDNSフルサービスリゾルバサーバが必要になります。

今回はDNSフルサービスリゾルバ構築手順については割愛しますが、フルサービスリゾルバ(DNSキャッシュサーバ)構築例としては、以下が参考になるかもしれません。

unbound 1.5.1によるDNSキャッシュサーバ構築例
http://qiita.com/na0AaooQ/items/ac0e2f0588c70a12f0c5

BIND 9.10.1-P1によるDNSキャッシュサーバ構築例
http://qiita.com/na0AaooQ/items/8fe5fca279449d96e277

参考サイト
===

BINDのソースインストール手順については、以下のページを参考にさせて頂きました。
http://etcsysconfig.hatenadiary.jp/entry/2013/03/15/155149
http://www.eis.co.jp/bind9_src_build_1/
http://www.geocities.jp/yasasikukaitou/bind_install.html
http://centossrv.com/bind.shtml

named.confの設定については、http://qiita.com/dumpty-alma@github 様の以下のページを参考にさせて頂きました。
http://qiita.com/dumpty-alma@github/items/536f21de67d0ed2c8e85

digコマンドの詳細については、以下のページを参考にさせて頂きました。
http://d.hatena.ne.jp/japanrock_pg/20090410/1239355230

make testでFAILが出る場合の対応については、以下のページを参考にさせて頂きました。
http://cathand.info/?p=85
http://diary.bis5.net/2013/07/27/302.html

BINDサーバで不要サービスを停止する際、 http://qiita.com/RentalCat__ 様の以下のページを参考にさせて頂きました。
http://qiita.com/RentalCat__/items/862d0ec075e97ae52b52

BIND 9.10.1-P1のソースファイル
===

今回の例では、ISCから以下のソースファイルをダウンロードして、BINDをインストールします。

ftp://ftp.isc.org/isc/bind9/9.10.1-P1/bind-9.10.1-P1.tar.gz

BIND 9.10.1-P1インストールする環境
===

BIND 9.10.1-P1をインストールするOSは以下になります。

・CentOS release 6.6 (2.6.32-504.3.3.el6.x86_64)

BIND 9.10.1-P1ソースインストール手順 (事前準備)
===

・BIND 9.10.1-P1をインストールしたいCentOS 6.6サーバにrootユーザでログインします。

・ホスト名を変更します。

```
# cp -p /etc/sysconfig/network /etc/sysconfig/network.ORG
#

# sed -i 's/^HOSTNAME=localhost.localdomain/HOSTNAME=dns-bind-server/' /etc/sysconfig/network
```

```
# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=dns-bind-server
NOZEROCONF=yes
#
```

・CentOS 6.6サーバのカーネルやパッケージ類をアップデートします。

```
# yum update
```

・BINDインストールに最低限必要なパッケージをインストールします。

configure実行時に必要なgccやperl(perl-Net-DNS)やmakeをインストールします。
BINDでDNSSECを利用する場合は、OpenSSLもインストールします。

```
# yum -y install gcc
# yum -y install make
# yum -y install perl-Net-DNS
# yum -y install openssl-devel
```

・その他あると便利なパッケージ類をインストールします。

wgetはBINDソースのダウンロードに利用します。
sysstatはsarコマンドでBINDサーバの負荷を見るときに便利なのでインストールします。
ntpdateはBINDサーバの時刻同期の為にインストールします。

```
# yum -y install wget
# yum -y install sysstat
# yum -y install ntpdate
```

・パッケージ版のBINDはインストールされていない事を確認します。

```
# rpm -qa | grep bind
#
```

・サーバをリブートします。

```
# reboot
```

BIND 9.10.1-P1ソースインストール手順 (BINDインストール)
===

・CentOS 6.6サーバが起動したら、rootユーザでログインします。

```
[root@dns-bind-server ~]# hostname
dns-bind-server
[root@dns-bind-server ~]# uname -a
Linux dns-bind-server 2.6.32-504.3.3.el6.x86_64 #1 SMP Wed Dec 17 01:55:02 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@dns-bind-server ~]# cat /etc/redhat-release
CentOS release 6.6 (Final)
[root@dns-bind-server ~]#
```

・BINDソースファイルをダウンロードします。

```
[root@dns-bind-server ~]# cd /usr/local/src
[root@dns-bind-server src]# pwd
/usr/local/src
[root@dns-bind-server src]# ls -lrta /usr/local/src
total 8
drwxr-xr-x.  2 root root 4096 Sep 23  2011 .
drwxr-xr-x. 12 root root 4096 Sep 30 07:18 ..
[root@dns-bind-server src]#
[root@dns-bind-server src]# wget ftp://ftp.isc.org/isc/bind9/9.10.1-P1/bind-9.10.1-P1.tar.gz

[root@dns-bind-server src]# ls -lrta /usr/local/src/bind-9.10.1-P1.tar.gz
-rw-r--r--. 1 root root 8356463 Jan 28 23:50 /usr/local/src/bind-9.10.1-P1.tar.gz
[root@dns-bind-server src]#
```

・ダウンロードしたBINDソースファイルを展開します。

```
[root@dns-bind-server src]# pwd
/usr/local/src
[root@dns-bind-server src]# tar zxvf /usr/local/src/bind-9.10.1-P1.tar.gz

[root@dns-bind-server src]# cd /usr/local/src/bind-9.10.1-P1
[root@dns-bind-server bind-9.10.1-P1]# 
```

・展開したBINDソースファイルをコンパイルします。

```
[root@dns-bind-server bind-9.10.1-P1]# ll /var/named
ls: cannot access /var/named: No such file or directory
[root@dns-bind-server bind-9.10.1-P1]#
```

```
[root@dns-bind-server bind-9.10.1-P1]# pwd
/usr/local/src/bind-9.10.1-P1
[root@dns-bind-server bind-9.10.1-P1]# ./configure --prefix=/var/named/chroot --enable-threads --with-openssl=yes --enable-openssl-version-check --disable-ipv6
[root@dns-bind-server bind-9.10.1-P1]#
```

```
[root@dns-bind-server bind-9.10.1-P1]# pwd
/usr/local/src/bind-9.10.1-P1
[root@dns-bind-server bind-9.10.1-P1]# make
[root@dns-bind-server bind-9.10.1-P1]#
```

```
[root@dns-bind-server bind-9.10.1-P1]# pwd
/usr/local/src/bind-9.10.1-P1
[root@dns-bind-server bind-9.10.1-P1]# ll bin/tests/system/ifconfig.sh
-rwxr-xr-x. 1 10292 9901 5760 Nov 21 08:56 bin/tests/system/ifconfig.sh
[root@dns-bind-server bind-9.10.1-P1]#
[root@dns-bind-server bind-9.10.1-P1]# bin/tests/system/ifconfig.sh up
[root@dns-bind-server bind-9.10.1-P1]#
[root@dns-bind-server bind-9.10.1-P1]# pwd
/usr/local/src/bind-9.10.1-P1
[root@dns-bind-server bind-9.10.1-P1]# make test
　(長いので途中省略)

I:System test result summary:
I:        44 FAIL
I:         X PASS
I:         X SKIPPED
```

・make testでFAILが出た場合の対応。

以下サイトを見ますと、make testでFAILが出る場合、BINDソースディレクトリのオーナーをrootに変更する必要があります。
正確にはソースディレクトリのオーナーをmake testを実行するユーザ(今回の例ではrootユーザ)に合わせておく必要があるそうです。
http://cathand.info/?p=85
http://diary.bis5.net/2013/07/27/302.html

```
[root@dns-bind-server bind-9.10.1-P1]# chown -R root /usr/local/src/bind-9.10.1-P1
[root@dns-bind-server bind-9.10.1-P1]#
```

再度make testを実行し、FAILがなくなった事を確認します。

```
[root@dns-bind-server bind-9.10.1-P1]# pwd
/usr/local/src/bind-9.10.1-P1
[root@dns-bind-server bind-9.10.1-P1]# make test
　(長いので途中省略)
I:exit status: 0
R:PASS
E:zonechecks:Fri Jan 29 XX:XX:XX JST 2015
I:System test result summary:
I:      63 PASS
I:       6 SKIPPED
make[3]: Leaving directory `/usr/local/src/bind-9.10.1-P1/bin/tests/system'
make[2]: Leaving directory `/usr/local/src/bind-9.10.1-P1/bin/tests'
make[1]: Leaving directory `/usr/local/src/bind-9.10.1-P1'
[root@dns-bind-server bind-9.10.1-P1]#
```

・make installを実行してコンパイルしたBINDをインストールします。

```
[root@dns-bind-server bind-9.10.1-P1]# pwd
/usr/local/src/bind-9.10.1-P1
[root@dns-bind-server bind-9.10.1-P1]# make install
　(長いので途中省略)

ln /var/named/chroot/share/man/man1/isc-config.sh.1 /var/named/chroot/share/man/man1/bind9-config.1
/usr/bin/install -c -m 644 ./bind.keys /var/named/chroot/etc
[root@dns-bind-server bind-9.10.1-P1]#
```

・BINDがインストールされた事を確認します。

```
[root@dns-bind-server bind-9.10.1-P1]# ls -lrta /var/named/
total 12
drwxr-xr-x. 18 root root 4096 Jan 29 01:06 ..
drwxr-xr-x.  3 root root 4096 Jan 29 01:06 .
drwxr-xr-x.  9 root root 4096 Jan 29 01:22 chroot
[root@dns-bind-server bind-9.10.1-P1]#
[root@dns-bind-server bind-9.10.1-P1]# ls -lrta /var/named/chroot/
total 36
drwxr-xr-x.  3 root root 4096 Jan 29 01:06 var
drwxr-xr-x.  3 root root 4096 Jan 29 01:06 ..
drwxr-xr-x.  3 root root 4096 Jan 29 01:22 share
drwxr-xr-x. 12 root root 4096 Jan 29 01:22 include
drwxr-xr-x.  2 root root 4096 Jan 29 01:22 lib
drwxr-xr-x.  2 root root 4096 Jan 29 01:22 sbin
drwxr-xr-x.  9 root root 4096 Jan 29 01:22 .
drwxr-xr-x.  2 root root 4096 Jan 29 01:22 bin
drwxr-xr-x.  2 root root 4096 Jan 29 01:22 etc
[root@dns-bind-server bind-9.10.1-P1]#
[root@dns-bind-server bind-9.10.1-P1]# ls -lrta /var/named/chroot/sbin/named
-rwxr-xr-x. 2 root root 9974284 Jan 29 01:22 /var/named/chroot/sbin/named
[root@dns-bind-server bind-9.10.1-P1]#
[root@dns-bind-server bind-9.10.1-P1]# /var/named/chroot/sbin/named -v
BIND 9.10.1-P1
[root@dns-bind-server bind-9.10.1-P1]#
```

・bindユーザとbindグループを作成します。

bindグループを作成します。

```
[root@dns-bind-server bind-9.10.1-P1]# cd ~
[root@dns-bind-server ~]#
[root@dns-bind-server ~]# cp -p /etc/group /etc/group.ORG
[root@dns-bind-server ~]# cp -p /etc/passwd /etc/passwd.ORG
[root@dns-bind-server ~]# cp -p /etc/shadow /etc/shadow.ORG
[root@dns-bind-server ~]#

[root@dns-bind-server ~]# groupadd -g 25 bind
[root@dns-bind-server ~]#
```

bindユーザを作成します。
先のBINDインストールで/var/namedディレクトリが既に作成されている為、以下のようなメッセージが表示されますが、問題ありません。

```
[root@dns-bind-server ~]# useradd -u 25 -g bind -d /var/named -c "DNS BIND Named User" -s /sbin/nologin bind
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
[root@dns-bind-server ~]#
```

・bindユーザにスイッチできない事を確認します。

```
[root@dns-bind-server ~]# id bind
uid=25(bind) gid=25(bind) groups=25(bind)
[root@dns-bind-server ~]# su - bind
This account is currently not available.
[root@dns-bind-server ~]#
```

・chroot配下にデバイスファイルを作成します。

```
[root@dns-bind-server ~]# mkdir /var/named/chroot/dev
[root@dns-bind-server ~]# ls -lrta /var/named/chroot/dev/
total 8
drwxr-xr-x. 10 root root 4096 Jan 29 01:39 ..
drwxr-xr-x.  2 root root 4096 Jan 29 01:39 .
[root@dns-bind-server ~]#

[root@dns-bind-server ~]# mknod -m 666 /var/named/chroot/dev/null c 1 3
[root@dns-bind-server ~]#

[root@dns-bind-server ~]# ls -lrta /var/named/chroot/dev/null
crw-rw-rw-. 1 root root 1, 3 Jan 29 01:40 /var/named/chroot/dev/null
[root@dns-bind-server ~]#

[root@dns-bind-server ~]# mknod -m 666 /var/named/chroot/dev/random c 1 8
[root@dns-bind-server ~]#
```

・rndcキーを作成します。

```
[root@dns-bind-server ~]# /var/named/chroot/sbin/rndc-confgen -a
wrote key file "/var/named/chroot/etc/rndc.key"
[root@dns-bind-server ~]#
```

・以下のようにrndcキーファイルが作成された事を確認します。

```
[root@dns-bind-server ~]# cat /var/named/chroot/etc/rndc.key
key "rndc-key" {
        algorithm hmac-md5;
        secret "XXXXXXXXXXXXXXXXXXXXX";
};
[root@dns-bind-server ~]#
```

・/usr/locals/sbin/配下にrndcコマンド等のシンボリックリンクを作成します。

```
[root@dns-bind-server ~]# ls -lrta /var/named/chroot/sbin/rndc
-rwxr-xr-x. 1 root root 1452030 Jan 29 01:22 /var/named/chroot/sbin/rndc
[root@dns