iimon TECH BLOG

iimonエンジニアが得られた経験や知識を共有して世の中をイイモンにしていくためのブログです

ローカル(仮想環境)にBINDをたててdigコマンドを投げてみた

はじめに

株式会社iimonの木暮です。

今回は実際に構築した権威サーバへクエリを送ってレスポンスを確認するところまで行います。

今回の記事は、調べれば類似の記事がたくさん見つかるような内容ですが、「百聞は一見に如かず」という言葉を胸に、自分でしっかり手を動かしながら学んだことをまとめました。

本記事では、実際に調べたことや手を動かして試したプロセスを、順を追って整理しています。また、情報をまとめる際に参考にした素晴らしい記事を執筆された方々には心から感謝いたします。この場を借りて御礼申し上げます。

本記事はiimonアドベントカレンダー7日目の記事となります。

環境構築編

仮想環境にBINDをインストールしていきます。
本記事での操作は、以下の環境を前提としています
機種:MacBook Pro (2023)
CPU:Apple Silicon M2 Pro
メモリ:32GB
仮装環境:Multipass

以降、この環境を基に進めていきます。

※補足
BINDとはDNSサーバのデファクトスタンダードとしての地位を確立しているOSSです。

インストール

今回は Multipassの仮装環境上で手順を進めます。
なお、本記事では Multipass がすでにインストールされていることを前提に解説を進めていきます。
本当はローカルでHomebrewでやりたかったのですが何度やってもdigコマンド投げるところでカーネルパニックを起こしてPCが落ちてしまったので断念しました。
原因わかる人いたら教えてください。

tech.iimon.co.jp

1. インストールコマンドの実行

sudo apt install bind9

聞かれたらY→enter

Do you want to continue? [Y/n] Y

2. 実行後の確認
完了したらインストールができているか確認してみます。

$ named -v
BIND 9.18.28-0ubuntu0.24.04.1-Ubuntu (Extended Support Version) <id:>

ひとまずインストールは完了です。
簡単ですね。

続いてBINDが動いていることを確認してみます。

$ sudo systemctl status named
● named.service - BIND Domain Name Server
     Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; preset: enabled)
     Active: active (running) since Sun 2024-12-01 22:02:45 JST; 4min 40s ago
       Docs: man:named(8)
   Main PID: 2903 (named)
     Status: "running"
      Tasks: 5 (limit: 1060)
     Memory: 6.2M (peak: 6.4M)
        CPU: 18ms
     CGroup: /system.slice/named.service
             └─2903 /usr/sbin/named -f -u bind

Dec 01 22:02:45 adventCalendar2024 named[2903]: managed-keys-zone: loaded serial 0
Dec 01 22:02:45 adventCalendar2024 named[2903]: zone localhost/IN: loaded serial 2
Dec 01 22:02:45 adventCalendar2024 named[2903]: zone 0.in-addr.arpa/IN: loaded serial 1
Dec 01 22:02:45 adventCalendar2024 named[2903]: zone 127.in-addr.arpa/IN: loaded serial 1
Dec 01 22:02:45 adventCalendar2024 named[2903]: zone 255.in-addr.arpa/IN: loaded serial 1
Dec 01 22:02:45 adventCalendar2024 named[2903]: all zones loaded
Dec 01 22:02:45 adventCalendar2024 systemd[1]: Started named.service - BIND Domain Name Server.
Dec 01 22:02:45 adventCalendar2024 named[2903]: running
Dec 01 22:02:45 adventCalendar2024 named[2903]: managed-keys-zone: Initializing automatic trust anchor management for zone '.'; DNSKEY ID 20326 is now tru>
Dec 01 22:02:45 adventCalendar2024 named[2903]: resolver priming query complete: success

Status: "running"が確認できました。動いてますね。
次に設定ファイルの編集を行います。

設定

BINDの設定はnamed.confを使用して行います。
named.confは以下のディレクトリに存在しています。

