DNS (BIND) Server

CentOS 8にDNSサーバー構築(BIND)

DNSサーバーについて

DNSサーバーは主に「ドメイン」⇔「IPアドレス」のような名前解決をする際に利用されるサービスです。
例えば「https://example.com」にWEBアクセスした際にどこのホスト(IPアドレス)のWEBサーバーにアクセスするか、名前解決が行われるのです。
また、自ドメインを自サーバーのDNSにて管理されていることは世界中のDNSサーバーに広報され、「https://example.com」にアクセスされた際にクライアント側の最寄りのDNSサーバーから自サーバーに通信されます。

本手順では、自ドメインの管理のみを行うDNSサーバーの構築を「BIND」と呼ばれるパッケージを用いて行います。
自サーバーで運営するドメイン以外のリクエストは処理しないようにすることで、トラフィックの増加や誰でもリクエストできてしまうことによるセキュリティー低下を防ぎます。

 

構築環境

  • CentOS Linux release 8.2.2004 (Core)
  • BIND 9.11.13-RedHat-9.11.13-6.el8_2.1
  • bind-chroot.x86_64 32:9.11.13-6.el8_2.1
  • ルータで「ポート 53」を開放
  • ドメイン取得サービスの設定で自サーバーのIPへDNSサーバーを設定しておく
  • 固定IPをプロバイダにて取得しておく

 

 

ルータのポート開放で名前解決の通信を受け入れる

BINDによるDNSサーバーの構築を行う前に、サーバー側NWのルータのポートを開放して、外部からの通信がサーバーに届くようにします。

http通信で使われるポート番号は「53」になります。
ポートの設定方法はルータによって違いますが、概ね下記のような感じです。

 

プロトコル TCP / UDP
開始ポート番号 53
終了ポート番号 53
サーバーのローカルアドレス 192,168.x.x

 

▼通信イメージ

 

 

▼ルータの設定イメージ

 

 

BINDのインストール

BINDの関連ファイル

/etc
 └named.conf ゾーンファイルの展開先やフォルダ構造含め、BINDの設定ファイル。
/var/named
 └named.ca キャッシュ用ゾーンファイル。
 └example.zone 正引き用ゾーンファイル。
 └example.rev 引き用ゾーンファイル。
 └local.zone ホスト自身内で正引きするのに利用されるループバック用ゾーンファイル。
 └local.rev ループバックの逆引き用ゾーンファイル。
/var/run/named
 └named.pi ループバックの逆引き用

 

▼パッケージ確認

CentOS 8 では dnf コマンドを利用してパッケージ情報検索やインストール、削除を行うことができます。
パッケージファイルが管理されているダウンロードサーバーをリポジトリと呼び、新規でリポジトリを追加することで、ダウンロードできるファイルの種類を増やすことが可能です。


dnfでインストール可能なBINDのパッケージを検索して確認しておきます。
 command
# dnf list | grep bind
bind-export-libs.x86_64 32:9.11.13-3.el8 @anaconda

 

▼BIND関連ファイルとchroot化パッケージのインストール

「-y」オプションを指定すると、インストール可否の確認で「yes」となり自動的にインストールが開始します。


 command
# dnf install -y bind
# dnf install -y bind-chroot

 

▼コンフィグファイル編集

 command
# vi /etc/named.conf

 

named.conf(アクセスリスト「ACL」の設定)


▼いちばん上あたりに「acl」で接続許可アドレスを追記。
「;」セミコロンで区切って複数設定してグループ化が可能。
下記の例は2つのアドレスがslave-serverというグループ名で定義、以降はslave-serverの名称で参照可能。
acl "slave-server" {
xxx.xxx.xxx.xxx;
xxx.xxx.xxx.xxx;
};

 

▼aclでアクセス拒否をする場合の設定例
acl "not-ip" {
!xxx.xxx.xx/24; #特定IP/24(256個)を「!」で全て拒否
!xx.xx/16; #さらに大きいネットワーク帯全てを拒否
any; #それ以外の全てのアドレスを許可
}

 

▼aclで下記は予約されているので「名称」として利用できない。
・any:すべてのアドレス
・none:すべてのアドレスを否定
・localhost:ローカルのシステムで使用するIPアドレス(IPv4, IPv6)
・localnets:ローカルのシステムが接続するネットワークアドレス(IPv4, IPv6)

 

 

