はじめに
この実験では、bind9 を使用して Linux システム上にローカルの権威 DNS サーバーをセットアップおよび設定する方法を学びます。最も広く使用されている DNS ソフトウェアパッケージの 1 つを実際に体験し、標準的な Linux マシンをローカルネットワーク用のカスタムドメイン名を解決できるサーバーに変身させます。
プロセスは、必要なパッケージのインストールと、フォワーダーの設定などのグローバルサーバーオプションの設定から始まります。次に、ドメイン名を IP アドレスに解決するためのフォワードルックアップゾーンと、対応する IP 範囲の逆引きルックアップゾーンの両方を定義します。実験の最後に、bind9 設定ファイルの構文を検証し、dig ユーティリティを使用して新しい DNS サーバーをテストし、ローカルドメインのクエリを正しく解決することを確認します。
bind9 のインストールとグローバルオプションの設定
このステップでは、DNS サーバーのコアコンポーネントのセットアップから始めます。これには、Linux 上で最も広く使用されている DNS サーバーソフトウェアパッケージの 1 つである bind9 のインストールが含まれます。また、サーバーの一般的な動作を制御するグローバルオプションを設定します。これは、権威を持たないドメインに対するリクエストをどのように処理するかなどを制御します。
まず、システムで使用可能な最新バージョンのソフトウェアを取得するために、システムのパッケージリストを更新するのが標準的な手順です。
ターミナルで次のコマンドを実行します。
sudo apt-get update
次に、DNS サーバーデーモンを含む bind9 パッケージと、後でテストと検証に使用する dig や named-checkconf などの便利なコマンドラインツールを提供する bind9-utils をインストールします。
sudo apt-get install bind9 bind9-utils
インストールの確認を求められます。「Y」と入力して Enter キーを押します。出力は次のようになります。
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
bind9-libs bind9-doc dns-root-data
...
After this operation, XX.X MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
...
Setting up bind9 (1:9.18.X-XubuntuX.X) ...
bind9 をインストールしたら、次のタスクはグローバル動作を設定することです。主な設定はいくつかのファイルに分割されており、すべて /etc/bind/ ディレクトリにあります。グローバルオプションについては、named.conf.options ファイルを編集します。
nano エディタを使用してファイルを開きます。
sudo nano /etc/bind/named.conf.options
options {
directory "/var/cache/bind";
// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk. See http://www.kb.cert.org/vuls/id/800113
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.
// forwarders {
// 0.0.0.0;
// };
//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-validation auto;
listen-on-v6 { any; };
};
このファイル内には、options { ... }; ブロックがあります。このブロックに、フォワーディング、クエリ権限、およびリスニングインターフェイスのディレクティブが含まれていることを確認する必要があります。フォワーディングにより、DNS サーバーは他のパブリック DNS サーバーに問い合わせることで、外部ドメイン(google.com など)を解決できます。
options ブロックを次のように変更します。欠落している行を追加するか、既存の行のコメントを解除して変更できます。
ヒント:ファイルの内容をクリアするには
Ctrl+Kを押し、次に以下の内容を貼り付けます。
options {
directory "/var/cache/bind";
// If there is not a line with forwarders, add the following section.
// If there is one, ensure it's not commented out and has valid IPs.
forwarders {
8.8.8.8;
8.8.4.4;
};
// Add or uncomment this line to allow queries from any host
allow-query { any; };
recursion yes;
listen-on { any; }; // Listen on all interfaces
listen-on-v6 { any; }; // Listen on all IPv6 interfaces
dnssec-validation auto;
auth-nxdomain no; ## conform to RFC1035
};
編集が完了したら、Ctrl+O を押してファイルを保存し、Enter キーを押してファイル名を確定します。Ctrl+X を押して nano エディタを終了します。これで bind9 のインストールと初期設定が正常に完了しました。
mylocaldomain.net のフォワードルックアップゾーンを定義して作成する
このステップでは、bind9 サーバーをカスタムドメインの権威サーバーとして設定します。これは、人間が読めるホスト名(webserver.mylocaldomain.net など)を対応する IP アドレスにマッピングするデータベースであるフォワードルックアップゾーンを作成することによって実現されます。まず bind9 の設定でゾーンを定義し、次に DNS レコードを含む実際のゾーンファイルを作成します。
まず、新しいゾーンについて bind9 に通知する必要があります。ローカルゾーンの設定は、デフォルトのパッケージ設定から分離するために /etc/bind/named.conf.local に保持されます。このファイルは次のステップで完全に設定されます。
ゾーンが定義されたので、対応するゾーンファイルを作成する必要があります。このファイルには実際の DNS レコードが含まれています。
まず、テンプレートファイルをコピーして、新しいファイルが正しい権限と所有権を持つようにします。
sudo cp /etc/bind/db.local /etc/bind/db.mylocaldomain.net
次に、ファイルを直接編集する代わりに、次の処理を行う単一のコマンドブロックを実行できます。
- VM の IP アドレスを取得します。
- 現在の日付を使用して動的なシリアル番号を生成します。
- 完全で正しいゾーンファイルの内容を
/etc/bind/db.mylocaldomain.netに書き込みます。
まず、ゾーンファイルで使用される変数に VM の IP アドレスをキャプチャします。
VM_IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
このコマンドは、正規表現を使用してプライマリネットワークインターフェイス(eth0)から IPv4 アドレスを抽出します。IP アドレスは DNS レコードに自動的に挿入されます。
次に、適切な DNS レコードでゾーンファイルを作成します。この単一のコマンドで完全なゾーンファイルが生成されます。
sudo bash -c "cat > /etc/bind/db.mylocaldomain.net" << EOF
\$TTL 604800
@ IN SOA ns1.mylocaldomain.net. admin.mylocaldomain.net. (
$(date +%Y%m%d)01 ; Serial (YYYYMMDDNN)
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1.mylocaldomain.net.
ns1 IN A ${VM_IP}
webserver IN A ${VM_IP}
fileserver IN A ${VM_IP}
www IN CNAME webserver
EOF
このコマンドは、VM の特定の IP アドレスを使用して、ゾーンファイルに正しいレコードを自動的に入力します。cat /etc/bind/db.mylocaldomain.net で内容を確認できます。これで、最初のフォワードルックアップゾーンを正常に定義および作成しました。
すべてのローカルゾーンを定義して作成する
このステップでは、必要なすべてのローカルゾーン設定を作成します。ファイルを直接編集する代わりに、スクリプトを使用して以下の操作を実行し、正確なセットアップを保証します。
/etc/bind/named.conf.localの作成: このファイルは、フォワードゾーン(mylocaldomain.net)とリバースルックアップゾーンの両方の定義を含むように、ゼロから生成されます。- リバースゾーンファイルの作成: スクリプトは、必要な
PTRレコードを含むdb.REVERSE_IPファイルも作成します。
まず、両方のゾーン設定に必要な IP アドレス情報を収集します。
IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
REV_IP=$(echo $IP | awk -F. '{print $3"."$2"."$1}')
LAST_OCTET=$(echo $IP | awk -F. '{print $4}')
これにより、VM の IP アドレスが抽出され、リバースルックアップゾーンに必要なリバース IP 形式を作成するために処理されます。たとえば、IP が 172.16.50.100 の場合、REV_IP は 50.16.172 になり、LAST_OCTET は 100 になります。
次に、両方のゾーンについて bind9 に通知するメインゾーン設定ファイルを作成します。
sudo bash -c "cat > /etc/bind/named.conf.local" << EOF
//
// Do any local configuration here
//
// Forward lookup zone
zone "mylocaldomain.net" {
type master;
file "/etc/bind/db.mylocaldomain.net";
};
// Reverse lookup zone
zone "${REV_IP}.in-addr.arpa" {
type master;
file "/etc/bind/db.${REV_IP}";
};
EOF
このファイルは、フォワードルックアップゾーン(名前から IP への解決用)とリバースルックアップゾーン(IP から名前への解決用)の両方を定義します。type master は、このサーバーがこれらのゾーンの権威であることを示します。
最後に、PTR レコードを含むリバースゾーンファイルを作成します。
sudo bash -c "cat > /etc/bind/db.${REV_IP}" << EOF
\$TTL 604800
@ IN SOA ns1.mylocaldomain.net. admin.mylocaldomain.net. (
$(date +%Y%m%d)01 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1.mylocaldomain.net.
;
${LAST_OCTET} IN PTR ns1.mylocaldomain.net.
${LAST_OCTET} IN PTR webserver.mylocaldomain.net.
${LAST_OCTET} IN PTR fileserver.mylocaldomain.net.
EOF
この自動化されたアプローチにより、named.conf.local で両方のゾーンが正しく定義され、リバースゾーンファイルが適切に作成されることが保証され、一般的な設定エラーを防ぐことができます。
bind9 の設定を検証し、dig で DNS 解決をテストする
このステップでは、行ったすべての設定変更を検証し、ライブ DNS サーバーをテストします。設定を適用する前に構文エラーがないか設定ファイルを確認することは非常に重要です。なぜなら、間違いがあると bind9 サービスが正しく起動しなくなる可能性があるからです。検証が完了したら、dig ユーティリティを使用して DNS ルックアップを実行し、サーバーが期待どおりに機能していることを確認します。
まず、named-checkconf を使用して、メインの bind9 設定ファイルに構文エラーがないか確認します。このコマンドが出力を生成しない場合、設定ファイル(named.conf.local、named.conf.options など)は有効であることを意味します。
sudo named-checkconf
次に、フォワードルックアップゾーンファイルの構文を検証します。named-checkzone コマンドは、ゾーンファイルの正しさをチェックします。
sudo named-checkzone mylocaldomain.net /etc/bind/db.mylocaldomain.net
正常なチェックは、「OK」ステータスを返し、ゾーンファイルからシリアル番号を表示します。
zone mylocaldomain.net/IN: loaded serial 2024052001
OK
次に、リバースルックアップゾーンを検証します。ゾーン名とファイル名は VM の IP アドレスに依存するため、まず必要な情報を収集します。
IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
REV_IP=$(echo $IP | awk -F. '{print $3"."$2"."$1}')
ZONE_NAME="${REV_IP}.in-addr.arpa"
ZONE_FILE="/etc/bind/db.${REV_IP}"
これにより、VM の実際の IP アドレスに基づいて適切なゾーン名とファイルパスが作成されます。
次にゾーン検証コマンドを実行します。
echo "Checking reverse zone: ${ZONE_NAME}"
sudo named-checkzone ${ZONE_NAME} ${ZONE_FILE}
正常なチェックは、再び「OK」ステータスを表示します。
zone 50.16.172.in-addr.arpa/IN: loaded serial 2024052001
OK
再起動する前に、bind9 サービスがゾーンファイルを読み取れるように、適切な所有権を設定します。まず、IP 情報を再度取得して正しいファイルパスを構築します。
IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
REV_IP=$(echo $IP | awk -F. '{print $3"."$2"."$1}')
次に、両方のゾーンファイルに適切な所有権を設定します。
sudo chown root:bind /etc/bind/db.mylocaldomain.net "/etc/bind/db.${REV_IP}"
すべての設定が検証されたので、変更を適用するために bind9 サービスを再起動します。
sudo systemctl restart bind9
サービスが正しく起動し、新しいゾーンがロードされたことを確認するために、システムログを確認します。
sudo grep named /var/log/syslog | grep "loaded serial"
両方のゾーンが正常にロードされたことを確認する出力が表示されるはずです。出力には localhost のようなデフォルトゾーンも含まれますが、これは正常です。重要なのは、mylocaldomain.net とリバースゾーンの行を見つけることです。
... named[...]: zone mylocaldomain.net/IN: loaded serial 2025071401
... named[...]: zone 50.16.172.in-addr.arpa/IN: loaded serial 2025071401
...
これらの行が表示されない場合は、sudo systemctl status bind9 の出力を確認してエラーを確認してください。
最後に、dig を使用して DNS サーバーをテストします。@127.0.0.1 を指定して、ローカルサーバーに直接クエリを実行します。
まず、webserver.mylocaldomain.net のフォワードルックアップをテストします。
dig @127.0.0.1 webserver.mylocaldomain.net
出力の ANSWER SECTION を確認します。VM の IP アドレスを指す A レコードが表示され、重要なのは、ヘッダーの flags に権威ある回答を示す aa が含まれていることです。下部の SERVER 行は 127.0.0.1 を示す必要があります。
...
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ...
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;webserver.mylocaldomain.net. IN A
;; ANSWER SECTION:
webserver.mylocaldomain.net. 604800 IN A <your_vm_ip>
;; SERVER: 127.0.0.1#53(127.0.0.1)
...
次に、-x フラグを使用してリバースルックアップをテストします。まず、VM の IP アドレスをキャプチャします。
IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
次に、リバースルックアップテストを実行します。
dig @127.0.0.1 -x $IP
ANSWER SECTION には、IP をホスト名にマッピングする作成した PTR レコードが表示され、flags には再び aa が含まれている必要があります。
...
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ...
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;<last_octet>.<your_reversed_network_part>.in-addr.arpa. IN PTR
;; ANSWER SECTION:
<last_octet>.<your_reversed_network_part>.in-addr.arpa. 604800 IN PTR fileserver.mylocaldomain.net.
<last_octet>.<your_reversed_network_part>.in-addr.arpa. 604800 IN PTR ns1.mylocaldomain.net.
<last_octet>.<your_reversed_network_part>.in-addr.arpa. 604800 IN PTR webserver.mylocaldomain.net.
;; SERVER: 127.0.0.1#53(127.0.0.1)
...
おめでとうございます!基本的な権威 DNS サーバーを正常に設定、検証、テストしました。
まとめ
この実験では、bind9 ソフトウェアパッケージを使用して Linux 上でローカルの権威 DNS サーバーを構成しました。プロセスは、bind9 とその必須ユーティリティのインストールから始まり、次にグローバルな named.conf.options ファイルを編集して、外部ドメインクエリを解決するためのフォワーダーの設定など、サーバー全体の動作を定義しました。
その後、プライマリ DNS ゾーンを作成しました。ホスト名を A レコードを使用して IP アドレスにマッピングするための mylocaldomain.net のフォワードルックアップゾーンと、PTR レコードを使用して IP アドレスをホスト名にマッピングするための対応するリバースルックアップゾーンです。実験は、named-checkconf と named-checkzone を使用して設定エラーをチェックする重要な検証フェーズで締めくくられ、その後 dig ユーティリティでフォワードおよびリバースルックアップを成功させることで、ライブサーバーの機能をテストしました。



