はじめに
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 ※逆引きの場合。半角ブランクで複数指定可能。
コメント