dns
bind

俺のDNS - BIND9の覚書

More than 3 years have passed since last update.

最終更新日:2016.01.13


前提


  • ドメインを1つ以上取得済み

  • VPSなどのサーバをレンタル済み

  • 取得しているドメインをVPSに割り当てたい


    • サブドメインなどを自由に作りたい

    • メールアドレスをたくさん作りたい




運用

DNSの運用には大きく3つある


  • ドメインの問い合わせに使うプライマリDNSサーバ

  • ゾーン情報を受け取るセカンダリDNSサーバ

  • 不特定多数の問い合わせを受け付けるキャッシュDNSサーバ

ドメインを取得しVPSサーバを借り、自前で管理するなら、プライマリDNSサーバを構築する。


基礎知識


  • Aレコード/AAAAレコード


    • IPアドレスからFQDNを調べるのに必要

    • 書式:FQDN TTL IN A IPアドレス

    • 実例:www.example.com 1D IN A 111.222.33.44

    • 逆引きには使われない

    • ここで設定したFQDNが正規名となる



  • CNAMEレコード


    • AレコードでつけたFQDNに別名をつける

    • 書式:FQDN TTL IN CNAME 正規名

    • 実例:www2.example.com 1D IN CNAME www.example.com

    • CNAMEで付けられた別名を更に別名には出来ない



  • NSレコード


    • 該当ドメインのゾーンの権威を持つDNSサーバを指定

    • 書式:ゾーン名 TTL IN NS DNSのFQDN

    • Aレコードで定義されたFQDNである必要がある

    • CNAMEで定義された別名は指定出来ない

    • 下位のDNSに再帰問い合わせする際に使用される



  • SOAレコード


    • 該当するゾーンファイルが管理するゾーン情報

    • 書式:ゾーン名 TTL IN SOA マスターサーバ メールアドレス

    • 実例:example.com. 1D IN SOA ns.example.com root.example.com.



  • MXレコード


    • メールアドレスに使用するドメインを定義する

    • 書式:メアド用ドメイン TTL IN MX プリファレンス値 メールサーバのFQDN

    • 実例:example.com. 1D IN MX 10 mail.example.com.

    • プリファレンス値は小さい方が優先される(10起きに指定するのが慣例)



  • PTRレコード


    • 逆引き専用のレコード

    • 書式:逆引きドメイン TTL IN PTR FQDN

    • 実例:10.1.168.192.in-addr.arpa. 1D IN PTR www.example.com.




ツール


  • rndc


    • BINDの制御を行うツール

    • 書式:rndc オプション

    • 実例:rndc reload <ゾーンファイル> (キャッシュを消さないでリロード)

    •    rndc stop (安全にBINDを停止する)

    •    rndc status

    •    その他



  • named-checkconf


    • named.confの書式チェック

    • 書式:named-checconf named設定ファイル

    • 実例:named-checconf /etc/named.conf

    • あくまで書式のみなので内容はチェックされない



  • named-checkzone


    • ゾーンファイルの書式チェック

    • 書式:named-checkzone ドメイン名 ファイル名

    • 書式:named-checkzone example.com example.com.zone

    • あくまで書式のみなので内容はチェックされない




リゾルバ設定

キャッシュサーバとして使用するなら、BINDにはスタブリゾルバ(どのDNSに問い合わせれば良いのかを知ってるクライアント側のリゾルバ)の機能はないので、resolv.confに自分自身(127.0.0.1)をフルサービスリゾルバ(クライアントからの名前解決に応答するキャッシュサーバ)として記述しておく。

プライマリDNSサーバ(所有ドメインの管理・運用)としてだけ利用するなら記述しなくてOK。

ついでにgoogleのDNSなども記述しておくと寝覚めが良いかも。

/etc/resolv.conf

nameserver 127.0.0.1

nameserver 8.8.8.8
nameserver 8.8.4.4


BIND設定ファイル(named.conf)


概要


  • コメント


    • //

    • /* */

    • #



  • ステートメント



    • options


      • サーバ全体の設定をまとめて行う




    • controls


      • アクセス設定などを行う




    • zone


      • ゾーンとゾーン管理の情報の設定を行う




    • include


      • 指定したファイルを読み込む




    • view


      • クライアントごとにBINDの挙動を変える設定を行う






ACL

予めネットワークのグループに名前をつけておくことができる。

その名前をつかってallow-query、allow-transferなどを指定できるので、セカンダリDNSサーバのIPアドレスが変わった場合などでも、ACL側の一箇所を変更すれば全体に反映させることができる。

acl "ACL-NAME1" {

192.168.10.0/24;
};
acl "ACL-NAME2" {
192.168.10.0/24;
192.168.11.0/24;
192.168.12.0/24;
};

