RHEL9でDNSサーバを冗長構成で構築

Linux
スポンサーリンク
スポンサーリンク

はじめに

RHEL9でDNSサーバを冗長構成で構築する手順を公開します。

また、今回はBINDを用いますが、BINDやDNSに関する基礎知識についても解説しました。こちらを用いれば、比較的初心者の方でも、そこまで迷うことなく冗長構成のDNSサーバを構築できるはず、、です。

bindのインストール

次のコマンドでインストールします。

dnf install bind bind-utils

バージョンの確認

次のコマンドで確認できます。

named -v

設定ファイルの確認

中核となるnamed.confを確認と解説を行います。

青文字は解説となります。

[root@RHEL9 ~]# cat /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

### optionステートメント:基本的な設定
options {
#listen-on port 53 { 127.0.0.1; };
   listen-on port 53 { 192.168.0.110; }; ※DNS問い合わせを受け付けるポート番号とIPアドレス。DNSサーバのIPアドレスを指定。
listen-on-v6 port 53 { ::1; };
directory "/var/named"; ※マスターゾーンのディレクトリ
dump-file "/var/named/data/cache_dump.db"; ※namedがキャッシュしているデータのダンプ先
statistics-file "/var/named/data/named_stats.txt"; ※統計情報の出力先
memstatistics-file "/var/named/data/named_mem_stats.txt"; ※メモリの使用統計の出力先
secroots-file "/var/named/data/named.secroots";
recursing-file "/var/named/data/named.recursing";
#allow-query { localhost; };
  allow-query { 192.168.0.0/24;127.0.0.1;}; ※DNSサーバへの問い合わせを許可するセグメントやIPアドレスを指定

/*
- If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
- If you are building a RECURSIVE (caching) DNS server, you need to enable
recursion.
- If your recursive DNS server has a public IP address, you MUST enable access
control to limit queries to your legitimate users. Failing to do so will
cause your server to become part of large scale DNS amplification
attacks. Implementing BCP38 within your network would greatly
reduce such attack surface
*/
recursion yes; ※再帰的問い合わせの有無。キャッシュサーバであればyes、ゾーンサーバであればnoとする。

dnssec-validation yes; ※問い合わせ結果をDNSSECを用いて検証するか

managed-keys-directory "/var/named/dynamic"; ※RFC5011で定義されたDNSSECトラストアンカーの自動更新のためのファイルを指定
geoip-directory "/usr/share/GeoIP"; 

pid-file "/run/named/named.pid"; ※Process IDの出力先
session-keyfile "/run/named/session.key"; ※TSIGセッションキーの保存

  recursive-clients 10;  ※再帰的な問い合わせを同時に受け付けるクライアント数を指定
  max-cache-size 128; ※キャッシュサイズをバイト単位で指定。
  forward only | first; ※onlyの場合:フォワードによる名前解決のみを行い、自身では再帰問い合わせを行わない。firstの場合は自身が情報を持っていない問い合わせはフォワードによる名前解決を試み、失敗した場合は自身で再帰問い合わせを行う。
  forwaeders { 1.1.1.1 ; }; ※フォワーダのIPアドレスを指定。

  ※フォワード:自身がゾーン情報を保有せず、キャッシュにも存在しない問い合わせがクライアントからあれば、別のDNSサーバにそのまま問い合わせる機能のこと

/* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
include "/etc/crypto-policies/back-ends/bind.config";
};

### loggingステートメント:BINDのログ出力設定
logging {
channel default_debug {
file "data/named.run"; ※ログの出力先
severity dynamic;  ※重要度
};
};

### ゾーンのデータベースの種類(マスタ / セカンダリ)とゾーンファイルの設定

### ルートDNSサーバの指定
zone "." IN {
type hint;
file "named.ca";
};

### 正引きの設定。ここで指定したファイルを正引きファイルとして読み取る。
zone "example.local" IN {
type master;   ※ゾーンのデータベースの種類。
file "example.local";  ※ゾーンのファイルパス
allow-update { none; }; ※動的な情報更新の許可の有無
};

ここでは
・example.localゾーンを管理
・クラスはIN
・ゾーンデータベースはマスターserver
・マスターのゾーンファイルは /var/named/example.local にある


### ステーブの場合の正引きの設定。ここで指定したファイルを正引きファイルとして読み取る。
zone "example.local" IN {
type slave;   ※ゾーンのデータベースの種類。
file "example.local";  ※ゾーンのファイルパス
masters { 192.168.0.110; }; ※マスターDNSサーバのIPアドレス
};

### 逆引きの設定。ここで指定したファイルを逆引きファイルとして読み取る。
zone "0.168.192.in-addr.arpa" {
type master;
file "example.local.rev";
};

### ステーブの場合の逆引きの設定。ここで指定したファイルを逆引きファイルとして読み取る。
zone "0.168.192.in-addr.arpa" {
type slave;
file "example.local.rev";
masters { 192.168.0.110; }; ※マスターDNSサーバのIPアドレス
};




## rndcコマンドによるnamedの操作を許可するホストを指定
controls {
inet 127.0.0.1 allow { localhost;192.168.0.0/24; };
};




### 追加の設定。ファイルを指定。
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

マスターのファイルの修正

次のコマンドで一旦空ファイルにします。

cat /dev/null > /etc/named.conf

ファイルの編集をします。

vi /etc/named.conf

次のファイルをコピーしてそのまま流し込んでください。
ただし、次のIPアドレスは適宜変更してください。

セグメント:192.168.0.0/24
マスターDNSサーバ:192.168.0.110
スレーブDNSサーバ:192.168.0.111

//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//


options {
        #listen-on port 53 { 127.0.0.1; };
        listen-on port 53 { 192.168.0.110; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
        #allow-query     { localhost; };
        allow-query     { 192.168.0.0/24;localhost;};

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.

         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */

        recursion yes;
        dnssec-validation yes;
        managed-keys-directory "/var/named/dynamic";
        geoip-directory "/usr/share/GeoIP";
        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";

        #recursive-clients 10;
        #max-cache-size 128;
        #forward first;
        #forwarders { 1.1.1.1; };

        /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
        include "/etc/crypto-policies/back-ends/bind.config";
};

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


