DNSサーバーを構築しよう!BINDの使い方

DNSサーバーの構築

DNSはインターネットを昔から支えている基本技術のひとつです。DNSサーバーの構築にはBINDというアプリケーションを利用します。ここではBINDを使ったDNSサーバーの構築について解説していきます。

BINDのインストール

BIND (Berkeley Internet Name Domain)は最も利用されているDNSサーバーソフトウェアです。機能が豊富で古くから利用されているため情報がたくさん転がっていてトラブル解決しやすく、安定性も高いメリットがあります。一方で設計が古くたくさんの人が使用していることもあって脆弱性が多数見つかることが欠点です。

参考 「脱BIND」、脆弱性多数の代表的DNSソフトから移行を - 新ITキーワード2017:日経クロステック Active日経クロステック Active

BINDの他にはDNSソフトウェアはNSDやPowerDNS, KnotDNS, unboundなどがあります。いろいろと問題が指摘されているBINDですが、事実上BINDがDNSサーバーのスタンダードであり、豊富な教材があるBINDをはじめに学ぶのが良いと思います

BINDは多くのLinuxディストリビューションで採用されているDNSサーバーであり、CentOS7ではすでにインストールされていると思います。インストールされていない場合はyumでインストールしましょう。

yumでインストール
yum -y install bind
-yオプションはインストール途中で表示される選択肢全てyesで答えるという意味

bindの起動はsystemctlから行います。

「systemctl start named」

BINDの設定

DNSサーバーを構築する上で設定が必要なファイルは大きく2つあります。BIND既定の設定ファイルであるnamed.confとゾーンファイルです。

  1. /etc/named.conf
  2. /var/named以下に置くゾーンファイル

named.confの設定

BINDのデーモンnamedという名前です。そのため設定ファイルは「/etc/named.conf」という名前になっています。

named.confはBINDの動作に関わる設定ファイルです。例えば待ち受けポートは何番か?どのディレクトリにゾーンファイルを置くのか?等の設定ができます。

named.confにどのような設定を行うか?はどのような形でDNSサーバーを運用していくか?によって変化します。

具体的には

  1. 権威DNSサーバーを構築
  2. フルリゾルバを構築
  3. 権威DNSサーバーとフルリゾルバを構築する

例えば、外部に公開したDNSは攻撃を受けやすくなるので相応の対策が必要です。

named.confファイルの中身と各設定項目

named.confの設定はrootユーザーでのみ可能です。

「# vi /etc/named.conf」で編集しましょう。

named.confの内容

named.confの内容

named.confはステートメントという項目別に設定する!

named.confの設定は項目(ステートメント)別に分かれています。

  1. options:待ち受けポートや動作ファイルの場所を設定
  2. logging:ログファイル種類と場所を設定
  3. zone:DNSサーバーのゾーン設定
  4. include:外部ゾーン定義ファイルの読み込み
  5. acl:アクセスコントロールに関する設定

さらにステートメントの中にあるサブステートメントで詳しい設定を行います。

それでは各ステートメントに設定を確認していきましょう。

optionsの設定

optionsの項目はDNSの運用全体に影響する重要な設定項目です。optionsの項目の中には以下のサブステートメントがあります。

  • listen-on port   IPv4のポート番号とホストのIPアドレス   例: 53 { 127.0.0.1; }
  • listen-on-v6 port   IPv6のポート番号とホストのIPアドレス 例:53 { ::1; }
  • directory     ゾーンファイルの置き場所        例: “/var/named”;
  • dump-file      ダンプファイルの場所           例:”/var/named/data/cache_dump.db”;
  • statistics-file    statisticsファイルの場所          例: “/var/named/data/named_stats.txt”;
  • memstatistics-file   memstatisticsファイルの場所         例:”/var/named/data/named_mem_stats.txt”;
  • recursing-file             recursingファイルの場所         例:”/var/named/data/named.recursing”;
  • secroots-file     secrootsファイルの場所         例:”/var/named/data/named.secroots”;
  • allow-query     問い合わせ許可のクライアント情報     例:{ localhost; };
  • dnsec-enable    dnsecの機能ON-OFF           例:no
  • dnsec-validation   dnsecのゾーン情報確認        例:no
  • empty-zones-enable  プライベートIPの名前解決を防ぐ   例:no
  • recursion       フルリゾルバとして機能する      例:yes
  • forwarders               forwardingするネームサーバーを指定    例:{202.168.0.1};
  • forward                    forwardersで設定したサーバに転送    例:only

ファイルの置き場所などは好きなディレクトリを選択できますが、デフォルトのままでもいいです。すべての設定を変える必要がありません。

aclの設定

acl (access controrl list)の設定では、複数のIPアドレスを一つの名前で管理することができるようになります。

acl workgroup {127.0.0.1};

zoneの設定

zoneステートメント部でゾーンの定義ができます。重要な設定項目です。