named.conf(optionsの設定)

 

▼optionsステートメントは下記内に記述します。
options {

 

▼port 53で受け付けるIPアドレスの設定を変更
DNSサーバーが利用するport53で受け付けるアドレスを設定します。
特にアクセス制限を設けない場合は下記のように「any」で設定します。
listen-on port 53 { any; };

 

▼同じくIPv6でのport 53のアドレス設定を変更
今回はIPv6での名前解決はしないので「none」で設定します。
listen-on-v6 port 53 { none; };

 

▼先ほどのスレーブサーバーの定義を追記
ゾーンファイルの交換によるファイル転送を許可するという意味です。
allow-transfer { slave-server; };

 

▼リクエスト許可の設定に変更
「allow-query」の設定が「localhost」となっています。
今回は内部のみのDNSではなく取得したドメインの名前解決で使用するので、すべてのリクエストを許可しておく必要があります。
allow-query { any; };

 

▼転送先アドレスを追記
このDNSで名前解決が出来なかった場合に転送するアドレスを設定します。
forwarders {
192.168.1.1; DNSを参照しているルータのIPアドレス
xxx.xxx.xxx.xxx; プロバイダのDNS
xxx.xxx.xxx.xxx; プロバイダのアドレス
};

 

▼再帰検索要求をnoに設定を変更
キャッシュサーバーとして再帰検索要求や自ドメイン以外のドメインも処理する場合はyesに設定する必要があります。
今回のように自分の取得したドメインなど管理する予定のドメイン以外のリクエストを行わない場合はnoに設定します。
recursion no;

 

▼DNSSECに対応するかどうかの設定を変更
DNSSECは送られてきたデータの署名を検証してデータの偽装を検知するための仕組みです。
NW機器のDNS機能でDNSSECに対応していないものが多いのでnoに設定を変更します。
dnssec-enable no;

 

▼DNSSECの検証を行うかどうかの設定を変更
デフォルトのautoでも問題ありませんが、先ほどのDNSSECに対応しない設定にしたのでnoで設定します。
dnssec-validation no;

 

 

named.conf(loggingステートメント)


▼デフォルトの設定を「//」でコメントアウトします。

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

 

▼要求応答のqueryログを取得
自ドメインの名前解決のリクエストが来た際のqueryログを取得します。
ログはある一定の量でローテートするように設定をして、ファイルサイズが肥大化しないようにします。
リクエスト数の確認やドメインを増やしてゾーンを追加した際の接続確認で使えます!
logging {
channel query-log {
file "/var/log/named/named_query.log" versions 5 size 10M;
severity dynamic;
print-time yes;
print-severity yes;
print-category yes;
};

category queries { "query-log"; };
};

 

▼記述内容の説明

logging ログのステートメントという宣言。
channel ログのチャンネルというサブステートメント的な意味。
query-log わかりやすい任意のチャンネル名を記載。
file ログの出力場所とファイル名。※要namedユーザー権限
version 5 size 10M 1ファイル10MB、最大5ファイル、最大合計5MBまで。
severity 出力されるログの内容。dynamicは全てログをという意味。
print-time ログに発生時刻の出力。
print-severity ログに重要度の出力。
print-category ログにカテゴリーの出力。
category queries query-logという名のchannelにはリクエスト処理のログカテゴリー「queries」が書き出されるという設定。

 

severity に指定できるログレベル

critical 危険度の高いクリティカルログを表示させる。
error 危険度がやや高いエラーログを表示させる。
warning 危険度が比較的低めのワーニングログを表示させる。
notice 危険度が低めのログを表示させる。
info インフォメーションレベルのログを表示させる。
debug デバッグで確認可能なログを表示させる。
dynamic 全てのログを表示させる。

 

categoryに指定できるログのカテゴリー

database ゾーン情報やキャッシュ情報など、データベースに関連する記録。
security 要素の承認・否認の記録。
config 構成ファイルの構文解析と処理の記録。
resolver クライアントに代わって実行されるキャッシュサーバのようなDNS解決の記録。
xfer-in サーバが受信したゾーン転送の記録。
xfer-out サーバが送信したゾーン転送の記録。
notify NOTIFY通知プロトコルの記録。
client クライアント要請の処理記録。
network ネットワーク操作の記録。
update ダイナミックDNSの記録。
queries 問い合わせクエリーの記録。
dispatch サーバモジュールへ入ってくるパケットを処理するCPU割り当ての記録。
dnssec DNS応答が正しいサーバーから応答されたものであるか検証するDNSSEC等の処理を記録。
lame-servers DNS解決の際にほかのサーバで見つけた設定ミスの記録。
general 上記以外のカテゴリーはgeneralに分類される。
default categoryで意図的に指定された以外のカテゴリがここで定義される。

 

 

 

ゾーンファイルの設定

管理するドメインとIPアドレスやホスト名との情報ファイルをゾーンファイルと呼びます。
このゾーンファイルが世界中に広報されることで、名前解決のサーバーが自サーバーであると宣言されます。
下記の設定では、必要なドメインの分のゾーンファイルがどこのディレクトリに設置されているかを定義します。
named.conf のデフォルトで記載のある zone 設定の下に追記します。

 

named.conf(zoneステートメント)


zone "domain-name-a.com" in {

type master;
file "domain-name-a.com";
};

zone "domain-name-b.com" in {
type master;
file "domain-name-b.com";
};

zone "slave-server-name.com" in {
type slave;
masters { xxx.xxx.xxx.xxx; xxx.xxx.xxx.xxx; };
file "slaves/slave-server-name.com.bz.bak";
notify no;
};

 

zone ".com" 任意で記述した定義名ですが、ドメイン名で記載すると管理がし易いです。
type masterなら自分のDNSで処理をする。slaveはファイルのバックアップ先のDNSサーバーです。
file ゾーンの設定ファイル名。設置先ディレクトリはoptionsステートメントのデフォルト設定「directory "/var/named";」で定義。
notify ゾーン情報の更新がされたとき、NSレコードとalso-notifyで指定したサーバーに通知メッセージを送る。今回はそこまでゾーンファイルの更新は多くないのでnoに設定。

 

 

 

ゾーンファイルの作成

named.confで定義したファイル名で「/etc/named」配下にゾーンファイルを作成します。

 command
# cd /var/named
# vi domain-name-a.com

 

domain-name-a.com


▼ドメイン名を記載

$ORIGIN domain-name-a.com.

 

▼外部のDNSサーバーが自ドメインの情報を何秒間保存するか
ドメイン設定直後は600(5m)秒ほどにしておき、ブラウザーやメール等から疎通確認が出来たら3600(1h)秒に戻すと良い。
$TTL 3600 ; 1 hours

 

▼ここからゾーン管理のための情報や設定を記述
@ IN SOA host01.domain-name-a.com. username.domain-name-a.com. (

 

▼更新番号
シリアル番号は「日付+更新番」で記載した一意のシリアル番号。古すぎると機能しないので変更後は更新すること。
2020070701 ;
シリアル番号
3h ;
3時間後にリフレッシュ
1h ; 1時間後にリトライ
1w ; 1週間後に期限切れ
1h ; ネガティブキャッシュTTLとして1時間を指定

 

▼「)」で閉じてSOAレコードはここまで
)

 

