22
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CentOS7とbind9.9.4/bind-chroot9.9.4を利用したDNSサーバ構築

Posted at

CentOS7とbind9.9.4/bind-chroot9.9.4を利用したDNSサーバ構築

私自身はあまりインフラ・ネットワークが得意ではなく、なかなか勉強してこなかった分野です。
不足している知識領域を少しでも改善すべく、今回はbindを使ったDNSサーバの構築を行って、ネットワークの知識を少し身に着けられればと思って、勉強がてら実施した内容をQiitaの記事にまとめました。

環境

環境 概要
1 IP 192.168.33.70
2 Vagrant 2.0.3
3 Oracle VM VirtualBox 5.2.8
4 CentOS 7.4
5 bind 9.9.4
6 bind-chroot 9.9.4
7 bind-utils 9.9.4

事前準備

BINDを用いたDNSサーバ構築

bindのインストール

sudo yum -y install bind bind-chroot bind-utils

インストールしたbindのバージョン確認

yum list installed | grep bind

bind.x86_64                     32:9.9.4-51.el7_4.2             @updates
bind-chroot.x86_64              32:9.9.4-51.el7_4.2             @updates
bind-libs.x86_64                32:9.9.4-51.el7_4.2             @updates
bind-libs-lite.x86_64           32:9.9.4-51.el7_4.2             @updates
bind-license.noarch             32:9.9.4-51.el7_4.2             @updates
bind-utils.x86_64               32:9.9.4-51.el7_4.2             @updates
rpcbind.x86_64                  0.2.0-42.el7                    @anaconda

rootにsuする

ここから先の手順で、例えば/var/namedにcdし、chrootができていることを確認するなどの作業では、sudoで確認できないため、rootにsuします。

su -

chrootができていることを確認する

以下のコマンド実行で、chrootというディレクトリが存在することを確認します。

cd /var/named/
ls

namedの関連ファイルが存在しないことを確認

bindおよびbind-chrootインストール直後、まだbindおよびbind-chrootのサービスが起動していないため、設定ファイルが存在しないことを確認します。

cd /var/named/chroot/etc
ls -laF

drwxr-x---. 4 root named 30  4月 14 09:55 ./
drwxr-x---. 7 root named 61  4月 14 09:55 ../
drwxr-x---. 2 root named  6  1月 22 22:30 named/
drwxr-x---. 3 root named 25  4月 14 09:55 pki/

cd /var/named/chroot/etc/named/
ls -laF
drwxr-x---. 2 root named  6  1月 22 22:30 ./
drwxr-x---. 4 root named 30  4月 14 09:55 ../

bind-chrootの役割

通常、bindのルートディレクトリは/ですが、bind-chrootを利用することで/var/named/chrootがルートディレクトリになり、bindのプロセスがアクセス可能なディレクトリ領域を制限することが出来ます。
※bindのプロセスが/var/named/chrootより上のディレクトリへアクセスできない状態で環境構築される。
セキュリティの観点から、bindでのDNSサーバ構築時には、bind-chrootの利用が推奨されているようです。

bind-chrootのサービスを自動起動設定+起動

以下ではnamedを意図的にdisableにしていますが、通常yumでインストールした直後はdisableのままなので不要な手順です。
bind-chrootを利用してセキュアなDNSサーバを構築する場合、namedのサービスは自動起動をOFFに設定するようなので、意図的に記述しています。

systemctl disable named.service
systemctl enable named-chroot
systemctl start named-chroot

namedの関連ファイルが自動で生成されていることを確認

上記手順の、named-chrootサービスを起動したタイミングで/var/named/chroot/etc配下に設定ファイルなどが自動で生成されます。

cd /var/named/chroot/etc
ll

合計 688
-rw-r--r--. 2 root root     292  3月 28 01:13 localtime
drwxr-x---. 2 root named      6  1月 22 22:30 named
-rw-r-----. 1 root named   1705  3月 22  2016 named.conf
-rw-r--r--. 1 root named   3923  1月 22 22:30 named.iscdlv.key
-rw-r-----. 1 root named    931  6月 21  2007 named.rfc1912.zones
-rw-r--r--. 1 root named   1587  5月 22  2017 named.root.key
drwxr-x---. 3 root named     25  4月 14 09:55 pki
-rw-r--r--. 1 root root    6545  6月  7  2013 protocols
-rw-r-----. 1 root named     77  4月 14 10:13 rndc.key
-rw-r--r--. 1 root root  670293  6月  7  2013 services

