It's a peacehell world.

こんな名前ですが情報技術について主に扱うブログです。

[DNS] BIND でローカル DNS サーバー構築

ちゃちゃっと DNS サーバーを構築をします。

AWS Route53 はゾーン設定が Web コンソールでできたので使いやすかったんだなぁと今更実感しました。

⌨️ 環境

はじめに

DNS サーバーには BIND 以外にも PowerDNSNSD などあるようですが、

en.wikipedia.org

にて

As of 2015, it is the most widely used domain name server software, and is the de facto standard on Unix-like operating systems.

と、BIND こそが Unix ライク OS の DNS サーバーでデファクトスタンダート(自称)だと仰るので、初めてですし BIND を使います。

余談ですがバージョンとしては BIND10 もあったらしいですが、プロジェクト消滅して BIND9 のリファクタリングを行う方針になったようです。(そもそも ISC の ホームページ の Products に BIND9 しかない。)

BIND9 には脆弱性があるという声が多いのが気になりますが、ローカル DNS ということで今回は見なかったことにします。

参考:https://ubuntu.com/search?q=Bind+vulnerability

(解消してるものも多いと思いますが、結構あります。)

1. BIND9 インストール

apt-get で BIND9 をインストールします。

$ sudo apt-get install -y bind9

2. /etc/bind/named.conf.options 設定

/etc/bind/named.conf.options を編集します。

options {
    directory "/var/cache/bind";
    dnssec-validation auto;
    //listen-on-v6 { any; };
    listen-on port 53 { localhost; };
    allow-query { any; };
    forwarders { 8.8.8.8; };
    recursion no;
}

補足

  • IPv6 使わない場合は listen-on-v6 をコメントアウトする
  • listen-on には適宜プライベートネットワークアドレスを追記する
  • allow-query でアクセス元を制限できる

3. ゾーンの設定

/etc/bind/named.conf を見てみると

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

とあるので、

  1. /etc/bind/named.conf.local に zone を追記
  2. /etc/bind/named.conf.default-zones に zone を追記
  3. 自分で追加したファイルに zone を記述して include させる

などの方法でゾーンの設定を追加できそうです。

.conf が全部そうなのかわかってませんが、やり口は Nginx の conf と同じですね。

今回は named.conf.local に追記します。

zone "mydomain.com" {
        type master;
        file "/etc/bind/db.mydomain.com";
};

ローカル DNS なので、ここでつける名前(手順の例では mydomain.com )は取得してないドメインでも名前つけ放題です。

file "/etc/bind/db.mydomain.com" のファイルは次の手順で作成します。

4. ゾーンファイルの作成

/etc/bind/db.local をもとに編集します。

$ sudo cp /etc/bind/db.local  /etc/bind/db.mydomain.com
;
; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     mydomain.com. root.mydomain.com. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      www
www     IN      A       192.168.0.x

この場合は www.mydomain.com192.168.0.x に名前解決されます。

test.mydomain.com も追加したい場合は NS レコードと A レコードを追加します。

@       IN      NS      www
www     IN      A       192.168.0.x
@       IN      NS      test
test    IN      A       192.168.0.x

余談ですが、

  • NS レコード左辺の @ は何なのか
  • SOA レコードってそもそも何なのか

あたりがさっぱりなので、今後書くであろうゾーンファイルを掘り下げる記事でお会いしましょう。

5. BIND9 再起動

$ sudo systemctl restart bind9

6. 確認

dig コマンドで確認。

$ dig www.mydomain.com
・・・
;; ANSWER SECTION:
www.mydomain.com. 604800 IN A   192.168.0.x
・・・

名前つけ放題と先ほど言いましたが、この世に存在するドメインを名付けてパブリック DNS サーバーが先に参照されて名前解決された場合は当然ローカル DNS サーバーでの名前解決はされません。

そのため、/etc/resolv.conf でパブリック DNS サーバーの前にローカル DNS サーバーを記述してください。

resolv.conf の nameserver の順序については

linuxjm.osdn.jp

を参考にしてください。

名前解決先に Web アプリがあればそれぞれ curl で確認して同じ内容が得られます。

$ curl http://192.168.0.x
(何かしらの HTML)

$ curl http://www.mydomain.com
(何かしらの HTML)

おわりに

ゾーンファイルはテンプレートの /etc/bind/db.local をもとにしただけで使いこなせていません。

なので、今後はゾーンファイルを掘り下げていきたいですね。