▼DNSサーバーを定義するためのNSレコード
IN NS host01.domain-name-a.com.

 

▼スレーブのNS(Name Server)レコードの定義
IN NS ns02.slave-server-name.com.

 

▼メールの配送先を定義するMX(Mail Exchange)レコード
「10」はpreference(プリファレンス)と呼ばれる優先順に。レコードが複数行ある場合は低い数値のpreferenceが優先され、配送に失敗した場合は次のpreferenceのドメインに配送される。
IN MX 10 domain-name-a.com.

 

▼ホスト名に関連付ける文字列の情報を定義するレコード
下記の例では自ドメインからのメール送信飲みを許可するという意味のTXTレコード定義。
IN TXT "v=spf1 mx ~all"

 

▼ホスト名とIPv4アドレスの定義
IPv6の場合は「AAAA」レコードを用いる。上記の場合、「host01」「mail」「www」というホスト名とIPアドレスが定義されている。
IPアドレスは「192.168.0.200」などの自DNSサーバーのローカルアドレスを記述。
IN A xxx.xxx.xxx.xxx
host01 IN A xxx.xxx.xxx.xxx
mail IN A xxx.xxx.xxx.xxx
www IN A xxx.xxx.xxx.xxx

ココに注意

小さくて見辛いですが、ドメインの後の「.」をつけ忘れると機能しないので注意!

 

▼作成したゾーンファイルのオーナー変更

 command
