【DNS/BIND】家庭内LANの名前解決を行うDNSサーバーを設置する

1 はじめに

本記事は、家庭内LANで名前解決を行うDNSサーバーを設置する方法を示すものです。
家庭内のローカルエリアに対してはコンテンツサーバーとして、
ワイドエリアに対してはリゾルバとして機能するDNSサーバーの設定を示します。

DNSコンテンツサーバー機能のみに特化した NSD というソフトがあるそうです。

目的からすればこちらの方が適しているかと思いますが、
DNSサーバーがどんなものであるか学ぶことも目的の一つにありますので、
本記事では敢えてフル装備の BIND 9での設定を示します。

なお、Webに公開する文書は、ページレス形式でアップします。
ページ分けしたPDF文書とは、図や表の位置が異なっていることを予めお断りしておきます。

2 BINDのインストールと起動

本章では、BINDのインストールと起動について示します。

2.1 インストール

2.1.1 bindパケージとbind-utilパッケージ

BINDのバイナリである“bind”パッケージと“bind-utils”パッケージは、
下に示すコマンドでインストールします。

bind-utilsは、“nslookup”、“dig”などの、DNS名前解決テスト用に使用する
コマンドパッケージです。

# dnf install bind bind-utils

2.1.2 BINDをchange-root環境で実行する

bind-chroot”は、BINDがアクセスできる範囲を制限するものです。
アクセスできる範囲を制限することによって、セキュリティを高めるものです。

必須ではないですが、インストールすることが推奨されています。

インストール直後のサンプルのBINDコンフィグファイル中のBINDルートディレクトリは、
/”がデフォルトとして記述されているようです。

/var/named/chroot”をルートディレクトリにchroot化することによって、
インストール直後のBINDコンフィグファイル中のファイルパス記述が
そのまま生かせるようになります。

bind-chrootは、以下のようにインストールします。

# dnf install bind bind-chroot

次に、bind-chrootインストールで生成された、
setup-named-chroot.sh”のchroot化スクリプトを実行します。

# /usr/libexec/setup-named-chroot.sh /var/named/chroot on

これを実行することにより、 表2.1-1に示すように右列のディレクトリやファイルが、
左列に示すように“/etc”の下にマウントされます。

setup-named-chroot.shを使えば、
named-chroot”プロセスをサービス化することは不要なようです。

2.2 BINDの起動

2.2.1 DNSポートのオープン

名前解決のリクエストをDNSサーバー設置以外のローカルエリア内ホストからも受けられるよう、
下に示すDNSのポートを開きます。
ルーターのDNSポートを、開く必要はありません。

TCP: 53
UDP: 53

firewall-config GUI”を使われているのなら、図2-2-1に示すように設定します。

ちなみに、firewall-config GUIは、次のようにインストールすることができます。

# dnf install firewall-config

シェルからならば、一般的に“firewall-cmd”を使います。
ですが、firewall-cmdDNSポートを開くようにするにはコマンド文字列が長くて面倒ですので、
本記事ではZONE XMLを直接編集する方法を示します。

ZONE XMLのファイルパスは、
ディレクトリが“/etc/firewalld/zones”の下の“<;使用ゾーン名>.xml”です。

<service name="dns" />”の1行を追記します。

2.2.2 BINDのサービス化

下に示すコマンドで、BINDを起動しサービス化します。

# systemctl start named
# systemctl enable named

3 設定

BINDのメインの設定ファイルは、“/var/named/chroot/etc”下の“named.conf”です。

本記事では、named.confの内容を下に示すよう4つのステートメントに分けて説明していきます。

各ホストの名前とIPアドレスを定義するゾーンファイルについては、4章で説明します。

3.1 acl(Access Control List)ステートメント

acl”(BINDアクセス制御リスト)ステートメントは、IPアドレスと範囲のリストです。
必須なステートメントではありません。

ACLには、指定されたIPアドレスと範囲を参照するために“allow-query”などの
いくつかのステートメントで利用できるニックネームを付けます。

BINDには、次の組み込みACLがあります。

【定義例】

【使用例】

3.2 options

options”ステートメントは、グローバルなサーバー構成オプションを制御し、
他のステートメントのデフォルトを設定します。

