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 -y install bind -yオプションはインストール途中で表示される選択肢全てyesで答えるという意味
bindの起動はsystemctlから行います。
「systemctl start named」
BINDの設定
DNSサーバーを構築する上で設定が必要なファイルは大きく2つあります。BIND既定の設定ファイルであるnamed.confとゾーンファイルです。
- /etc/named.conf
- /var/named以下に置くゾーンファイル
named.confの設定
BINDのデーモンはnamedという名前です。そのため設定ファイルは「/etc/named.conf」という名前になっています。
named.confはBINDの動作に関わる設定ファイルです。例えば待ち受けポートは何番か?どのディレクトリにゾーンファイルを置くのか?等の設定ができます。
named.confにどのような設定を行うか?はどのような形でDNSサーバーを運用していくか?によって変化します。
具体的には
- 権威DNSサーバーを構築
- フルリゾルバを構築
- 権威DNSサーバーとフルリゾルバを構築する
例えば、外部に公開したDNSは攻撃を受けやすくなるので相応の対策が必要です。
named.confファイルの中身と各設定項目
named.confの設定はrootユーザーでのみ可能です。
「# vi /etc/named.conf」で編集しましょう。
named.confはステートメントという項目別に設定する!
named.confの設定は項目(ステートメント)別に分かれています。
- options:待ち受けポートや動作ファイルの場所を設定
- logging:ログファイル種類と場所を設定
- zone:DNSサーバーのゾーン設定
- include:外部ゾーン定義ファイルの読み込み
- 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 “ゾーンファイルの場所“
実際のゾーン定義は以下のようになっています。
定義したいゾーンのドメインとは、自分がおきたい権威DNSサーバーが管理するゾーンのドメインです。
ホストwww.hogehoge.example.comのhogehoge.example.comのゾーンを管理するDNSサーバーをおきたい場合はhogehoge.example.comと入力します。
DNSサーバーの種類はmaster(プライマリDNSサーバー)、slave(セカンダリDNSサーバー)、hint(ルートDNSサーバー)などを設定します。
先の設定ではルートドメイン「.」のルートネームサーバーを「hint」で指定しています。
ホストwww.example.comのドメインを管理したい場合の例は下のように設定します。
zone "example.com" IN {
type master;
file "example.com";
};
- マスターネームサーバー:権威DNSサーバーとして権威のある返答ができるネームサーバー
- スレーブネームサーバー:マスターのコピーで冗長性を確保*するために複数用意するネームサーバー
*ここで言う冗長の確保とはマスターネームサーバーが障害で使えない時など、マスターの代わりになるスレーブネームサーバーを用意しておくことでサービスの停止を防ぐ試みのこと
ゾーンファイルの場所(fileサブステートメント)ではゾーンファイルのファイル名・パスを指定できます。ファイルの初期ディレクトリはoptionステートメントのdirectoryで設定した場所(/var/named)からのパスになります。
例:/slave/named.example.comの絶対パスは/var/named/slave/named.example.comになります。
includeステートメント
includeはnamed.confの他に作ったファイルの中にあるゾーンステートメントの情報をnamed.confに取り込むという意味です。
named.confに何でも書き込むと後で変更があったときに管理が難しくなります。そこで、named.conf以外にゾーン情報を記入したファイルを用意してそれをincludeで指定してnmaed.confに取り込むことで管理しやすくなります。
named.rfc1912.zones:RFCはインターネット技術の標準仕様を定義する団体でそこで定められた最低限のゾーン定義の初期設定が書かれたファイル。ループバックアドレスに対するゾーン定義が書かれている
named.root.key:ルートゾーンに対するdnssecのキーが書かれたファイル
named.confの文法チェック
named.confの設定が終わったら文法チェックを行いましょう。
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)。
ゾーンファイルの書式は
- $で指定するゾーンファイルディレクティブ部
- リソースレコード(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でゾーン定義をしておきます。
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」です。
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のレコードを確認するコマンド dig nslookupの使い方
参考
参考 強いBIND DNSサーバを構築する 第三回 基本的なゾーン設定 | ユーロテック情報システム販売株式会社ユーロテック情報システム販売株式会社
参考 BINDの設定(named.conf)取得できませんでした
渡邉結衣,・佐藤新太・ 藤原和典 (2018) DNSがよくわかる教科書 SBクリエイティブ
DNSのレコードを確認するコマンド dig nslookupの使い方