[kogure:~]
$ ls -l /etc/bind/
total 48
-rw-r--r-- 1 root root 2403 Jul 17 03:16 bind.keys
-rw-r--r-- 1 root root  255 Jan 26  2024 db.0
-rw-r--r-- 1 root root  271 Jan 26  2024 db.127
-rw-r--r-- 1 root root  237 Jan 26  2024 db.255
-rw-r--r-- 1 root root  353 Jan 26  2024 db.empty
-rw-r--r-- 1 root root  270 Jan 26  2024 db.local
-rw-r--r-- 1 root bind  458 Jan 26  2024 named.conf
-rw-r--r-- 1 root bind  498 Jan 26  2024 named.conf.default-zones
-rw-r--r-- 1 root bind  165 Jan 26  2024 named.conf.local
-rw-r--r-- 1 root bind  846 Jan 26  2024 named.conf.options
-rw-r----- 1 bind bind  100 Dec  1 22:02 rndc.key
-rw-r--r-- 1 root root 1317 Jan 26  2024 zones.rfc1918

今回、「iimon-kogure.com」の権威サーバとしての設定をnamed.confに設定していきます。
設定は以下のドキュメントの「3.2.1. Primary Authoritative Name Server」を参照して行いました。

bind9.readthedocs.io

まずはoptionsの設定をしていきます。
ドキュメントの例の各設定値にコメントベースで解説があったのでそれぞれどういった設定なのかを英語で書かれていたものを調べて解釈してみました。

1.directory
相対パスの基準ディレクトリ。
設定で相対パスで設定されているもの基準はここで定義する。

2.version
BINDのバージョンを設定する。
脆弱性を利用されないように隠蔽するのがベター。

3.allow-query
問い合わせを許容するIPアドレスを指定する。 公開するならany。
個人や限られたのネットワークで使用するならIPアドレスを制限する。

4.allow-query-cache
問い合わせ結果をキャッシュするか指定する。
権威サーバとして使用する場合はキャッシュしない設定をする。
ゾルバーとして使用するならキャッシュさせる設定をする。

5.recursion
再帰的問い合わせを行えるかを設定する。
ゾルバーとして使用するならyes
権威サーバならnoを設定する

他に設定できる値はドキュメントにまとまっている

bind9.readthedocs.io

参考: tech.synapse.jp

今回は以下のように設定してみます。
動作確認時に起動させるだけなのでドキュメント通りの設定値としました。
allow-queryは自身のローカルIPを指定しても良いと思いました。

options {
    directory "/opt/homebrew/var/named";
    version "not currently available";
    allow-query { any; };
    allow-query-cache { none; };
    recursion no;
};

次にzoneの設定を行います。

optionsと同様にドキュメントの例の各設定値にコメントベースで解説があったのでそれぞれどういった設定なのかを英語で書かれていたものを調べて解釈してみました。

1.zone {domainName}
optionsと異なり一番上のセクションでどのドメインに対するzone設定なのかを明示する必要があります。

2.type
権威サーバーの種類を明示する設定です。
プライマリサーバーならばprimaryを設定する。
セカンダリサーバーならばsecondaryを設定する。

3.file
ゾーンデータを格納しているファイル名を指定する。

4.notify
セカンダリサーバーへゾーン設定の変更を通知する。

5.allow-transfer
ゾーン転送を行うセカンダリサーバのIPアドレスを指定する。

今回は以下のように設定してみます。
動作確認時に最低限必要と思われる設定をしました。
notify周りの動作確認も次回以降してみたいです。

zone "iimon-kogure.com" {
  type primary;
  file "iimon-kogure.com";
};

次にゾーンファイルの設定を行います。 ゾーンファイルは以下のようにSOAリソースレコード、NSリソースレコード、Aリソースレコードを設定しました。

$TTL 3600
$ORIGIN iimon-kogure.com.
@       IN  SOA   ns1.iimon-kogure.com. admin.iimon-kogure.com. (
                                2024120100
                                3600
                                900
                                604800
                                3600 ) 
           IN      NS      ns1.iimon-kogure.com.
@          IN      A       192.168.1.1
ns1        IN      A       192.168.1.1

さすがに、リソースレコードはjprsの解説がわかりやすいと思いますのでそちらをリンクします。

参考:

jprs.jp

jprs.jp

jprs.jp

jprs.jp

設定の反映

それぞれ設定を以下のようにしました。

$ pwd
/etc/bind
$ cat named.conf.adventcalendar
options {
    directory "/etc/bind";
    version "not currently available";
    allow-query { any; };
    allow-query-cache { none; };
    recursion no;
};

