前回の記事でLinuxディストリビューション、CentOSでのDHCPサーバー構築手順を紹介しました。DHCPサービスはそれほどシステムのリソース(CPUやメモリ、ディスク)を利用しないため、リソースに余剰があるかと思います。
これだと余剰リソースが勿体無い気がしますので、リソースの有効的な利用方法として今回の記事では、前回セットアップしたDHCPサーバー上にキャッシュ用DNSサーバーを構築する手順を紹介します。
-
CentOS 7でOSSのdhcpdを使ったDHCPサーバーを構築して古いPCを再利用してみる
前回の記事ではActive Directory環境でのWindows Serverを利用したDHCPサーバーの構築手順を紹介しました。この記事でも記載した通り、Active Directory環境ではWindows Serverに実装されて ...
本記事で構築するキャッシュ用のDNSサーバーは外部から参照されることはなくプライベートネットワーク内で利用するDNSサーバーです。外部のDNSサーバーへ問い合わせた結果をDNSサーバー内にキャッシュして、プライベートネットワークからキャッシュ内にあるものと同じ名前引きのリクエストががあった場合に、外部のDNSへ問い合わせることなく、応答を返すことができます。
キャッシュにあるレコードについては外部への名前解決リクエストを行わないため、以下のようなメリットがあります。
キャッシュDNSサーバーのメリット
- 名前引きレスポンスの高速化
- 接続元を制限することによるセキュリティの向上
またキャッシュDNSサーバーを構築することでDNSの理解に役立つかと思います。DHCPサーバーと連携することもできますので是非、構築してみて下さい。
1. LinuxでキャッシュDNSサーバーをセットアップする環境
キャッシュDNSサーバーは以前の記事で構築したDHCPサーバー上にセットアップを行います。
-
CentOS 7でOSSのdhcpdを使ったDHCPサーバーを構築して古いPCを再利用してみる
前回の記事ではActive Directory環境でのWindows Serverを利用したDHCPサーバーの構築手順を紹介しました。この記事でも記載した通り、Active Directory環境ではWindows Serverに実装されて ...
上記の記事でも構成についての詳細を記載していますが、以下に大まかな要点を纏めてみました。
DNSサーバーを設定するCentOSの環境と前提
- ホスト名はdhcp7
- CentOSのバージョンは7.6
- サーバーのIPアドレスは 192.168.241.215
- サブネットは192.168.241.0/24ビット(255.255.255.0)
- dhcpサーバーが設定済み
- 利用するドメイン名はint.rem-system.com
利用するドメイン名についてはローカルネットワーク内のみで参照できるものを設定します。今回はパブリックネットワーク向けのドメイン名に"int"のサブドメインを付与する形を指定しました。
OSの詳細な情報とカーネルのバージョンについては以下のようになります。
command
$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
$ uname -a
Linux dhcp 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64
サーバーの構成図は以下のようになります。
この環境を前提にキャッシュDNSサーバーを構築していきます。
2. ネットワークの設定変更
キャッシュDNSサーバーを構築する前に、サーバーのネットワーク設定を変更します。具体的にはネットワークの以下の項目を変更します。
DNSサーバーを設定するCentOSの環境と前提
- リゾルバ(名前引きの際に参照するネームサーバー)
- 検索ドメイン(DNSサフィックス)
本章では設定を変更する手順を紹介していきます。
2-1. リゾルバーと検索ドメインの変更
ネットワークの設定変更は"nmcli"コマンドで実行します。
参照するネームサーバー(リゾルバ)の設定は「ipv4.dns」パラメータで指定指定します。今回の環境では自身がDNSサーバーになるためローカルホストのIPアドレス「127.0.0.1」を設定します。
検索ドメインは「ipv4.dns-search」パラメータで指定します。「int.rem-system.com」を設定します。
この二つの設定変更は、例えばコネクション名が「ens33」(コネクション名はOSの環境によって異なります。)の場合は以下のようにnmcliコマンドを実行します。
command
# nmcli connection modify ens33 ipv4.dns 127.0.0.1 ipv4.dns-search int.rem-system.com
エラーが出力されなければ、コマンドは正常に完了しています。変更した設定を反映するためにネットワークサービスを再起動します。
command
# systemctl restart network
エラーが出力されなければ、ネットワークサービスの再起動は完了です。
2-2. 設定変更の確認
ネットワークサービスの再起動後に、変更が適用されていることを"nmcli connection show"コマンドで確認します。そのままだと全てのパラメータが表示されて見にくいため、DNS関連のパラメータだけを抽出するように"grep"を付けて実行します。
command
$ nmcli connection show ens33 | grep dns
connection.mdns: -1 (default)
ipv4.dns: 127.0.0.1
ipv4.dns-search: int.rem-system.com
ipv4.dns-options: ""
ipv4.dns-priority: 0
ipv4.ignore-auto-dns: いいえ
ipv6.dns: --
ipv6.dns-search: --
ipv6.dns-options: ""
ipv6.dns-priority: 0
ipv6.ignore-auto-dns: いいえ
上記のように「ipv4.dns」と「ipv4.dns-search」のパラメータが設定変更されていることが確認できれば、ネットワークの変更は完了です。
3. bindパッケージの確認
本章からDNSサーバー構築の具体的な手順に入ります。まずはDNSサーバー用のパッケージ確認から始めます。
DNSサーバーを構築するのに利用するアプリケーションは「bind」という名前でパッケージ化されています。bindパッケージをインストールする前にパッケージの詳細を確認します。
3-1. DNS関連パッケージリストの確認
CentOSに含まれる"bind"と名前の付くパッケージのリストを確認します。パッケージリストの確認は"yum search"コマンドにパッケージ名を付けて実行します。
command
$ yum search bind
読み込んだプラグイン:fastestmirror, langpacks
Determining fastest mirrors
* base: ftp-srv2.kddilabs.jp
* extras: ftp-srv2.kddilabs.jp
* updates: ftp-srv2.kddilabs.jp
=================== N/S matched: bind =====================
bind.x86_64 : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server
bind-chroot.x86_64 : A chroot runtime environment for the ISC BIND DNS server, named(8)
bind-devel.i686 : Header files and libraries needed for BIND DNS development
bind-devel.x86_64 : Header files and libraries needed for BIND DNS development
bind-lite-devel.i686 : Lite version of header files and libraries needed for BIND DNS development
上記の出力結果からわかるように、bindと名前の付くパッケージは多くあります。この中でDNSサーバー用にインストールが必要になるパッケージは
- bind.x86_64 : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server
になります。このbindパッケージについて詳細を確認します。
3-2. bindパッケージの詳細を確認
インストール前にパッケージの内容に間違いないか、念のためにbindパッケージの詳細を確認します。
command
$ yum info bind
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
利用可能なパッケージ
名前 : bind
アーキテクチャー : x86_64
エポック : 32
バージョン : 9.9.4
リリース : 74.el7_6.1
容量 : 1.8 M
リポジトリー : updates/7/x86_64
要約 : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server
URL : http://www.isc.org/products/BIND/
ライセンス : ISC
説明 : BIND (Berkeley Internet Name Domain) is an implementation of the DNS
: (Domain Name System) protocols. BIND includes a DNS server (named),
: which resolves host names to IP addresses; a resolver library
: (routines for applications to use when interfacing with DNS); and
: tools for verifying that the DNS server is operating properly.
表示された説明からbindパッケージがDNSサーバー構築に必要であることが確認できました。
4. bindパッケージのインストールと確認
本章では項目3. で確認したDNSサーバーに関するパッケージをyumコマンドでインストールする手順を記載していきます。
4-1. bindパッケージのインストール
bindパッケージは"yum install"コマンドにパッケージ名を付けることでインストールすることができます。項目3-2. で必要なパッケージが確認できましたので、yum installコマンドでインストールします。
command
# yum -y install bind
上記ではyumに"-y"オプションを付けることでインストール時の確認応答を省いています。パッケージを複数インストールする場合はスペースを入れてパッケージ名を列記します。コマンドを実行すると、以下のようにインストールが開始されます。
command
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ bind.x86_64 32:9.9.4-74.el7_6.1 を インストール
【略】
インストール中:
bind x86_64 32:9.9.4-74.el7_6.1 updates 1.8 M
依存性関連でのインストールをします:
audit-libs-python x86_64 2.8.4-4.el7 base 76 k
checkpolicy x86_64 2.5-8.el7 base 295 k
libcgroup x86_64 0.41-20.el7 base 66 k
libsemanage-python x86_64 2.5-14.el7 base 113 k
policycoreutils-python x86_64 2.5-29.el7_6.1 updates 456 k
python-IPy noarch 0.75-6.el7 base 32 k
python-ply noarch 3.4-11.el7 base 123 k
setools-libs x86_64 3.3.8-4.el7 base 620 k
トランザクションの要約
インストール 1 パッケージ (+8 個の依存関係のパッケージ)
総ダウンロード容量: 3.6 M
インストール容量: 10 M
Downloading packages:
(1/9): audit-libs-python-2.8.4-4.el7.x86_64.rpm | 76 kB 00:00:00
【略】
インストール中 : audit-libs-python-2.8.4-4.el7.x86_64 1/9
インストール中 : setools-libs-3.3.8-4.el7.x86_64 2/9
インストール中 : checkpolicy-2.5-8.el7.x86_64 3/9
インストール中 : python-IPy-0.75-6.el7.noarch 4/9
インストール中 : libsemanage-python-2.5-14.el7.x86_64 5/9
インストール中 : python-ply-3.4-11.el7.noarch 6/9
インストール中 : libcgroup-0.41-20.el7.x86_64 7/9
インストール中 : policycoreutils-python-2.5-29.el7_6.1.x86_64 8/9
インストール中 : 32:bind-9.9.4-74.el7_6.1.x86_64 9/9
インストール:
bind.x86_64 32:9.9.4-74.el7_6.1
依存性関連をインストールしました:
audit-libs-python.x86_64 0:2.8.4-4.el7 checkpolicy.x86_64 0:2.5-8.el7
libcgroup.x86_64 0:0.41-20.el7 libsemanage-python.x86_64 0:2.5-14.el7
policycoreutils-python.x86_64 0:2.5-29.el7_6.1 python-IPy.noarch 0:0.75-6.el7
python-ply.noarch 0:3.4-11.el7 setools-libs.x86_64 0:3.3.8-4.el7
完了しました!
エラーの出力がなく「完了しました!」と表示されれば、bindパッケージはシステムにインストールされています。
4-2. インストール後の確認
bindパッケージがインストールされたことを確認します。インストールされているパッケージはyum listコマンドで確認できます。以下のように実行することで、bindパッケージがインストールされていることを確認します。
command
$ yum list installed | grep bind
bind.x86_64 32:9.9.4-74.el7_6.1 @updates
bind-libs.x86_64 32:9.9.4-74.el7_6.1 @updates
bind-libs-lite.x86_64 32:9.9.4-74.el7_6.1 @updates
bind-license.noarch 32:9.9.4-74.el7_6.1 @updates
bind-utils.x86_64 32:9.9.4-74.el7_6.1 @updates
rpcbind.x86_64 0.2.0-47.el7 @anaconda
出力結果としてbindパッケージが表示されることを確認します。続いてbindがインストールされた場所を確認します。bindのプログラム本体は「named」という名前になります。インストールされた場所(パス)を確認するためには"which"コマンドを利用します。以下のようにwhichを実行することでインストールパスを確認できます。
command
$ which named
/usr/sbin/named
合わせてnamedを実行できることを確認します。バージョンを表示するためのオプション"-v"を付与してnamedを実行してみます。
command
$ named -v
BIND 9.9.4-RedHat-9.9.4-74.el7_6.1 (Extended Support Version)
バージョンが表示できることが確認できました。これでインストール後の確認は完了です。
5. bindの基本的な設定
項目4.の手順まででbindパッケージの導入が完了しました。bindの場合、サービスを起動させる前に幾つかの設定を行う必要があります。本記事ではDNSキャッシュサーバーを運用するにあたって必要になる基本的な設定を行います。
設定の前提は以下を想定しています。
DNSキャッシュサーバー設定の前提
- プライベートネットワーク内からのみ再起問い合わせを許可する
- DNSキャッシュにないDNSリクエストはパブリックDNSとして8.8.8.8へ転送する
- firewalldでプライベートネットワークからのDNSの接続を許可
- IPv6は利用しない
この条件に合わせてDNSサーバーの設定を行っていきます。
5-1. named.confの変更
bindの設定は/etc/以下にある「named.conf」で行います。基本的な設定はnamed.confにあらかじめ記載されていますので、条件に合わせた部分(optionsディレクティブ)だけを設定変更します。
named.confの変更前に元のファイルをバックアップしておきます。バックアップは以下の手順で元ファイルのコピーを行います。
command
# cp -p /etc/named.conf /etc/named.conf.org
バックアップの完了後、エディタで設定ファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。
command
# vi named.conf
5-1-1. Listenポートの変更
デフォルトのnamed.confにある設定ではbindはlocalhost(127.0.0.1)のみで待ち受けを行います。この設定の場合には、プライベートネットワーク内の他のマシンからDNSサーバーへ接続ができないためこれを無効化します。無効化するには"listen-on port"項目を"#"か"//"でコメントアウトします。IPv6についてはListenしないように同じく"listen-on-v6 port"項目をコメントアウトします。以下のように設定を変更します。
code
options {
listen-on port 53 { 127.0.0.1; };
listen-on-v6 port 53 { ::1; };
上記の「listen-on port 53」と「listen-on-v6 port 53」行を以下のように変更します。
code options { // listen-on port 53 { 127.0.0.1; }; コメントアウト // listen-on-v6 port 53 { ::1; }; コメントアウト
5-1-2. DNSリクエストの許可とフォワーダー設定
DNSのクエリ(名前解決のリクエスト)はデフォルトの設定では「allow-query」パラメータでlocalhostのみが許可されています。デフォルト設定の場合、プライベートネットワーク内のマシンからDNSサーバーへ問い合わせができないため、許可するネットワークを追加します。
以下のように「allow-query」パラメータを変更します。
code
allow-query { localhost; };
上記のallow-queryにローカルネットワークのIPを追加します。以下のように変更しました。
code allow-query { localhost; 192.168.241.0/24; }; 追加
合わせて、フォワーダー設定を追加します。フォワーダーはDNSサーバーで名前解決ができない場合に、DNSの問い合わせを転送する機能です。外部のDNSサーバーを指定します。forwardersパラメータは設定ファイルに記載がないため、以下のように追記を行います。
指定している8.8.8.8はGoogleのパブリックDNSサーバーになります。
code
forwarders { 8.8.8.8; };
全ての変更が終わったnamed.confは以下のようになります。(その他はデフォルトのまま)
code
options {
// listen-on port 53 { 127.0.0.1; };
// 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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { localhost;
192.168.241.0/24; };
forwarders { 8.8.8.8; };
変更したファイルの内容を確認して間違いがなければ、ファイルを保存します。
5-2. 設定ファイルの確認
named.confに設定できる内容は多岐にわたるため、設定ファイル自体に間違いがないかを確認するオプションが用意されています。DNSサーバーの起動前に"named-checkconf"コマンドを実行して設定ファイルをチェックします。以下、実行例になります。
command
# named-checkconf
エラーが出力されなければ、設定ファイルに間違いはありません。
6. ファイアウォールへの接続許可設定
DNSでは、幾つかの接続ポートを利用します。本記事ではDNSサーバー接続用としてTCP/UDPの53番ポートをオープンします。ファイアウォールはCentOSのデフォルトである「firewalld」を利用している前提となります。
DNS用ポート
- TCP 53番ポート
- UDP 53番ポート
6-1. 現状のファイアウォール設定を確認
先ず、現状の設定を確認していきます。メールの送受信に利用するポートは全てのネットワークに開放するため、インターフェイスに適用されている「public」ゾーンの設定を確認します。
command
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
デフォルトでは上記のようにSSHのみ許可されています。
6-2. DNSサーバー用の接続許可設定
項目6-1. で確認した「public」ゾーンの接続許可サービスにDNSサービスを追加します。許可するサービスの追加は"firewall-cmd"で以下のように行います。
command
# firewall-cmd --add-service=dns --permanent
success
「success」と表示されればサービスの追加は完了です。設定を反映するためにファイアウォールの設定をリロードします。
command
# firewall-cmd --reload
success
「success」と表示されれば設定のリロードは完了です。
6-3. メール送受信サービス用ファイアウォールの設定確認
設定した内容が正常に反映されているかを確認します。確認は以下のように行います。
command # firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens33 sources: services: ssh dhcpv6-client dns ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
「services」の項目に「dns」が表示されていれば、ファイヤーウォール設定の確認は完了です。ここまででファイアウォールの接続許可設定は完了です。
7. DNSサーバー起動と自動起動設定
本章では設定したbindが起動することを確認します。CentOSでは7系からsystemctlコマンドでサービスの起動、停止を行います。
7-1. DNSサーバーの起動
bindは以下のように実行することで起動できます。
command
# systemctl start named
コマンドを実行してエラーが出力されなければ、namedは起動しています。
続いて、サービスの状態を確認します。systemctlコマンドに"status"オプションを付けて実行することで、起動したサービスの状態について、詳細な情報を取得することができます。
以下が実行例です。
command $ systemctl status named ● named.service - Berkeley Internet Name Domain (DNS) Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; vendor preset: disabled) Active: active (running) since 火 2019-06-25 17:19:57 JST; 3s ago Process: 49016 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS) Process: 49014 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS) Main PID: 49018 (named) CGroup: /system.slice/named.service mq49018 /usr/sbin/named -u named -c /etc/named.conf6月 25 17:19:57 dhcp named[49018]: command channel listening on ::1#953 6月 25 17:19:57 dhcp named[49018]: managed-keys-zone: loaded serial 0 6月 25 17:19:57 dhcp named[49018]: zone 0.in-addr.arpa/IN: loaded serial 0 6月 25 17:19:57 dhcp named[49018]: zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...l 0 6月 25 17:19:57 dhcp named[49018]: zone localhost.localdomain/IN: loaded serial 0 6月 25 17:19:57 dhcp named[49018]: zone localhost/IN: loaded serial 0 6月 25 17:19:57 dhcp named[49018]: zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0 6月 25 17:19:57 dhcp named[49018]: all zones loaded 6月 25 17:19:57 dhcp named[49018]: running 6月 25 17:19:57 dhcp systemd[1]: Started Berkeley Internet Name Domain (DNS). Hint: Some lines were ellipsized, use -l to show in full.
上記では分かり難いかもしれませんが、丸(●)の部分が正常な起動状態の場合、緑色で表示されます。Active項目に(running)と表示されていますので、起動していることが確認できます。
稼働しているプロセスを表示するpsコマンドでもnamedが起動していることを確認できます。以下のように実行します。
command
$ ps -aux | grep named
named 49018 0.1 12.1 169640 58164 ? Ssl 17:19 0:00 /usr/sbin/named -u named -c /etc/named.conf
namedプロセスが動作していることが確認できます。これでbindの起動は完了です。
7-2. bindの自動起動設定
bindの起動が確認できましたのでサーバーの再起動や停止の復旧時にbindが自動的に起動するように設定します。サービスの自動起動を設定するにもsystemctlコマンドを利用します。自動起動は以下のようにsystemctlコマンドを実行します。
command
# systemctl enable named
Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.
エラーが出力されなければ、自動起動は設定が完了しています。
続いて自動起動が設定されたことを確認します。こちらもsystemctlコマンドから確認できます。以下のように実行します。
command
# systemctl is-enabled named
enabled
実行結果として「enabled」と表示されれば自動起動の設定は完了です。
8. キャッシュDNSサーバーの動作確認
設定したDNSサーバーからクライアントがIPアドレスが取得できるかを確認してみます。使用するOSはWindows10です。クライアント側のネットワーク設定についてはIPアドレスの自動取得を設定します。
8-1. サーバーでの名前解決確認
ログインしているサーバーで名前解決を行うことができることを確認します。名前解決には"host"コマンドを利用します。
Linuxではhostコマンドによるホスト名の確認が可能です。使い方はhostコマンドにホスト名を付けて実行します。
「www.rem-system.com」を確認する場合、以下のようにコマンドを実行します。
command
$ host www.rem-system.com
www.rem-system.com has address 133.135.111.79
指定したホスト名に対して、IPアドレスが表示されれば、動作確認は完了です。
もしホスト名が見つからないという警告が表示された場合には、ネットワークのDNS設定かDNSサーバーの設定を見直して下さい。ここでは正常に確認ができたという前提で先へ進めていきます。
8-2. クライアントPCからの動作確認
DHCPサーバーの構築を紹介した以下の記事の通りにDHCPサーバーの構築が終わっていて、クライアントPCがDHCPサーバーからIPを取得している場合にはクライアントPCのDNSサーバーとしてルーターのIPアドレスが設定されているかと思います。
-
CentOS 7でOSSのdhcpdを使ったDHCPサーバーを構築して古いPCを再利用してみる
前回の記事ではActive Directory環境でのWindows Serverを利用したDHCPサーバーの構築手順を紹介しました。この記事でも記載した通り、Active Directory環境ではWindows Serverに実装されて ...
DNSサーバーをIPアドレスを自動取得から、「次のDNSサーバーのアドレスを使う」に変更して、優先DNSサーバーとして「192.168.241.215」を設定します。※実際には構築したDNSサーバーのIPアドレスを設定してください。
変更後に[OK]をクリックして、設定を保存します。
DNSの設定後に、コマンドプロンプトを開いて"nslookup"コマンドで同じく「www.rem-system.com」の正引き名前解決を行います。
command
> nslookup www.rem-system.com
を実行して、IPアドレスが返ってくることを確認します。
実際にコマンドプロンプトでnslookupを行ったときには、以下の画面のようになります。
これでプライベートネットワーク内にあるクライアントPCからの動作確認は完了です。
9. まとめ
キャッシュDNS機能についてはブロードバンドルーターなどに実装されていることが多く、それほど構築することはないかと思います。しかしキャッシュDNSがどのように動作しているかという部分については、よく分からないというのは殆どではないでしょうか。
実際にキャッシュDNSを構築することでDNSの挙動や設定についても理解が進むかと思います。DHCPサーバーに合わせてキャッシュDNSサーバーも是非、構築してみては如何でしょうか。
今後は、今回作成したDHCP/DNSの環境を利用してローカル向けのダイナミックDNSサーバーの構築を予定しています。