Server

13. BIND(DNSサーバー)のインストールと設定

 この章では、Oracle Linux 8でBINDをインストールする方法を解説します。

 BIND(DNSサーバー)とは、ドメイン名(www.example.net等)をIPアドレス(外部からの問い合わせ時は12.34.56.78、LAN内部からの問い合わせには、192.168.0.2)に変換するサーバーです。これをやると、今までは192.168.0.1とURLに指定していたLAN内部サーバーが、www2.example.netと指定すればよくなるので、とても分かりやすく、楽になります。

 また、今設定しているサーバーは、www.example.netやmail.example.net等と指定すれば、使えるようにするものでもあります。

 ドメインの変更が反映されてから、作業しましょう。各設定の意味などは、一応解説しておきますが、詳しくは参考書こちらのサイトを参考にしてください。なお、ここの設定内容は、上記のサイトの内容が多く含まれています。ぜひとも一読することをお勧めします。管理人さんには多大な感謝をささげます。


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

sudo vim /etc/hosts

 最初の2行を以下のように変更します。

 変更前

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

 変更後

#127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1   localhost www www.example.net
192.168.0.2 www www.example.net

 最初の行の127.0.0.1というアドレスは、ループバックアドレスと呼ばれる、特別なアドレスです。どのマシンであっても、このアドレスを指定すると、自分自身を指すようになるものです。これは、通常localhostと指定すればよいことになっているので、その名前と、wwwとホスト名だけ指定したときと、www.example.netとフルでマシン名を指定(これをFQDNと言います)した時すべてで、自分自身を指すようにしています。

 次の行の意味も同じです。ループバックアドレスを使わずに、このサーバーのアドレスである192.168.0.2を指すように挙動させるものです。


 ホスト名を変更し、保存します。ちなみに、インストール時のデフォルトは、localhost.localdomainという、とてもかっこ悪いものなので、当然変更します。

sudo hostnamectl set-hostname www.example.net

 ホスト名が変更されたかどうかは、以下のコマンドでわかります。

hostname

 ホスト名が変更されると、rkhunterが警告を出すため、情報を更新します。

sudo rkhunter --propupd

 BINDと関連ツールをインストールします。

sudo dnf -y install bind bind-utils

 ファイアーウォールでDNSの受信を許可します。ファイアーウォールとは、一種のセキュリティソフトです。日本語の意味は、まんまで防火壁です。許可した通信以外は拒否するというものです。今はDNSサーバーとして構築しているので、DNSで通信してきたものは許可するように、設定を変更します。これは、Oracle Linux 8では標準で搭載されているものです。

sudo firewall-cmd --add-service=dns --permanent
sudo firewall-cmd --reload

 とりあえず、初期設定のままでBINDを起動し、OS起動時に同時に起動するように設定します。

sudo systemctl start named
sudo systemctl enable named

 設定ファイル(/etc/named.conf)を編集します。