# chown named.named domain-name-a.com

 

 

自ドメイン以外のゾーンファイルの確認

下記については既に作成されていると思うがない場合は作成する。

 

▼キャッシュ用ゾーンファイル
上位のDNSサーバーであるルートサーバーがどこにあるのかを定義するためのキャッシュ用ゾーンファイル。

 command
# vi named.ca

 

named.ca


; <<>> DiG 9.11.3-RedHat-9.11.3-3.fc27 <<>> +bufsize=1200 +norec @a.root-servers.net

; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46900
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;. IN NS

;; ANSWER SECTION:
. 518400 IN NS a.root-servers.net.
. 518400 IN NS b.root-servers.net.
. 518400 IN NS c.root-servers.net.
. 518400 IN NS d.root-servers.net.
. 518400 IN NS e.root-servers.net.
. 518400 IN NS f.root-servers.net.
. 518400 IN NS g.root-servers.net.
. 518400 IN NS h.root-servers.net.
. 518400 IN NS i.root-servers.net.
. 518400 IN NS j.root-servers.net.
. 518400 IN NS k.root-servers.net.
. 518400 IN NS l.root-servers.net.
. 518400 IN NS m.root-servers.net.

;; ADDITIONAL SECTION:
a.root-servers.net. 518400 IN A 198.41.0.4
b.root-servers.net. 518400 IN A 199.9.14.201
c.root-servers.net. 518400 IN A 192.33.4.12
d.root-servers.net. 518400 IN A 199.7.91.13
e.root-servers.net. 518400 IN A 192.203.230.10
f.root-servers.net. 518400 IN A 192.5.5.241
g.root-servers.net. 518400 IN A 192.112.36.4
h.root-servers.net. 518400 IN A 198.97.190.53
i.root-servers.net. 518400 IN A 192.36.148.17
j.root-servers.net. 518400 IN A 192.58.128.30
k.root-servers.net. 518400 IN A 193.0.14.129
l.root-servers.net. 518400 IN A 199.7.83.42
m.root-servers.net. 518400 IN A 202.12.27.33
a.root-servers.net. 518400 IN AAAA 2001:503:ba3e::2:30
b.root-servers.net. 518400 IN AAAA 2001:500:200::b
c.root-servers.net. 518400 IN AAAA 2001:500:2::c
d.root-servers.net. 518400 IN AAAA 2001:500:2d::d
e.root-servers.net. 518400 IN AAAA 2001:500:a8::e
f.root-servers.net. 518400 IN AAAA 2001:500:2f::f
g.root-servers.net. 518400 IN AAAA 2001:500:12::d0d
h.root-servers.net. 518400 IN AAAA 2001:500:1::53
i.root-servers.net. 518400 IN AAAA 2001:7fe::53
j.root-servers.net. 518400 IN AAAA 2001:503:c27::2:30
k.root-servers.net. 518400 IN AAAA 2001:7fd::1
l.root-servers.net. 518400 IN AAAA 2001:500:9f::42
m.root-servers.net. 518400 IN AAAA 2001:dc3::35

;; Query time: 24 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Thu Apr 05 15:57:34 CEST 2018
;; MSG SIZE rcvd: 811

 

▼empty
named.confで定義された「/etc/named.rfc1912.zones」を開くと、ゾーンにて「named.empty」が定義されている。
RFC1918、RFC3330に定義された特殊なアドレスの参照処理が行われた際に「named.empty」のゾーン定義に基づき参照から除外されるという処理。
BINDが起動するのに必要な定義なので、下記で用意をしておく。

 command
# vi named.empty

 

named.empty


$TTL 3H

@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1

 

▼localhost
ループバックアドレスの名前解決に使用される。
主に「localhost」→「127.0.0.1」の正引きで利用。

 command
# vi named.localhost

 

named.localhost


$TTL 1D

@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1

 

▼loopback
localhostとは逆に「127.0.0.1」→「localhost」の逆引きで利用。

 command
# vi named.loopback

 

named.loopback


TTL 1D

@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
PTR localhost.

 

▼手動でゾーンファイル(named.xxx)を作成した場合
作成したゾーンファイルのオーナー権限を変更

 command
# chown root.named named.ca named.localhost named.loopback named.empty
- 2 named named 54 2月 24 2017 slaves

 

 

chrootで起動(セキュリティ向上)

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

 