以下に、いくつかの要素について説明していきます。

    listen-on-port

    BINDが名前解決を受け付ける、NICインターフェースのIPアドレスを指定します。
     
    上の設定例は、IPv4、IPv6とも、ローカルホストからの要求は受け付ける設定です。

    version

    BINDのバージョンを記載している箇所になります。
    ここに正しいバージョン書くと外部からのBINDのバージョンを確認出来てしまい、
    脆弱性をついた攻撃がされやすくなってしまいますので、“unknown”にして隠します。

    directory

    各種ファイルへの参照記述があります。
    それらのカレントディレクトリをここで指定します。
     
    今回の構成ではchroot構成なので、絶対パスは“/var/named/chroot/var/named”です。

    allow-query

    名前解決を受け付ける、DNSクライアントのIPアドレスを指定します。
    “internal-networks-ip4”は、ACLステートメントで定義したものです。

    recursion

    yesにすると、自分自身で解決出来ない問い合わせに対して、
    他のDNSサーバーへ再帰問い合わせをします。
     
    noではしません。

    forwarders

    他のDNSへフォワードする際のIPアドレスを指定します。

    DNSSEC

    DNSSECという セキュリティ機能の仕様有無を指定します。
    公開鍵暗号方式を使用してセキュィティ向上を図るようです。
     
    今回は使用しません。

3.3 loggingステートメント

logging”ステートメントは、BINDの各種ログファイルの出力を設定します。
ログデータは、“/var/named/named.run”に出力されます。

BINDの名前解決をする際のデバッグ出力設定の例を、以下に示します。

下に示すオプションは、 時間、ログの内容やログレベル(debugとかinfoとか)をログ内に出力します。

これら出力されないとわかりにくいので、“yes”とするのが良いでしょう。

BIND 9のログ出力設定については、下に示すページに詳しく書かれていますので、
ご覧になってみてください。

BIND 9の運用情報収集と分析方法 | ITmedia

3.4 viewステートメント

view”ステートメントにより、アクセス元のIPアドレスに応じて、
検索クエリーに応答するゾーン情報を分けることができます。

view "internal"”で内部向けの設定、“view "external"”で外部向けの設定するのが 一般的なようです。

    match-clientsmatch-destinations

    viewで処理するための条件をここで指定します。  
    match-clientsでは、名前解決の要求元のIPアドレスを指定します。
    自分自身と、内部ネットワークをview "internal"として定義します。
     
    match-destinationsの指定は、BINDサーバーのインターフェースのIPアドレスを指定します。

    ルートDNSの指定

    DNSのルートドメインの指定です。
     
    typehintと指定しているので、ルートドメイン用の定義になります。
    fileで指定しているのが、他のファイルへの参照を表しています。
     
    optionステートメントdirectoryでカレントディレクトリを指定していますので、
    /var/named/chroot/var/named/named.ca”のファイルを参照してください、
    という意味になります。
    chroot環境なので、注意が必要です。
     
    named.caファイルは、インストール時にデフォルトで生成されます。

    正引きゾーン

    正引き用のゾーンの指定です。
     
    zoneでDNSのサフィックスを定義できます。
     
    typemasterと指定しているので、DNSプライマリサーバーであることを表しています。
    slaveと指定すると、セカンダリサーバーとなります。 
     
    fileで正引き用のゾーンファイルを指定しています。
    /var/named/chroot/var/named/home-local.zone”を参照します。

    逆引き用ゾーン

    逆引き用のゾーンの指定です。
    zoneの指定方法が特殊ですが、それ以外は正引き用と変わりません。
     
    IPv4アドレス・オクテットを逆順に記載するのと、
    末尾に“.in-addr.arpa”を追加する必要があります。
    .in-addr.arpa”を付与することで、正引きと同じ機能を使って逆引きを出来るようにします。 

    他のファイルのインクルード

    named.confファイルは、includeを使用して、
    外部にあるファイルから定義を引用することが出来ます。
     
    ローカルホストの定義や、ルートドメイン用のファイルは、
    それぞれのBINDで定義するよりも一個のファイルを流用したほうが整理しやすくなります。

4 ゾーンファイル

/var/named/chroot/var/named/”の直下に、optionsステートメントviewで定義したファイル
(本書サンプルでは“home-local.zone”というファイル)を作成します。

4.1 正引き用ファイル

ローカルエリア向けゾーン定義では、使用するDNSレコードは次の4つくらいでしょうか。

SOAレコード
Aレコード
AAAAレコード
NSレコード

下に、ゾーンの定義例を示します。

4.1.1 TTL

Time To Live”の略。

BINDではゾーンファイルの先頭に、デフォルトTTLの指定の後に書くことになっています。