sudo vim /etc/named.conf

 10行目あたりにある、以下の行を書き換え、コメントアウトします。

 変更前

	listen-on port 53 { 127.0.0.1; };
	listen-on-v6 port 53 { ::1; };

 変更後

	#listen-on port 53 { 127.0.0.1; };
	#listen-on-v6 port 53 { ::1; };

 ちなみに、最初に#や//を付けるとコメント行として扱われ、プログラムは無視します。つまり、コメントアウトして、この設定を無効化しています。


 この次の行あたりにある

	directory       "/var/named";

 のに、以下の行を追加します。

	version         "unknown";

 これは、セキュリティのためにバージョンを通知しない設定です。自分のサーバーの情報は、できる限り伏せるべきです。もし古いものだとばれてしまうと、攻撃の対象になってしまいます。


 20行目あたりの以下の内容をコメントアウトします。

 変更前

	allow-query     { localhost; };

 変更後

	#allow-query     { localhost; };

 この設定は、後でまとめて追記します。


 15行目あたりにある

   memstatistics-file "/var/named/data/named_mem_stats.txt";

 の次に、以下の行を追加します。

   allow-transfer  { none; };

 これは、ゾーン情報と呼ばれるものの転送を禁止するものです。詳しい意味は割愛しますが、セカンダリと呼ばれるバックアップのDNSサーバーで使うものです。


 30行目あたりの、/* ~ */ で囲まれたコメント(これも無視されます)の後ろに、以下の行を追加します。

 変更前

	recursion yes;

 変更後

	recursion yes;
	allow-query     { localhost; 192.168.0.0/24; };
	allow-recursion { localhost; 192.168.0.0/24; };
	allow-query-cache { localhost; 192.168.0.0/24; };
	forwarders{ 8.8.8.8; 8.8.4.4; };

 アドレスの最後に;を忘れないようにしてください。少なくとも、私は忘れていたところがあり、エラーがでました。

 最初の3行は、再帰問い合わせ機能をLAN内部からの問い合わせのみ許可する、という意味です。これを指定しないと、オープンリゾルバと呼ばれるDNSになり、セキュリティ的に非常に脆弱になります。

 その次のallow-query-cacheのところは、LAN内部からの問い合わせにのみ、キャッシュから返答するというものです。

 さらに次のforwardersの行は、このDNSではURLの情報を持っていなかった(登録データベースにないし、キャッシュにも存在しない時)、Googleの公開しているDNSサーバーに問い合わせる、という意味になっています。DNSはインターネットにとってとても重要なインフラなので、通常は2個以上用意します。本稿では個人使用のLAN内部限定使用のため、それをしませんが。


 50行目あたりにある

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

 の次に、以下の行を書き加えます。

	category lame-servers { null;  };

 これは、エラーログの出力を抑制します。エラーログは重要ですが、なんでもかんでも収集していると、限られた資源であるハードディスクがもったいないですし、なにより、人間が確認するのが大変です。よって、無視してよいものを無視する設定です。


 60行目あたりにある