▼named-chroot自動起動

 command
# systemctl enable named-chroot
Created symlink /etc/systemd/system/multi-user.target.wants/named-chroot.service → /usr/lib/systemd/system/named-chroot.service.

 

▼自動起動確認

 command
# systemctl is-enabled named-chroot
enabled

enabled になっていればサーバー再起動で自動で敵にサービスが起動します。

 

▼ログの出力先作成

 command
# mkdir /var/named/chroot/var/log/named
# chown named.named /var/named/chroot/var/log/named

 

▼named-chrootを起動

 command
# systemctl start named-chroot

※namedの起動は必要ありません。

 

▼chroot化の特徴
chrootで起動された場合、BINDから見ると「/」がルートではなく、「/var/named/chroot」がルートになります。

 command
# cat /var/log/messages | grep named.conf
running as: named -u named -c /etc/named.conf -t /var/named/chroot

-t でオプションが指定されてchrootされています。

そのため「named.conf」でログの出力先として「/var/log/named/named_query.log」と設定しましたが、こちらにログは出力されず、「/var/named/chroot/var/log/named/named_query.log」にログが出力されます。
デフォルトでは「/var/named/chroot/var/log/named」の「named」というディレクトリは無いので、この場合はエラートなりnamed-chrootは起動しません。

 

ログディレクトリが無い状態で起動した際のエラー

# systemctl start named-chroot
:
Active: failed (Result: exit-code) since Wed 2020-09-30 11:44:53 +03; 3s ago
:
9月 30 11:44:53 ac01 named[5785]: isc_stdio_open '/var/log/named/named_query.log'
:

 

このログだと「/var/log/named/named_query.log」を確認してファイルはあるのに!?
となりますが、chroot化後は「/var/named/chroot/var/log/named/named_query.log」にログは出力され、デフォルトで「named」ディレクトリが無いため、上記のような紛らわしいエラーになります。
意外とハマり易い箇所なので注意です...!

上記のような場合はディレクトリを作成して、namedユーザーの権限でオーナーを変更する必要がります。
ログのファイル名自体は起動後に自動作成されるので、ディレクトリの準備のみでOKです!

 command
# mkdir /var/named/chroot/var/log/named
# chown -R named.named /var/named/chroot/var/log/named

 

 

テスト

▼テスト用コマンドについて
最小インストールで CentOS8 をインストールした場合、下記テストで実行している「dig」「host」「nslookup」のコマンドはインストールされていないと思われます。
その場合は こちら の手順でコマンドのインストールを行なってください。

 

▼コンフィグテスト
エラーにならなければOK!

 command
# named-checkconf -z

 

▼ゾーンファイルのテスト
OKとなれば問題なし。

 command
# named-checkzone domain-name-a.com /var/named/domain-name-a.com.zone
zone angelscry.net/IN: loaded serial 2015081001
OK

 

▼dig(domain information groper)コマンドで応答状況確認
レコードがずらずらと表示されればOK

 command
# dig domain-name-a.com

 

▼ホスト確認
アドレスがリプライされればOK

 command
# host host01.domain-name-a.com
host01.domain-name-a.com has address xxx.xxx.xxx.xxx

 

▼ネームサーバー確認

 command
# nslookup angescry.net
Server: 192.168.0.1
Address: 192.168.0.1#53

 

 

おすすめ

1

目次1 Windows10で構築するサーバー構成の例2 Windows10 記憶域について3 Windows10 Hyper-vについて Windows10で構築するサーバー構成の例 知らない人も多い ...

2

目次1 記憶域について2 記憶域の作成方法 記憶域について この記事ではWindows 10 の記憶域によるストレージの作成方法について解説します。 そもそも記憶域について詳しく知りたい方は、下記の記 ...

3

目次1 概要2 テキストパーツ3 ボックスデザイン4 カスタムボタン5 会話ふきだし6 ランキング7 レイアウト8 その他パーツ9 記事一覧/カード10 ショートコード補助11 AFFINGER5につ ...

4

ディレクションを担当した世界遺産のガイドアプリより、ムービー用のBGMを1曲担当しました。 Misumi-nishikou It is BGM created for app video. sound ...

5

こちらはプライベートで作成したYoutube投稿用サイクリングムービーのBGMです。 EDM Sound-2 EDM sound for my Youtube. soundcloud.com

-DNS (BIND), Server