お名前.comでドメイン取ってるのであれば、210.172.129.81にしておく。

無料セカンダリDNSのマイハマネットなら、160.16.54.90と153.120.38.37(2015年12月現在)。

acl "Onamae" {

210.172.129.81;
};
acl "Maihama" {
160.16.54.90;
153.120.38.37;
};


options

全体に関わる挙動を設定する。


  • 一般項目



    • version [ バージョン数 ]


      • バージョン問い合わせ時に返答する文字列


      • unknownguessなどでOK




    • hostname [ ホスト名 ]


      • ホスト名問い合わせ時に返答する文字列

      • 省略された場合はOSのホスト名が使われる

      • 省略しておいてOK





  • ファイル関連



    • directory [ ファイルパス ]



      • named.conf内での相対指定時に使われるフルパスのプレフィックス

      • 特に変更する必要はない




    • dump-path [ ファイルパス ]


      • dump-file


      • rndcコマンドでdbダンプした際のファイルパス

      • デフォルトは/named_dump.db




    • statistics-file [ ファイルパス ]



      • rndcコマンドで統計情報を保存するファイルパス

      • デフォルトは/named.stats




    • pid-file [ ファイルパス ]


      • namedプロセスのPIDを書き出すファイルパス

      • 一般的には/var/runに吐き出す





  • アドレス/ポートの設定



    • listen-on port [ ポート番号 ]


      • このDNSサーバにアクセス可能なポート番号を指定する(通常は53番ポート)

      • 省略するとホストに割り当てられた全アドレスをリッスンする





  • ゾーン転送関連



    • notify [ yes | no ]


      • SOAであるマスターゾーンの変更があった場合、スレーブに通知するかどうかの設定。




    • max-transfer-time-in [ 秒数 ]


      • インバウンド(グローバルからのアクセス)のゾーン転送タイムアウト




    • transfer-format [one-answer|many-answers]


      • 返答するレコード数。one-serverは1レコードのみ、manyは複数レコードを返答する




    • transfers-in [ 数値 ]


      • 同時実行可能なインバウンドのゾーン転送数

      • デフォルトは2




    • transfers-pre-ns [ 数値 ]


      • 同時実行可能なインバウンドのリモートサーバ1台あたりの最大数

      • デフォルトは2





  • アクセス制限



    • allow-transfer [ IP | ACL名など ]


      • ゾーン転送を許可するリモートサーバ

      • ACL名での指定可能




    • allow-query-cache [ IP | ACL名など ]


      • キャッシュに対するDNSクエリを許可するリモートホスト

      • ACL名での指定可能





  • 再帰的クエリ



    • recursion [ yes | no ]


      • yesにすると、自分がSOAではないゾーンに関して、そのゾーンのSOAであるDNSに問い合わせてから名前解決する

      • noにすると自分がSOAであるゾーンについて名前解決する

      • セキュリティに係る事項なので慎重に




    • allow-recursion [ IP | ACLなど ]


      • 再帰クエリを特定のホストに限定する

      • ACL名での指定可能






再帰に関して

キャッシュDNSサーバでは不特定多数の名前解決をする必要があったが、プライマリDNSサーバやセカンダリDNSサーバではポイズニングを防ぐため、recursionは禁止したほうが良い。

DNSキャッシュが必要なら、所有してるドメインを登録・利用するだけのプライマリサーバとは別に、別途キャッシュDNSサーバを建てるのが良いらしい。


ゾーン設定

example.comというドメインを取得してるなら、以下のように設定しておく。

正引き

zone "example.com" IN {

type master;
file "example.com.zone";
};

逆引き

zone "44.33.222.111.in-addr.arpa" IN {

type master;
file "44.33.222.111.in-addr.arpa";
};

fileの部分は、optionのdirectoryディレクティブで設定したパスになる。

つまりこの場合、/var/named/example.com.zone44.33.222.111.in-addr.arpa というゾーンファイルを作れば良い。

逆引きゾーンファイルの設定で注意するのが、in-addr.arpaの前はハイフンではなくピリオド。


解説



  • zone


    • 整備機の場合はドメイン名を指定


      • example.com



    • 逆引きの場合はドット付きIPアドレス


      • 44.33.222.111.in-addr.arpa






  • type


    • ドメイン管理するならmaster

    • 他サーバのゾーンをバックアップするだけならslave




  • file


    • ゾーンファイルのパス




  • allow-transfer


    • ゾーン転送要求を許可するスレーブサーバ

    • ACLでの設定可能




  • notify


    • ゾーンファイルが更新された場合スレーブに通知する




  • also-notify


    • notifyがyesの場合の通知先の設定

    • ACLでの設定可能