zone "." IN {

 のに、以下の行を追記します。

// naibu muke settei kaisi
view "internal" {
	match-clients { 192.168.0.0/24; };
	match-destinations { 192.168.0.0/24; };

 これは、このサーバーに登録しているLAN内部のDNSの問い合わせ情報を、LAN内部のマシンにだけ返すように変更しています。例えば、LAN内部では、このサーバー(www.example.net)のアドレスを要求されると、192.168.0.2を返しますが、外部からの要求では、グローバルアドレス(12.34.56.78)を返します。ローカルアドレスは、LAN内部でだけ通用するものなので、この設定が必要です。


 70行目あたりにある

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

 の次(最終行)に、以下の行を追記します。

	include "/etc/named/named.example.net.zone";
};
// naibu muke settei syuuryou

 この行のexample.netの部分は、自分の環境に合わせて書き換えてください。この設定は、外部ファイルとして/etc/named/named.example.net.zoneを読み込む、というものです。このファイルは、後程作成するLAN内部向けの設定ファイルです。


 このあたりの内部向け設定を書き加えた後の部分は、以下のようになります。

// naibu muke settei kaisi
view "internal" {
	match-clients { 192.168.0.0/24; };
	match-destinations { 192.168.0.0/24; };

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

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

	include "/etc/named/named.example.net.zone";
};
// naibu muke settei syuuryou

 先ほど追加した行の後ろ(最終行)へ、以下の行を追記します。

// gaibu muke settei kaisi
view "external" {
	match-clients { any; };
	match-destinations { any; };
	include "/etc/named/named.example.net.zone.wan";
};
// gaibu muke settei syuuryou

 この設定は、外部インターネットから接続されたときに、グローバルアドレスを返すようにする設定です。このDNSサーバーは外部には公開しないため、本来は必要ないのですが、練習として追加することにしました。ですので、めんどくさい人はこの部分は追記しなくていいです。また、外部向けの逆引き設定はしません。と、いいますか、DNSの権限をプロバイダ等から委譲されたサーバー(権威のあるサーバーといいます)でなければ、勝手に逆引き情報を渡してはいけない決まりなので、やってはいけません。

 保存して、vimを終了してください。


 次に、内部向け名前解決ファイル(/etc/named/named.example.net.zone)を作成します。

sudo vim /etc/named/named.example.net.zone

 以下のように編集してください。

zone "example.net" {
	type master;
	file "example.net.db";
};
zone "0.168.192.in-addr.arpa" {
	type master;
	file "0.168.192.in-addr.arpa.db";
};

 これらのうち、zone "example.net" から始まる部分は、正引き(URL→IPアドレス)の設定です。実態である、example.net.dbというファイルをこれから作ります。

 zone "0.168.192.in-addr.arpa" から始まる部分は逆引き(IPアドレス→URL)の設定です。0.168.192の部分は、このサーバーのIPアドレスの、192.168.0.2の3つ目までを逆から書いたものです。各人の設定に合わせて書き換えてください。実態である、0.168.192.in-addr.arpa.dbというファイルを後で作ります。


 内部向け正引きファイルの実態ファイルを作成します。

sudo vim /var/named/example.net.db

 以下のように内容を書き込んでください。

$TTL	86400
@	IN	SOA	example.net.	root.example.net. (
				2020081101	; Serial
				28800		; Refresh
				14400		; Retry
				3600000		; Expire
				86400 )		; Negative TTL
	IN NS	 example.net.
	IN MX 10 example.net.
@	IN A	 192.168.0.2
www	IN A	 192.168.0.2
www2	IN A	 192.168.0.1
*	IN A	 192.168.0.2

 これらのうち、86400や28800、14400の数字は、各種の更新時間を秒で表しています。詳しい内容は、参考書を参照してください。ただ、「2020081101 ; Serial」の部分は、このデータベースのシリアルナンバーです。2020年8月11日バージョン01という意味になります。

 このDNSサーバーは外部に公開する必要がないため、そこまでこだわらなくてもよいのですが、このデータを書き換えたら、日付やバージョン番号を更新する決まりです。

 その下の行のうち、「IN MX 10 example.net.」の部分は、前の章でも書きましたが、MXレコードと呼ばれるもので、メールアドレスを探すときに使われるものです。後ろの数字は優先度で、小さいほど優先されるのですが、10くらいを設定するのが普通のようです。ホスト名を設定した後ろに . があることに注意してください。少なくとも、私は1か所忘れていてエラーになりました。

 その次からのものはAレコードと呼ばれ、URLをIPアドレスに変換します。

「@ IN A 192.168.0.2」の部分は、example.netのアドレスです。

「www IN A 192.168.0.2」の部分は、www. example.netのアドレスです。

 LAN内部では、すでに稼働しているサーバー(192.168.0.1)に、www2.example.netという名前を付けるため、次の行は、以下のようになっています。

「www2 IN A 192.168.0.1」ここだけ最後のアドレスが違うことに、注意してください。

「* IN A 192.168.0.2」これは、それ以外のホスト名をすべてこのアドレスにします。mail.example.net(メールサーバー)や、ns.example.net(DNSサーバー)を使う予定なので、設定しておきます。


 続けて、内部用の逆引き設定ファイルを作成します。

sudo vim /var/named/0.168.192.in-addr.arpa.db

 以下のように内容を書き込んでください。

$TTL	86400
@	IN	SOA	example.net.		example.net. (
					2020081201	; Serial
					28800		; Refresh
					14400		; Retry
					3600000		; Expire
					86400	)	; Negative TTL
		IN	NS	example.net.
2		IN	PTR	example.net.
1		IN	PTR	www2.example.net.

 正引きと少し違うだけで、ほとんど同じです。最後の2行に注目してください。

「2 IN PTR example.net.」の部分は、このサーバー、192.168.0.2の逆引き結果です。最初の「2」は、IPアドレスの最後の値を書き込みます。これで、192.168.0.2で逆引きすると、example.netが返答されます。

「1 IN PTR www2.example.net.」の部分は、最初からあったWindowsのサーバーのアドレスです。これで、192.168.0.1で逆引きすると、www2.example.netが返答されます。


 次に、外部向け名前解決ファイル(/etc/named/named.example.net.zone.wan)を作成します。設定ファイル(/etc/named.conf)で、外部向け設定を省いた人には、この作業は必要ありません。

sudo vim /etc/named/named.example.net.zone.wan

 以下のように編集してください。

// seibiki settei
zone "example.net" {
	type master;
	file "example.net.db.wan";
	allow-query { any; };
};

 内部向けから、逆引き設定を省いた形です。

「allow-query { any; };」の部分が追加されていますが、どこからの要求でも返答する、という意味になります。


 外部向け正引きファイルの実態ファイルを作成します。この作業も、外部向け設定を省いた人には、必要ありません。

sudo vim /var/named/example.net.db.wan

 以下のように編集してください。

$TTL	86400
@	IN	SOA	ns.example.net.	root.example.net. (
				2020081101	; Serial
				7200		; Refresh
				7200		; Retry
				2419200		; Expire
				86400 )		; Negative TTL
	IN NS	 ns.example.net.
	IN MX 10 example.net.
ns	IN A	 12.34.56.78
@	IN A	 12.34.56.78
www	IN A	 12.34.56.78
mail	IN A	 12.34.56.78
example.net. IN TXT "v=spf1 ip4: 12.34.56.78 ~all"

 内部向けとほとんど違いはありません。ここでは、無意味なホスト名で参照されないように、「*」から始まる行はありません。代わりに、nsとmailから始まる行を追加します。


 BINDを再起動し、ステータスを見てエラーを探します。

sudo systemctl restart named
sudo systemctl status named

 エラーがなければ、以下のような表示がされるはずです。

● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor prese>
   Active: active (running) since Sat 2020-08-15 11:30:38 JST; 10h ago
  Process: 1056 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (co>
  Process: 1026 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "y>
 Main PID: 1060 (named)
    Tasks: 7 (limit: 48861)
   Memory: 224.8M
   CGroup: /system.slice/named.service
           mq1060 /usr/sbin/named -u named -c /etc/named.conf -4

 8月 15 21:53:33 www.example.net named[117034]: zone 0.168.192.in-addr.arpa/I>
 8月 15 21:53:33 www.example.net named[117034]: zone 1.0.0.0.0.0.0.0.0.0.0.0.>
 8月 15 21:53:33 www.example.net named[117034]: zone localhost.localdomain/IN>
 8月 15 21:53:33 www.example.net named[117034]: zone example.net/IN/interna>
 8月 15 21:53:33 www.example.net named[117034]: zone example.net/IN/externa>
 8月 15 21:53:33 www.example.net named[117034]: all zones loaded
 8月 15 21:53:33 www.example.net named[117034]: running
 8月 15 21:53:33 www.example.net systemd[1]: Started Berkeley Internet Name D>
 8月 15 21:53:33 www.example.net named[117034]: managed-keys-zone/internal: K>
 8月 15 21:53:33 www.example.net named[117034]: resolver priming query comple>

 これは、後述するTera Termというソフトで、リモート接続して確認した画面のため長い行の端っこが>でとぎれていますが、勘弁してください。初めてこの画面を見た人は、どうやって終了するの? と思うかもしれませんが、lessというソフトで表示しているので、あわてずにqを押して終了してください。


 最初からエラーがないことはほとんどないでしょうから、エラーがあれば、ここにそのファイル名と行番号が表示されますので、それを参照しながら、書き込みミスを修正していきます。

 修正するごとに、以下のコマンドを再び入力して、エラーを探します。

sudo systemctl restart named
sudo systemctl status named

 内部向け設定の確認は、自分自身で行ってもよいのですが、ここにはLAN内部にWindowsのサーバー(www2.example.net)があるので、そこで確認します。

 "スタートボタン" → "Windows システムツール" → "コマンドプロンプト"を開き、nslookupを起動します。

nslookup

 次に、サーバーを自分で作ったものに指定します。

server 192.168.0.2

 正引きで正しい結果がでるか、確認します。

www.example.net.

 これで、192.168.0.2と表示されれば成功です。他にも同じように、www2.example.net(192.168.0.1)や、mail.example.net(192.168.0.2)などでもテストしてみてください。


 次に、逆引きで正しい値がでるか確認します。

192.168.0.2

 これで、「名前: example.net」と表示されれば成功です。


 www2の方も確認してみます。

192.168.0.1

 「名前: www2.example.net」と表示されれば成功です。

 また、Googleの公開サーバーに正しく問い合わせができるかどうか、www.google.co.jpなどの、外部のアドレスも正しく帰ってくるか、合わせて確認しておきましょう。

 ここまでできれば、LAN用のDNSとしては十分です。もし、外部用設定を確認したいのであれば、後述するルーターの設定で、ポート変換機能を使って、UDP 53番ポート(TCPではなく、UDPです)を192.168.0.2に変換して、LANの外側から、サーバーを12.34.56.78と指定して、確認してみてください。外部向け設定を確認し終えたら、セキュリティのために、UDP 53番ポートを閉じておきましょう。


 次に、LAN内部の各種マシンのDNSサーバーを、今作りたてホヤホヤのサーバーに変更します。

 まず、今設定したサーバーのDNSサーバーを、nmtuiコマンドを使って、自分自身(192.168.0.2)に設定します。

sudo nmtui

 nmtuiの画面例は、前の章を参照してください。


 www2.examplen.net(Windowsのサーバー)マシンのように、固定ローカルIPアドレスを割り振っているマシンは、"スタートボタン" → "Windowsシステムツール" → "コントロールパネル"を開き、"ネットワークとインターネット" → "ネットワークと共有センター"→ "イーサネット" → "プロパティ"と進み、"インターネット プロトコル バージョン4(TCP/IPv4)"のプロパティを開きます。

www2サーバー設定1

 ここで、"次のDNSアドレスを使う"にチェックし、"優先 DNSサーバー(P):"の部分に、192.168.0.2と設定します。

www2サーバー設定2

 IPアドレスを自動で割り振っているマシンには、ルーター設定で対応します。このあたりのことは、各個人のルーターごとに異なりますが、一例として、私の自宅での設定を書いておきます。

 Google ChromeやMicrosoft EdgeのようなWebブラウザで、ルーターのアドレス(192.168.0.254)を指定して、設定画面を開きます。

DNSルーター設定1

 "Internet/LAN"ボタンを押します。

DNSルーター設定2

 "LAN"ボタンを押し、"拡張設定"のところにチェックを入れ、設定画面を表示します。

DNSルーター設定3

 ちなみに、この画面を見てすぐに、おやっ? と思ったあなたは頭がいいです。そう、100~199まで自動でIPアドレスを割り振ろうと思ったら、99個ではなくて100個です。0も数に入っているので、1個たりていません。ま、いっかと、そのままにしていますが。


 "DNSサーバーの通知"のところの、"指定したIPアドレス"にチェックを入れ、"プライマリー"のところに、192.168.0.2と入れます。

 "ドメイン名の通知"のところの、"指定したドメイン名"にチェックを入れ、example.netと入力します。

DNSルーター設定4

 "設定"ボタンを押して、設定を完了します。

 後は、自動IPアドレス設定になっているマシンを再起動すれば、自宅サーバーがDNSサーバーになります。