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)"のプロパティを開きます。

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

IPアドレスを自動で割り振っているマシンには、ルーター設定で対応します。このあたりのことは、各個人のルーターごとに異なりますが、一例として、私の自宅での設定を書いておきます。
Google ChromeやMicrosoft EdgeのようなWebブラウザで、ルーターのアドレス(192.168.0.254)を指定して、設定画面を開きます。

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

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

ちなみに、この画面を見てすぐに、おやっ? と思ったあなたは頭がいいです。そう、100~199まで自動でIPアドレスを割り振ろうと思ったら、99個ではなくて100個です。0も数に入っているので、1個たりていません。ま、いっかと、そのままにしていますが。
"DNSサーバーの通知"のところの、"指定したIPアドレス"にチェックを入れ、"プライマリー"のところに、192.168.0.2と入れます。
"ドメイン名の通知"のところの、"指定したドメイン名"にチェックを入れ、example.netと入力します。

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