bindでコンテンツ兼キャッシュDNSサーバを内部と外部向けに1台で共存して構築する方法(前編)

DNSコンテンツサーバとして、内部向けに公開したいゾーン情報と、外部向けに公開したいゾーン情報がある場合があります。これらを別々のDNSサーバで構築することも可能ですが、一つのサーバで構築しDNSキャッシュサーバとしての機能も持たせる設定を紹介します。bindでの実装になりますが、応用ができると思いますので、参考になれば幸いです。

具体的には、プライベートIPアドレスでアクセスする場合は内部向け、グローバルIPアドレスでアクセスする場合は外部向けといった形ですね。

設定するDNSサーバの環境の定義

今回設定する環境について、示しておきます。

  • bindのサーバはプライマリ、セカンダリの2台構成。
  • 各サーバに内部用IPアドレス、外部用IPアドレスをそれぞれ持つ。
  • 内部からは、再帰問い合わせを可能にする。つまり、キャッシュサーバも兼ねる。
  • 外部からは、再帰問い合わせは不可とし、コンテンツサーバのみの構成にする。

イメージ図としては、以下のようになります。(ここでは、評価環境のため外部LANもプライベートIPアドレスにしています)

DNS評価環境イメージ図
DNSサーバ環境イメージ図

bindのインストール(chroot環境)

まず、bindのインストールからです。セキュリティを考慮してchroot環境を構築します。
Linuxサーバ(ここでは、almalinux 8)に管理者でログインして、下記のコマンドを実行します。

インストールが無事すみましたら、自動起動の設定を行います。
上述のとおり、ここでは、chroot環境を動作させますので、通常のnamedサービスは停止(disable)し、named-chrootサービスを自動起動(enable)させ、サービスを稼働(start)させます。

bindの設定(/etc/named.conf)

プライマリDNSサーバの /etc/named.conf に以下の通り設定します。
viewを使用して、内部と外部の制御をおこないます。

// 内部用のアクセスコントロールを設定。ここに内部のIPアドレスを記載
acl "naibu" {
        192.168.200.0/24;
        localhost;
        127.0.0.1;
};

options {
        listen-on port 53 { 192.168.0.23; 192.168.200.11; 127.0.0.1; };
        // listen-on-v6 port 53 { ::1; };  //ipv6はコメント
        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";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
        // 以下のallow-*はあえて明記
        allow-query     { any; };   // クエリは誰からでも受け入れる
    allow-query-cache { none; }; // キャッシュの内容は誰にも返さない
    allow-recursion { none; };  // 再帰問い合わせは受け付けない
        allow-transfer  { none; };  // ゾーン転送を誰にも許可しない
        allow-update    { none; };    // ゾーン情報の更新許可クライアントなし

        version "unknown";   // バージョン情報の隠蔽

        recursion no;     // リゾルバーとして動作させない。(再帰問い合わせなし)

        dnssec-enable no;        // dnssecは無効化
        dnssec-validation no;

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

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

        /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
        include "/etc/crypto-policies/back-ends/bind.config";

        notify no;   // ゾーン情報の更新通知をしない
};

logging {
        category lame-servers { null; };

        channel "default-log" {
        file "/var/log/default.log" versions 5 size 10M;
        severity debug;
        print-time yes;
        print-severity yes;
        print-category yes;
        };

        channel "query-log" {
        file "/var/log/query.log" versions 5 size 10M;
        severity info;
        print-time yes;
        print-severity yes;
        print-category yes;
        };

        category default {"default-log";};
        category queries {"query-log";};
};

// 内部用のview作成
view "internal" {
        match-clients { naibu; }; // naibuのアクセスリストにあるクライアントのみ許可
        allow-query { naibu; };  // naibuからのクエリを許可
        allow-query-cache { naibu; }; // naibuからのキャッシュを許可
        allow-recursion { naibu; };  // naibuからの再帰問い合わせ許可
        allow-transfer { 192.168.200.12; }; // セカンダリ(内部IP)へのゾーン転送許可
        also-notify { 192.168.200.12; };  // ゾーンのコピーが早急に実施される
        recursion yes; // リゾルバーとして動作。(再帰問い合わせ可)
        notify yes;   // ゾーン情報の更新通知する

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

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

        zone "hogehoge.local" IN {  // hogehoge.localのゾーンを管理(内部用)
                type master;
                file "master/hogehoge.local";
        };
};

// 外部用のview作成
view "external" {
    // すべてのクライアント。named.confの上から順に処理されるため実質は
        // naibu以外のすべてのクライアントになる。
        match-clients { any; }; 
        recursion no; // リゾルバーとして動作させない。(再帰問い合わせなし)
        notify yes;  // ゾーン情報の更新通知する
        also-notify { 192.168.0.25; };  // ゾーンのコピーが早急に実施される
        allow-transfer { 192.168.0.25; }; // セカンダリ(外部IP)へのゾーン転送許可

        zone "hogehoge.jp" {   // hogehoge.jpのゾーンを管理(外部用)
                type master;
                file "master/hogehoge.jp";
        };
};

長くなりましたので、前半はここまでです。後半に続きます。

あらかじめ、digコマンドの詳細を確認したい方は、bindのクエリログに表記されている内容と意味を確認するをご確認ください。