雑木林

頭の中の整理と忘れないための確認メモ

内部DNSサーバとゾーン転送設定

かれこれ何回も作っては壊している自宅サーバについて、長期運用を頑張ってみようというお話。
今回はそんな中でも基本的なサーバの1つであるDNSに関する構築に関する内容です。
DNSに関する解説は様々なサイトでされているので、簡素に手順だけメモしておきます。

構築する環境について

今回構築する環境は以下の通りです。ドメインは適宜読み替えてください。

  • DNSサーバのOS:CentOS7
  • DNSサーバのホスト名:ns1(プライマリ)、ns2(セカンダリ)
  • DNSサーバのIPアドレス:192.168.10.131(プライマリ)、132(セカンダリ)
  • 管理するドメインexample.com

bindのインストール

最小構成でインストールしたサーバにbindをインストールします。

# yum install bind bind-chroot bind-utils
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
依存性の解決をしています
・
・
・
インストール:
  bind.x86_64 32:9.9.4-29.el7_2.3        bind-chroot.x86_64 32:9.9.4-29.el7_2.3 
  bind-utils.x86_64 32:9.9.4-29.el7_2.3 

依存性関連をインストールしました:
  bind-libs.x86_64 32:9.9.4-29.el7_2.3                                          

完了しました!

named.confの編集(master/slave共通)

名前解決に関する基本設定を行います。
aclにてネットワークを定義し、問い合わせやゾーン転送などの設定に利用します。
localnetsはデフォルトで定義されており、サーバが直接接続しているセグメントが自動登録されます。
また、内部向けViewの定義にて独自設定ファイルを読み込むように設定します。

# vi /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

/* 内部セグメントを定義 */
acl "local-networks" {
        192.168.10.0/24;
};


options {
        /* Listenに関する設定(IPv4のみListenする) */
        listen-on port 53 { any; };
        listen-on-v6 port 53 { none; };

        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";

        /* 問い合わせ可能なホストのデフォルト設定(内部NWからのみに制限) */
        allow-query     { localhost; localnets; local-networks; };
        /* ゾーン転送のデフォルト設定(転送しない) */
        allow-transfer  { none; };
        /* 回送先に関する設定(ISPのDNSやgoogleDNSを指定 */
        forwarders      { 8.8.8.8; 8.8.4.4;};

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion yes;

        dnssec-enable yes;
        dnssec-validation yes;

        /* 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;
        };
        /* 逆引きエラー時におけるメッセージ抑止 */
        category lame-servers { null; };
};

/* 内部向けViewの定義 */
view "internal" {
        /* 内部ネットワークに限定 */
        match-clients { localnets; local-networks; };
        match-destinations { localnets; local-networks; };

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

        include "/etc/named.rfc1912.zones";
        include "/etc/named.root.key";

        /* ユーザ追加の設定ファイル */
        include "/etc/named.example.com.zone";
};

ユーザ追加の設定ファイルの編集(example.comに関する設定)

named.confに追記した追加の設定ファイルにexample.comに関する設定を行います。
今回はnamed-chrootで起動するため、フォルダ位置に注意です。
また、起動にはシンボリックリンクの作成が必要みたいなので、合わせて作成します。

プライマリDNS側(Master側)

# vi /var/named/chroot/etc/named.example.com.zone
zone "example.com" {
        type master;
        allow-transfer { 192.168.10.132; };
        notify yes;
        also-notify { 192.168.10.132; };
        file "example.com.db";
};
zone "0/24.10.168.192.in-addr.arpa" {
        type master;
        allow-transfer { 192.168.10.132; };
        notify yes;
        also-notify { 192.168.10.132; };
        file "0.10.168.192.in-addr.arpa.db";
};

セカンダリDNS側(Slave側)

ゾーンファイルの保存先ををslaveフォルダ以下に指定しないと、パーミッションエラーが出ます。

# vi /var/named/chroot/etc/named.example.com.zone
zone "example.com" {
        type slave;
        masters {
                192.168.10.131;
        };
        file "slaves/zone.bak";
};
zone "0/24.10.168.192.in-addr.arpa" {
        type slave;
        masters {
                192.168.10.131;
        };
        file "slaves/0.10.168.192.in-addr.arpa.bak";
};

シンボリックリンクの作成

# ln -s /var/named/chroot/etc/named.example.com.local /etc/named.example.com.local

構文確認

設定ファイルの確認

named.confの正常性確認にはnamed-checkconfを利用します。

# named-checkconf /etc/named.conf

ゾーンファイルの確認

ゾーンファイルの正常性確認委はnamed-checkzoneを利用します。

# named-checkzone example.com /var/named/example.com.db.lan
zone example.com/IN: loaded serial 2016071503
OK

サービスの起動と確認

namedサービスを起動するのではなく、named-chrootサービスを起動します。

# systemctl start named-chroot