参考設定

acl "Maihama" {

160.16.54.90;
153.120.38.37;
};
acl "Onamae" {
210.172.129.81;
};
options {
// 問い合わせ元は限定しないのでコメントアウト
/*
listen-on port 53 {
127.0.0.1;
};
*/

// IPv6で問い合わせさせないのでコメントアウト
/*
listen-on-v6 port 53 { ::1; };
*/

directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query {
any;
};

// オープンリゾルバにならないようにnoにする
recursion no;

// ゾーンファイル転送するセカンダリDNSサーバを指定
allow-transfer {
Onamae;
Maihama;
};

dnssec-enable no;
dnssec-validation no;

/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";

managed-keys-directory "/var/named/dynamic";

pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};

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

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

/*
ゾーンファイル読み込み設定
*/
zone "example.com" IN {
type master;
file "example.com.zone";
};
zone "44.33.222.111.in-addr.arpa" IN {
type master;
file "44.33.222.111.in-addr.arpa";
};

include “/etc/myzones.zones”;


  • パーミッションは640にすること

  • rootユーザ namedグループにすること


ゾーンファイル(*.zone)


設定例

正引きゾーンファイル

$ORIGIN example.com.

$TTL 3600 ; 1 hour
@ IN SOA dns.example.com. postmaster.example.com. (
2009082401 ; serial
3600 ; refresh (1 hour)
1200 ; retry (20 min.)
1209600 ; expire (2 weeks)
900 ; minimum (15 min.)
)
@ IN NS dns.example.com.
@ IN NS ns2.dnssv.jp.
@ IN MX 10 mail.example.com.
@ IN TXT “v=spf1 mx ~all” ; SPF record
ns1 IN A 124.34.146.121
ns2 IN A 124.34.146.122
mail IN A 124.34.146.123
server4 IN A 124.34.146.124
www IN CNAME server4


  • パーミッションは640にすること

  • rootユーザ namedグループにすること


  • aaa.combbb.comccc.comを所有してるとしても、マスターDNSとして設定してるFQDNを指定する。aaa.comのゾーンファイルをコピーして、一括置換とかでドメイン名を変更した場合、存在しないdns名になってしまうので注意する。

逆引きゾーンファイル

$ORIGIN 120/28.146.34.124-in-addr.arpa.

$TTL 3600
@ IN SOA dns.example.com. postmaster.example.com. (
2009082401; serial
3600 ; refresh (1 hour)
1200 ; retry (20 min.)
1209600 ; expire (2 weeks)
900 ; minimum (15 min.)
)
121 IN PTR dns.example.com.
122 IN PTR ns2.dnssv.jp.
123 IN PTR mail.example.com.
124 IN PTR server4.example.com.


  • パーミッションは640にすること

  • rootユーザ namedグループにすること


解説



  • $ORIGINディレクティブ


    • SOA、A、PTRレコードなどの最後に.がない場合に、最後に付与される文字列。

    • 上記正引きの場合、mailには.が無いので後ろにexample.com.が付与されmail.example.com.となる

    • ゾーンファイル内に複数指定可能


      • わかりにくくなるので1ドメイン1ファイルにしたほうが良い






  • $TTLディレクティブ


    • ゾーンの寿命を秒単位で指定する。

    • 3600(1時間)くらいが妥当



  • SOAレコード


    • Start Of Authorityの略

    • ここから記述した内容は権限のある情報である、と言う意味。


    • @は直近の$ORIGINと同意

    • MNAME


      • このゾーンのプライマリDNSサーバ

      • 末尾に.をつけるFQDNで指定する(dns.example.com.)



    • RNAME


      • このゾーンの責任者のメールアドレス


      • @.に置き換えて記述する



    • SERIAL


      • ゾーンのシリアル番号。符号なし32ビット

      • 編集するたびに加算しないと認識されない

      • 年月日連番にしておくと楽



    • REFRESH


      • スレーブDNSサーバの更新タイミングを決定する目安になる値



    • RETRY


      • 再実行の周期を秒単位で指定



    • EXPIRE


      • マスターがダウンした場合の賞味期限



    • MINIMUM


      • 各レコードのデフォルトのTTL






TIPS


  • 固定IPが一つの場合、通常はプロバイダが管理してるので、逆引きのzoneファイルは作らないでOK

  • 社内アクセス用のDNSサーバを建てるときはキャッシュサーバを建てる

  • ドメインを持っていてレンタルサーバなどでDNSを建てる場合はキャッシュサーバではなくプライマリDNSサーバを建てる(recursionはnoにする)