zone "iimon-kogure.com" {
  type primary;
  file "iimon-kogure.com";
};
$ cat iimon-kogure.com
$TTL 3600
$ORIGIN iimon-kogure.com.
@       IN  SOA   ns1.iimon-kogure.com. admin.iimon-kogure.com. (
                                2024120100 ; serial number
                                3600            ; Refresh
                                900             ; Retry
                                604800          ; Expire
                                3600 )          ; Negative cach
           IN      NS      ns1.iimon-kogure.com.
@          IN      A       192.168.1.1

そしてnamed.conf.adventcalendarを読み込むようにnamed.confを書き換えました。

$ cat named.conf
// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

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

include "/etc/bind/named.conf.adventcalendar";

この状態でサービスの再起動をしてみます。

$ sudo systemctl restart named
Job for named.service failed because the control process exited with error code.
See "systemctl status named.service" and "journalctl -xeu named.service" for details.

エラーとなってしまいました。
journalctl -xeu named.serviceで詳細を確認してみました。
権限周りでのエラーのようでした。

Dec 01 22:53:17 adventCalendar2024 named[3358]: directory '/etc/bind' is not writable
Dec 01 22:53:17 adventCalendar2024 named[3358]: /etc/bind/named.conf.adventcalendar:2: parsing failed: permission denied
Dec 01 22:53:17 adventCalendar2024 named[3358]: loading configuration: permission denied
Dec 01 22:53:17 adventCalendar2024 named[3358]: exiting (due to fatal error)

/etc/bindの書き込み権限が無いと書いてあるようなので確認してみます。

$ ls -ld /etc/bind
drwxr-sr-x 2 root bind 4096 Dec  1 22:39 /etc/bind

グループの書き込み権限が無いので付与して実行してみました。

$ sudo chmod 775 /etc/bind
$ ls -ld /etc/bind
drwxrwsr-x 2 root bind 4096 Dec  1 22:39 /etc/bind
$ sudo systemctl restart named
$

無事再起動ができました。

参考:

ameblo.jp

確認編

構築が完了したので早速digコマンドを用いて設定したIPアドレスが取得できるか確認してみます。

digコマンドの実行
dig @localhost iimon-kogure.com

このコマンドで今回構築したDSNサーバに対してiimon-kogure.comを名前解決します。
192.168.1.1のIPアドレスが取れたら成功です。

$ dig @localhost iimon-kogure.com

; <<>> DiG 9.18.28-0ubuntu0.24.04.1-Ubuntu <<>> @localhost iimon-kogure.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65531
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 9066a67d196c0bc101000000674c6d7c956cc74b6c367d44 (good)
;; QUESTION SECTION:
;iimon-kogure.com.      IN  A

;; ANSWER SECTION:
iimon-kogure.com.   3600    IN  A   192.168.1.1

;; Query time: 0 msec
;; SERVER: ::1#53(localhost) (UDP)
;; WHEN: Sun Dec 01 23:06:52 JST 2024
;; MSG SIZE  rcvd: 89

ANSWER SECTIONを確認すると意図したレコードが取得できていました!

終わりに

冒頭にも少し触れましたが、当初はローカル環境でHomebrewを使って環境構築を進めていました。しかし、なぜかdigコマンドを実行するとPCがクラッシュするという謎の現象に悩まされました。

設定ファイル自体は問題なかったため、それ以外の部分が原因だとは思いますが、クラッシュのたびに心が折れそうになりました……。

それでも、仮想環境を利用することで何とか記事を書き上げることができました!
昨年のアドベントカレンダーで仮想環境の記事を書いておいて本当によかった……まさに伏線回収ですね!

機会があれば、次はセカンダリサーバーの設定やDNSキャッシュポイズニングの動作確認にも挑戦してみたいと思います。

最後まで読んでくださりありがとうございます!

この記事を読んで興味を持って下さった方がいらっしゃればカジュアルにお話させていただきたく、是非ご応募をお願いします。
iimon採用サイト / Wantedly / Green

次のアドベントカレンダーの記事は腰丸さんです! どんな記事を書いてくれるのか楽しみですね!!!!!