DNSの設定を行うための事前情報

bindを使ってDNSサーバを構築する練習用に、内部ドメイン名としてYou-name-is-YU.localというドメインを利用して以下の構成のDNS設定を行ってみようと思います。

IPアドレス ドメイン名 役割(仮)
1 192.168.33.70 ns.You-name-is-YU.local DNSサーバ
2 192.168.33.80 mail.You-name-is-YU.local メールサーバ
3 192.168.33.90 proxy.You-name-is-YU.local Proxyサーバ
4 192.168.33.100 web.You-name-is-YU.local Webサーバ
5 192.168.33.110 app.You-name-is-YU.local アプリケーションサーバ

named.confの編集

/var/named/chroot/etc/named.confファイルを編集します。
編集前のnamed.confは以下の状態です。(参考までに)

 11
 12 options {
 13         listen-on port 53 { 127.0.0.1; };
 14         listen-on-v6 port 53 { ::1; };
 15         directory       "/var/named";
 16         dump-file       "/var/named/data/cache_dump.db";
 17         statistics-file "/var/named/data/named_stats.txt";
 18         memstatistics-file "/var/named/data/named_mem_stats.txt";
 19         allow-query     { localhost; };
 20
 21         /*
 22          - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
 23          - If you are building a RECURSIVE (caching) DNS server, you need to enable
 24            recursion.
 25          - If your recursive DNS server has a public IP address, you MUST enable access
 26            control to limit queries to your legitimate users. Failing to do so will
 27            cause your server to become part of large scale DNS amplification
 28            attacks. Implementing BCP38 within your network would greatly
 29            reduce such attack surface
 30         */
 31         recursion yes;
 32
 33         dnssec-enable yes;
 34         dnssec-validation yes;
 35
 36         /* Path to ISC DLV key */
 37         bindkeys-file "/etc/named.iscdlv.key";
 38
 39         managed-keys-directory "/var/named/dynamic";
 40
 41         pid-file "/run/named/named.pid";
 42         session-keyfile "/run/named/session.key";
 43 };
 44
 45 logging {
 46         channel default_debug {
 47                 file "data/named.run";
 48                 severity dynamic;
 49         };
 50 };
 51
 52 zone "." IN {
 53         type hint;
 54         file "named.ca";
 55 };
 56
 57 include "/etc/named.rfc1912.zones";
 58 include "/etc/named.root.key";
 59

ファイルを編集する前に必ずバックアップを取得しておいてください。

cp -p /var/named/chroot/etc/named.conf /var/named/chroot/etc/named.conf.org

named.confの56行目に以下の記述を追加します。
以下の記述はYou-name-is-YU.localのドメインに対し、ゾーンファイルの紐付け定義をしています。
ゾーンファイルとは、DNSの設定ファイルの一つで、DNSゾーンについての管理情報やホスト名、アドレス情報などを記述したファイルです。
DNSが管理する範囲をゾーンと呼ぶ。

zone "You-name-is-YU.local" IN {
  type master;
  file "You-name-is-YU.local.zone";
};

※最後のセミコロンを付け忘れると、named-chrootサービスを再起動するタイミングでエラーが発生するので注意しましょう。

正引きゾーンファイルの作成

bindをインストールすると、ゾーンファイルのサンプルが一緒に配置される。
そのサンプルをコピーして、必要なゾーンファイルを作成します。

cp -p /var/named/chroot/var/named/named.localhost /var/named/chroot/var/named/You-name-is-YU.local.zone

コピーしたゾーンファイルを以下のように修正します。

vim /var/named/chroot/var/named/You-name-is-YU.local.zone
1 $TTL 1D
2 @       IN SOA  ns.You-name-is-YU.local. root.You-name-is-YU.local. (
3                                         0       ; serial
4                                         1D      ; refresh
5                                         1H      ; retry
6                                         1W      ; expire
7                                         3H )    ; minimum
8         IN NS   ns.You-name-is-YU.local.
9 @       IN A    192.168.33.70
10 ns      IN A    192.168.33.70
11 mail    IN A    192.168.33.80
12 proxy   IN A    192.168.33.90
13 web     IN A    192.168.33.100
14 app     IN A    192.168.33.110

SOAレコードの設定

