Studio ilia

Wordpress、ゲームコンテンツ開発ブログ

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 ループバックの逆引き用

 

▼パッケージ確認
dnfでインストール可能なBINDのパッケージを検索して確認しておきます。

 

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

 

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

 

▼完成形のnamed.conf

下記の内容をコピペしてから解説を読むと分かりやすいです。

 

 

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

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

 

▼aclでアクセス拒否をする場合の設定例

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

 

named.conf(optionsの設定)

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

 

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

 

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

 

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

 

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

 

▼転送先アドレスを追記
このDNSで名前解決が出来なかった場合に転送するアドレスを設定します。

 

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

 

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

 

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

 

 

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

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

 

▼要求応答のqueryログを取得
自ドメインの名前解決のリクエストが来た際のqueryログを取得します。
ログはある一定の量でローテートするように設定をして、ファイルサイズが肥大化しないようにします。
リクエスト数の確認やドメインを増やしてゾーンを追加した際の接続確認で使えます!

 

▼記述内容の説明

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 設定の下に追記します。

 

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

 

 

 

ゾーンファイルの作成

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

 

▼完成形のゾーンファイル

 

▼ドメイン名を記載

 

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

 

▼ここからゾーン管理のための情報や設定を記述

 

▼更新番号
シリアル番号は「日付+更新番」で記載した一意のシリアル番号。古すぎると機能しないので変更後は更新すること。

  • 2020070701 ; シリアル番号
  • 3h ; 3時間後にリフレッシュ
  • 1h ; 1時間後にリトライ
  • 1w ; 1週間後に期限切れ
  • 1h ; ネガティブキャッシュTTLとして1時間を指定

 

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

 

▼DNSサーバーを定義するためのNSレコード

 

▼スレーブのNS(Name Server)レコードの定義

 

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

 

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

 

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

 

ココに注意

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

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

 

 

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

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

 

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

 

▼下記をそのままコピペでOK

 

▼empty

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

 

 

 

 

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

 

 

 

 

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

 

 

 

 

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

 

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

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

 

▼named-chroot自動起動

 

▼自動起動確認

 

▼ログの出力先作成

 

▼named-chrootを起動

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

 

▼chroot化の特徴
chrootで起動された場合、BINDから見ると「/」がルートではなく、「/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は起動しません。

 

[st-minihukidashi fontawesome=”” fontsize=”80″ fontweight=”” bgcolor=”#ef5350″ color=”#fff” margin=”0 0 0 -6px”][/st-minihukidashi]
[st-cmemo fontawesome=”fa-exclamation-circle” iconcolor=”#ef5350″ bgcolor=”#ffebee” color=”#000000″ iconsize=”200″]

 

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

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

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

 

 

テスト

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

 

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

 

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

 

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

 

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

 

▼ネームサーバー確認

 

Home
Profile
Menu
Search