zone "." IN {
        type hint;
        file "named.ca";
};


zone "example.local" IN {
        type master;
        file "example.local";
        allow-update { none; };
};


zone "0.168.192.in-addr.arpa" {
        type master;
        file "example.local.rev";
        allow-update { none; };
};



include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

controls {
        inet 127.0.0.1 allow { localhost;192.168.0.0/24; };
};

スレーブのファイルの修正

次のコマンドで一旦空ファイルにします。

cat /dev/null > /etc/named.conf

ファイルの編集をします。

vi /etc/named.conf

次のファイルをコピーしてそのまま流し込んでください。
ただし、次のIPアドレスは適宜変更してください。

セグメント:192.168.0.0/24
マスターDNSサーバ:192.168.0.110
スレーブDNSサーバ:192.168.0.111

//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//


options {
        #listen-on port 53 { 127.0.0.1; };
        listen-on port 53 { 192.168.0.111; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
        #allow-query     { localhost; };
        allow-query     { 192.168.0.0/24;localhost;};

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */

        recursion yes;
        dnssec-validation yes;
        managed-keys-directory "/var/named/dynamic";
        geoip-directory "/usr/share/GeoIP";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";

        #recursive-clients 10;
        #max-cache-size 128;
        #forward first;
        #forwarders { 1.1.1.1; };

        /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
        include "/etc/crypto-policies/back-ends/bind.config";
};


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


zone "." IN {
        type hint;
        file "named.ca";
};


zone "example.local" IN {
        type slave;
        file "example.local";
        masters { 192.168.0.110; };
};


zone "0.168.192.in-addr.arpa" {
        type slave;
        file "example.local.rev";
        masters { 192.168.0.110; };
};


include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

controls {
        inet 127.0.0.1 allow { localhost;192.168.0.0/24; };
};

正引きファイルの確認

named.confで指定したパスに正引きファイルを新規作成します。

例ですと、/var/named/example.local となります。

青文字が説明となります。

$TTL      86400 ※デフォルトのTTLを指定。

@         IN       SOA    server01.example.local.  root.example.local.(  ※名前 IN SOA DNSサーバ メールアドレス の構文。@を使うとドメイン名となるので、ドット(.)で代替。

                                        2020020501 ; Serial ※日付+2桁の管理番号。更新されるとスレーブDNSサーバがゾーン情報を更新。

                                        28800      ; Refresh ※マスターDNSサーバのゾーン情報変更をスレーブDNSサーバがチェックする間隔と指定

                                        14400      ; Retry  ※スレーブDNSサーバがマスターDNSサーバにアクセスすることが出来ない場合、何秒後に再試行するか

                                        3600000    ; Expire ※スレーブDNSサーバがマスターDNSサーバにアクセスできない場合、何秒後にゾーン情報を破棄するか

                                        86400       ; Minimum ※存在しないキャッシュ(ネガティブキャッシュ)の有効期限。

     )

                  IN NS server01.example.local.  ※DNSサーバをFQDNで指定

     IN NS server02.example.local.  

server01    IN A 192.168.56.101

server02    IN A 192.168.56.102

一応、DNSレコードを載せておきます。

A:ドメイン名に対応するIPv4を指定
AAAA:ドメイン名に対応するIPv6を指定
CHAME:ドメイン名のエイリアスを指定
MX:メールサーバを設定
NS:DNSサーバを指定

正引き・逆引きファイルの省略ルール

正引き・逆引きファイルの省略ルールについて整理しました。

前行と同じラベルで始まる行は、ラベルを省略できる。
デフォルトTTLと同じTTLは省略できる。デフォルトTTLは$TTLで始まる行で指定する。
ORIGINと同じドメイン名は省略できる。ORIGINの値は$ORIGINで始まる行で指定する。
 ・明示的にORIGINを指定しない場合、そのゾーンファイルのドメイン名自体が暗に指定されます。
 ・ORIGIN と全く同じドメイン名は「@」で記載する。(例: example.jp.→ @)
 ・ORIGIN の前にホスト名が付く場合は、そのホスト名を記載し、最後に 「.」を付けない。(例: www.example.jp.→www)

正引きゾーンファイルの修正

次のコマンドで正引き用のゾーンファイルの作成・修正を行います。

touch /var/named/example.local
vi /var/named/example.local
マスターDNSサーバの場合

IPアドレスなどは適宜変更してください。

$TTL      86400
@         IN       SOA    server01.example.local.  root.example.local. (
                                        2020020501 ; Serial
                                        28800      ; Refresh
                                        14400      ; Retry
                                        3600000    ; Expire
                                        86400      ; Minimum
         )
            IN NS server01.example.local.
        IN NS server02.example.local.
server01    IN A 192.168.0.110
server02    IN A 192.168.0.111
スレーブDNSサーバの場合

IPアドレスなどは適宜変更してください。

$TTL      86400
@         IN       SOA    server02.example.local.  root.example.local. (
                                        2020020501 ; Serial
                                        28800      ; Refresh
                                        14400      ; Retry
                                        3600000    ; Expire
                                        86400      ; Minimum
         )
            IN NS server01.example.local.
        IN NS server02.example.local.
server01    IN A 192.168.0.110
server02    IN A 192.168.0.111

逆引きゾーンファイルの修正

次のコマンドで逆引き用のゾーンファイルの作成・修正を行います。

touch /var/named/example.local.rev
vi /var/named/example.local.rev
マスターDNSサーバの場合

IPアドレスなどは適宜変更してください。

$TTL      86400
@         IN       SOA     server01.example.local.  root.example.local. (
                                        2020020501 ; Serial
                                        28800      ; Refresh
                                        14400      ; Retry
                                        3600000    ; Expire
                                        86400      ; Minimum
      )
      IN NS server01.example.local.
      IN NS server02.example.local.
110   IN PTR server01.example.local.
111   IN PTR server02.example.local.
スレーブDNSサーバの場合

IPアドレスなどは適宜変更してください。

$TTL      86400
@         IN       SOA     server02.example.local.  root.example.local. (
                                        2020020501 ; Serial
                                        28800      ; Refresh
                                        14400      ; Retry
                                        3600000    ; Expire
                                        86400      ; Minimum
      )
      IN NS server01.example.local.
      IN NS server02.example.local.
110   IN PTR server01.example.local.
111   IN PTR server02.example.local.

DNSの構文チェック

次のコマンドで確認可能です。

named-checkconf

firewallの許可

次のコマンドでDNS問い合わせを許可します。

firewall-cmd --state
systemctl start firewalld
firewall-cmd --list-all | grep services
firewall-cmd --add-service=dns --permanent
firewall-cmd --reload
firewall-cmd --list-all | grep services

bindの有効化

次のコマンドで有効化します。

systemctl is-enabled named
systemctl enable named

bindの起動

次のコマンドで有効化します。

systemctl start named

bindの起動確認

次のコマンドでステータスを確認します。

systemctl status named

動作検証

digコマンドを使用します。Linuxのコマンドです。

 dig @localhost example.com ※@で問い合わせ先のDNSサーバのIPアドレスを指定
 dig @localhost -x 192.168.0.110 ※逆引き
 dig @localhost -x 192.168.0.111 ※逆引き

Windowsの場合、次のコマンドを使用します。

nslookup server01.example.local 192.168.0.110 ※正引きの場合。2番目の引数にDNSサーバのIPアドレスを指定
nslookup 192.168.0.110 192.168.0.111 ※逆引きの場合。半角ブランクで複数指定可能。

参考

BINDによるDNSサーバの構築
CentOSでBINDでDNSサーバを立てて、正引きと逆引きと設定と、digやnslookupコマンドによる確認方法について説明します。
【入門】BIND で DNS サーバーを構築
BIND (Berkeley Internet Name Domain) とは BIND とは、キャッシュ DNS サーバーや権威 DNS サーバーの役割を持つソフトウェアですBIND の使い方具体的な BIND の使い方を紹
BINDによるDNSサーバの構築ガイド: Linuxでの設定方法 | ByteSaga
Linux環境でBINDを使ってDNSサーバを構築する方法を徹底解説します。初めての設定でも安心のステップバイステップガイドです。
@IT:DNS Tips:ゾーンファイルの書き方について教えてください
DNSサーバを複数設定した時の仕組みと解決順序の注意
>DNSサーバを冗長化のために、複数設定することがよくあります。気を付けないといけないのは、プライマリとセカンダリのDNSサーバには同じ内容が登録されている必要があるということです。私自身も勘違いしていたことがあるので、注意事項として...
セカンダリDNSサーバの設定方法
【Linux】セキュアなDNSサーバ構築シリーズ② DNS サーバーを構築する - Qiita
はじめに前回の記事で、仮想ネットワークにドメイン取得し、4台の仮想マシーン作成・それぞれにIPV4・IPv6アドレスを付与し、pingの疎通確認まで確認した。【Linux】セキュアなサーバ構築…
DNSサーバー 構築 入門編 - RAKUS Developers Blog | ラクス エンジニアブログ
はじめに 初めましてこんにちは!matsutairaです! 今回は、普段何気なく利用しているDNSサーバーというものにフォーカスし、実際にWebサーバー・DNSサーバーの構築を通してDNSサーバーとは何なのかをざっくり学べる内容となっており...

コメント