zoneステートメントの書式は

zone “定義したいゾーンのドメイン“ IN {

type DNSサーバーの種類

file ゾーンファイルの場所

実際のゾーン定義は以下のようになっています。

zoneの設定

zoneの設定

定義したいゾーンのドメインとは、自分がおきたい権威DNSサーバーが管理するゾーンのドメインです。

ホストwww.hogehoge.example.comのhogehoge.example.comのゾーンを管理するDNSサーバーをおきたい場合はhogehoge.example.comと入力します。

DNSサーバーの種類はmaster(プライマリDNSサーバー)、slave(セカンダリDNSサーバー)、hint(ルートDNSサーバー)などを設定します。

先の設定ではルートドメイン「.」のルートネームサーバーを「hint」で指定しています。

ホストwww.example.comのドメインを管理したい場合の例は下のように設定します。

zoneステートメントの設定
zone "example.com" IN {
type master;
file "example.com";
};
MEMO
  • マスターネームサーバー:権威DNSサーバーとして権威のある返答ができるネームサーバー
  • スレーブネームサーバー:マスターのコピーで冗長性を確保*するために複数用意するネームサーバー

*ここで言う冗長の確保とはマスターネームサーバーが障害で使えない時など、マスターの代わりになるスレーブネームサーバーを用意しておくことでサービスの停止を防ぐ試みのこと

ゾーンファイルの場所(fileサブステートメント)ではゾーンファイルのファイル名・パスを指定できます。ファイルの初期ディレクトリはoptionステートメントのdirectoryで設定した場所(/var/named)からのパスになります。

例:/slave/named.example.comの絶対パスは/var/named/slave/named.example.comになります。

参考 named.conf の設定取得できませんでした

includeステートメント

includeはnamed.confの他に作ったファイルの中にあるゾーンステートメントの情報をnamed.confに取り込むという意味です。

named.confに何でも書き込むと後で変更があったときに管理が難しくなります。そこで、named.conf以外にゾーン情報を記入したファイルを用意してそれをincludeで指定してnmaed.confに取り込むことで管理しやすくなります。

BIND

BINDのnamed.conf include

MEMO

named.rfc1912.zones:RFCはインターネット技術の標準仕様を定義する団体でそこで定められた最低限のゾーン定義の初期設定が書かれたファイル。ループバックアドレスに対するゾーン定義が書かれている

named.root.key:ルートゾーンに対するdnssecのキーが書かれたファイル

named.confの文法チェック

named.confの設定が終わったら文法チェックを行いましょう。

named-checkconf
named-checkconf "etc/named.conf"

問題がなければ何も表示されません。問題がある場合は表示を解読して設定しなおしましょう。

ゾーンファイルの編集

ゾーンファイルはDNSサーバーが参照するデータベースファイルです。named.confのoptionステートメント中のdirectroyオプションで指定したディレクトリ(デフォルトは”/var/named”)にゾーンファイルを置きます。

また、登録するゾーンファイル名はzoneステートメントのfileオプションで指定したものを同じ名前にします。

ゾーンファイルにはFQDNからIPアドレスを参照するための正引きゾーンファイルとIPアドレスからFQDNを引く逆引きゾーンファイルがあります。

正引きゾーンファイル

ゾーンファイルには正引き、逆引き、ルートバックなどがありますが、ここでは正引きゾーンファイルの作成について紹介します。正引きゾーンファイルのファイル拡張子として「.zone」が使われることもあります。

正引きゾーンファイル
$TTL 86400
example.com. IN SOA ns.example.com. root.example.com. (
                 2020050501 ; serial
                 28800      ; Refresh
                 14400      ; Retry
                 324000     ; Expire
                 86400     ; Negative
         )
example.com.      IN NS     ns.example.com.
example.com.      IN MX 5   smtp.example.com.
ns.example.com.   IN A      xxx.xxx.xxx.xxx
smtp.example.com. IN A      xxx.xxx.xxx.xxx
www.example.com.  IN A      xxx.xxx.xxx.xxx
host.example.com  CNAME     www.example.com

ゾーンファイルはnamed.confのoptionディレクティブdirectoryで設定した/var/named/ 以下に置きます(/var/named/named.example.com)。

ゾーンファイルの書式は

  1. $で指定するゾーンファイルディレクティブ部
  2. リソースレコード(SOAレコード + NS, Aレコード等)

です。

ゾーンファイルディレクティブの部分

ゾーンファイルでは「$」でディレクティブを指定します。最も良く利用されうるのは$TTLです。$TTLはレコードのキャッシュ寿命を定義しています。(他には$INCLUDEがあり、他のファイルのゾーン情報を取り込むことができます)

リソースレコードの部分

SOA レコードに記載するのは3つです。

定義するゾーンのドメイ IN SOA ゾーンを管理するマスターDNSサーバーのFQDN 管理者のメールアドレス(@は.で表す

さらに、レコードのパラメータを記載します。

  • Serial: 更新番号でスレーブのserialよりも大きい場合はゾーン転送が実行
  • Refresh:スレーブがserialをチェックする間隔
  • Retry:マスターへの接続失敗時に再接続を試みる間隔
  • Expire:Refresh不能になってからスレーブが保持している情報を利用してよい期間。
  • Negative(minimum):ゾーン情報に無い問い合わせをホストから受けた時に「該当なし」の情報を保持する期間

(パラメータは先頭小文字でもOK)

参考 14.2.2. ゾーンファイルの編集 Red Hat Enterprise Linux 6 | Red Hat Customer PortalRed Hat Customer Portal

逆引きゾーンファイルの設定

逆引きとはIPアドレスからFQDNを参照する方法です。逆引きには専用のゾーンファイルを用意しなければなりません。

逆引きゾーンファイルを設定するにはあらかじめnamed.confでゾーン定義をしておきます。

named.confで逆引きゾーン定義
zone “0.168.192.in-addr.arpa” IN {
type master;
file “named.0.168.192.in-addr.arpa” ;
};
逆引きゾーンの書き方は正引きゾーンとは多少異なります。逆引きであるため192.168.0.1の逆引きはネットワーク部192.168.0を反対から書いて逆引き用の特別なドメインin-addr.arpa.を足します。これをSOAレコードに記載します。
逆引きゾーンファイル
$TTL 900
0.168.192.in-addr.arpa.    IN    SOA    ns1.example.com.    root.example.com. (
2020051101        ;    Serial
28800            ;    Refresh
14400            ;    Retry
3600000        ;    Exipire
86400 )        ;    Negative

0.168.192.in-addr.arpa.        IN    NS    ns.example.com.
0.168.192.in-addr.arpa.        IN    PTR    www.example.com.

逆引きを調べるコマンドはdigコマンドでやります。

# dig -x 192.168.0.5

@で省略表記

ゾーンファイルを眺めると気づくと思いますが、表記項目にはドメイン部位「example.com」がたくさん登場しています。この部分を省略して表記できます。その場合ゾーン名を@で省略します。

example.com. IN SOA ns.example.com. root.example.com. (

省略すると→ @ IN SOA ns  root (

SOAレコードだけでなく、SOAレコード下部に記載するNS、Aレコードの部分でも@で省略して記載してOKです。

Zoneファイルの文法チェック

作成したゾーンファイルは文法チェックを行ってエラーがないか調べましょう。

named-checkzone (ゾーン名) (ゾーンファイルのディレクトリ)

例:named-checkzone example.com. /var/named/named.example.com

問題がなければ「OK」という表示がでてきます。

問題があるとエラーが返ってきます。

良くある間違い

  • no current owner name:たいていはexample.com. IN NS ns.example.com.の先頭に空白があることが原因
  • ~has no address records:表示のある行のアドレスの最後に「.」がついているか確認する。

ホスト機はresolv.confを編集してネームサーバーを登録する

設定したネームサーバを利用するホスト機は設定したネームサーバーのアドレスをresolv.confに登録します。

ディレクトリは「/etc/resolv.conf」です。

resolv.confとは?リゾルバが参照するファイル

DNSがきちんと動作しているかをdigコマンドで確かめる

DNSが正常に動作しているかを調べるにはdigコマンドで名前解決を行います。

正引きゾーンに関してはNS、A、MX、CNAME等に記載した情報が得られるかを確認しましょう。例えば

「$ dig example.com NS」と入力すればNSで登録したns1.example.comが表示されるはずです。ns1.example.comのIPアドレスを調べたければ

「$ dig ns1.example.com A」と入力すればIPアドレスが返ってきます。逆引きの場合は「dig -x IPアドレス」で参照できます。

もしも何もかえって来ない場合は正常に機能していないので設定を見なおす必要があります。DNSサーバーを参照するホスト側のfirewall等のセキュリティの設定やresolv.confの設定を確認してみるか、DNSサーバー側で「systemctl status named -l」と入力してエラー表示が出ていないかを確認しましょう。

DNSレコード nslookup digの使い方DNSのレコードを確認するコマンド dig nslookupの使い方

参考

参考 強いBIND DNSサーバを構築する 第三回 基本的なゾーン設定 | ユーロテック情報システム販売株式会社ユーロテック情報システム販売株式会社 参考 BINDの設定(named.conf)取得できませんでした

渡邉結衣,・佐藤新太・ 藤原和典 (2018) DNSがよくわかる教科書 SBクリエイティブ

DNSのレコードを確認するコマンド dig nslookupの使い方

DNSとは?仕組みをわかりやすく解説

resolv.confとは?リゾルバが参照するファイル

Hostsファイルの書き方 localhostとは? /etc/hosts

ドメイン名とホスト名とは?

サーバーとは何か簡単に解説!

コメントを残す

メールアドレスが公開されることはありません。