SOAレコードは、Start of Authorityの略で、ドメイン名からそのドメインに関する権威をもつホストやDNS管理者を定義するレコード。

|#|設定値|概要|
|:--|:--|:--|:--|
|1|ns.You-name-is-YU.local.|プライマリDNSサーバ名|
|2|root.You-name-is-YU.local.|ドメイン管理者のメールアドレスを表す。
root.You-name-is-YU.local. ⇒ root@You-name-is-YU.local
メールアドレスの「@」は「.」に置き換えること。|
|3|0 ; serial|設定ファイルのシリアル番号を10桁以内の数字で記述。
日付+通し番号(YYYYMMDDXX)の形式が一般的とのこと。|
|4|1D ; refresh|セカンダリDNSサーバが、ゾーンデータの更新チェックをする間隔|
|5|1H ; retry|プライマリDNSサーバが応答しないときに再度参照を行うまでの間隔|
|6|1W ; expire|セカンダリDNSサーバが、プライマリDNSサーバへアクセスできない状態が続いた場合、そのゾーンデータを無効にするまでの期間|
|7|3H ) ; minimum|ネガティブキャッシュの生存期間
ネガティブキャッシュは、DNS問合せに失敗した情報|

NSレコード

NSレコードは、Name Serverの略で、下位(空白の場合はその)ドメインのネームサーバを表すレコード。

|#|設定値|概要|
|:--|:--|:--|:--|
|1| IN NS ns.You-name-is-YU.local.|ドメインのネームサーバ。|

Aレコード

Aレコードは、Host Addressの「A」からきており、ホスト名からIPアドレスへの変換のためのレコード。
正引きを表す。

|#|設定値|概要|
|:--|:--|:--|:--|
|1|@ IN A 192.168.33.70|「@」は自ドメインを表している。ここではYou-name-is-YU.localに192.168.33.70を対応付けしていることと同義。|
|2|ns IN A 192.168.33.70|ns.You-name-is-YU.localのIPアドレスが192.168.33.70であることを表す。|
※その他同様

正引きゾーンファイルの構文チェック

上記の設定が正しいか構文チェックを行います。
以下のような出力結果になっていればOKです。

named-checkzone You-name-is-YU.local /var/named/chroot/var/named/You-name-is-YU.local.zone

zone You-name-is-YU.local/IN: loaded serial 0
OK

resolv.confを編集

/etc/resolv.confは主にネームサーバ(DNSサーバ)のIPアドレスを記述するファイルです。
今回は検証のため、このファイルを以下のように修正します。

nameserver 127.0.0.1

named-chrootのサービスを再起動

systemctl restart named-chroot

nslookupで名前解決のテスト

nslookup You-name-is-YU.local

Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   You-name-is-YU.local
Address: 192.168.33.70
nslookup mail.You-name-is-YU.local

Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   mail.You-name-is-YU.local
Address: 192.168.33.80

digコマンドでも名前解決のテスト

digコマンドは、yumでインストールしたbind-utilsで利用可能なコマンドで、ネームサーバから情報を引き出すためのコマンドツールです。

以下のようにコマンドを実行することでネームサーバの設定情報を引き出し確認することが出来ます。

dig web.You-name-is-YU.local

; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> web.You-name-is-YU.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57266
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web.You-name-is-YU.local.      IN      A

;; ANSWER SECTION:
web.You-name-is-YU.local. 86400 IN      A       192.168.33.100

;; AUTHORITY SECTION:
You-name-is-YU.local.   86400   IN      NS      ns.You-name-is-YU.local.

;; ADDITIONAL SECTION:
ns.You-name-is-YU.local. 86400  IN      A       192.168.33.70

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: 土  4月 14 12:46:21 JST 2018
;; MSG SIZE  rcvd: 102

素人には上記だと情報量が多く、ちょっとわかりづらいので、以下のようなオプションを付けて実行するとすっきりしていていいなと思いました。

dig web.You-name-is-YU.local +noall +an | cat -n
     1
     2  ; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> web.You-name-is-YU.local +noall +an
     3  ;; global options: +cmd
     4  web.You-name-is-YU.local. 86400 IN      A       192.168.33.100

その他メモ

DNSで利用するポートは53なので、firewalldなどで対象のポートを開ける必要が出てくるかと思います。
今回はローカル環境でのみ検証したため特に気にしていませんが、必要に応じてその他設定が発生してくるのかと。

22
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?