DNSにおいて、リソースレコードをキャッシュに保持してもよい時間を
秒単位で示す31ビットに符号化された整数で、
ゼロまたは正の値(0から2147483647の値)を取ります。

先に示した例の3600は、3600秒間(1時間)このゾーンの内容が、
他のDNSサーバーにキャッシュされることを表しています。 この値が使われることが多いかと思います。

4.1.2 SOAレコード

ドメイン名のツリー構造は委任によってゾーンに分割され、分散管理されています。
SOAレコードは、これらの分割されたゾーンそれぞれのオーソリティ情報が記されている
レコードです。
SOAはStart Of Authorityの略で、「権威の開始」という意味になります。

また、SOAは委任に関するオーソリティ情報を記すものであり、
各ゾーンの委任されたドメイン名に関連付けられます。

SOA(Start Of Authority)レコードの書式を下に示します。

4.1.3 Aレコード、AAAAレコード

Aレコードは、ホスト名とIPv4アドレスを関連づけるものです。
AAAAレコードは、ホスト名とIPv6アドレスを関連づけるものです。

どちらもシンプルな書式で見ていただければすぐにお分かりになると思いますので、
説明は省略します。

4.1.4 NSレコード

NSは「ネームサーバー」を指し、
NSレコードは、どのDNSサーバーがそのドメインの権威サーバーであるか
(すなわち、どのサーバーに実際のDNSレコードがあるか)を示します。

基本的にNSレコードは、
どこに行けばドメインのIPアドレスを見つけられるかをインターネットに知らせるものです。
 
ドメインには、多くの場合、複数のNSレコードがあり、
これらは、ドメインのプライマリネームサーバーセカンダリネームサーバーを指します。

【設定例】

4.2 逆引き用ファイル

基本的には正引き用ファイルと構成は同じです。
逆引きするセグメントの分だけファイルを作成します。

Aレコードの代わりにPTRレコードで、逆引き用の情報を定義します。
PTRレコードは、特定のIPアドレスに対応するホスト名を定義します。

逆引きは、PTRレコードを参照してIPアドレスからドメイン名を割り出します。

4.2.1 SOAレコード

4.1.2項で既に説明しました。

4.2.2 PTRレコード

PTRレコードは、以下の書式に従って記述します。

  <IPアドレスの逆引き用表記>とは、
IPアドレスを逆引き用の手順に従って変換した表記のことで、
下に示す手順に従って変換します。

  【例: 192.168.1.1の場合】

① IPアドレスの各オクテットを逆順に並べる。
 
  192.168.1.1 → 1.1.168.192
 
② IPアドレスがIPv4形式の場合は、後ろに“.in-addr.arpa.”を付与します。
   IPv6形式の場合は、“.in-addr.arpa.”を付与します。

5 その他の関連するファイル

4章まではBINDに関するファイルの設定について示しましたが、
本章ではサーバー機のネットワークに関する下に示す2つのファイルの内容確認について示します。

/etc/nsswitch.conf
/etc/hosts

# クライアントがWindowsの場合、LMHOSTSファイルも名前解決に関係してくるのだが、
# 本記事改定時に示すようにしたい。

DNSサーバーの情報と他のファイルとの情報に不整合があったり、
ファイルの検索順序が不適切で期待した値を取得できないことがあったりしないよう
ファイルの内容を確認しておきます。

5.1 /etc/nsswitch.conf

nsswitch”は、名前解決を行う優先順位を指定するファイルです。

一般的な名前解決では、まず“/etc/hosts”を参照し、
その後DNSサーバーに問い合わせるといった順序になります。

設定内容を確認します。

5.2 /etc/hosts

hosts”は、IPアドレスとホスト名の対応付けをするファイルです。

DNSサーバーの情報とhostsとの情報が不整合を起こさないよう、
localhost”以外はコメントアウトした方が良いでしょう。

hostsファイルは、クライアントホストそれぞれにあります。
hostsファイル設定内容の有効範囲は自ホストだけですので、
各クライアントホストの設定内容を確認しなければなりません。

以上

本記事の元となっているWordで作成したPDFを
ページ最後に貼り付けました。

少しでも役に立てていただければ、うれしく思います。

このPDFファイルは、自由に配布されてもかまいません。
ただし、再配布の際には、
入手元著者名は明らかにしてください

なお、上のPDFファイルの内容、また本文中の記述に、
誤字や脱字、誤った内容の記述など見つかりましたら、
下に示すフォームでご連絡いただければ幸いです。

お問い合わせ