この記事の位置づけ
内部 DNS を BIND で構成する記事です。LAN 内の名前解決、再帰問い合わせ、内部向けゾーンを整理し、DHCP や hosts ファイルとの役割分担を確認します。
Ubuntu 22.04 で BIND を使い、内部ネットワーク向け DNS サーバーを構築する手順です。内部 DNS は、サーバー、LDAP、メール、Web、Kubernetes などを内部名で扱うための名前解決基盤です。
この記事では、内部向けの権威ゾーンと再帰問い合わせを扱います。外部公開 DNS とは責務を分け、内部ネットワークからだけ再帰問い合わせを受ける構成として BIND を設定します。
allow-recursion、allow-query-cache、待ち受け範囲を内部ネットワークに限定します。この記事で扱う内容は次の通りです。
- 内部 DNS と外部 DNS の責務分離
- BIND のインストール
- 内部ネットワークに限定した再帰問い合わせ
- 内部正引きゾーンと逆引きゾーンの作成
named-checkconf/named-checkzone/digによる確認
| 対象 OS | Ubuntu 22.04 |
|---|---|
| サービス | bind9.service |
| 用途 | 内部名前解決、内部ゾーン管理、内部向け再帰問い合わせ |
| 設定ファイル | /etc/bind/named.conf.options, /etc/bind/named.conf.local |
| 検査コマンド | named-checkconf, named-checkzone, dig |
dig による確認を行う次に読む記事
書籍
DNS がよくわかる教科書 第 2 版
DNS の基本、名前解決、権威 DNS、キャッシュ DNS、DNSSEC などを体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
内部 DNS の位置づけ
内部 DNS は、内部ホスト名や内部サービス名を解決するための基盤です。外部公開 DNS と同じ BIND を使うことはできますが、公開する情報、問い合わせを許可する相手、再帰問い合わせの扱いは別物です。
| 要素 | 役割 |
|---|---|
| 内部 DNS | 内部ホスト名、内部サービス名、逆引きを解決する |
| 外部 DNS | インターネットから参照される公開レコードを管理する |
| 権威 DNS | 自分が管理するゾーンの正しい答えを返す |
| キャッシュ DNS | 他の DNS へ問い合わせた結果をキャッシュする |
| split-horizon | 同じ名前でも内部と外部で異なる答えを返す設計 |
メール、証明書、LDAP、Kubernetes、監視などは名前解決に依存します。内部 DNS は地味ですが、他の基盤を安定させる前提になります。
BIND をインストールする
BIND と確認用の DNS ツールをインストールします。
sudo apt update
sudo apt install -y bind9 bind9-utils dnsutilsサービスの状態を確認します。
systemctl status bind9.service --no-pager内部向けの options を設定する
内部 DNS では、再帰問い合わせを内部ネットワークに限定します。次の例では、IPv4 の 10.1.0.0/16 と IPv6 の fd00::/8 を内部ネットワークとして扱います。
sudo cp /etc/bind/named.conf.options /etc/bind/named.conf.options.bak.$(date +%Y%m%d%H%M%S)
sudo tee /etc/bind/named.conf.options >/dev/null <<'EOF'
acl internal_networks {
127.0.0.0/8;
::1/128;
10.1.0.0/16;
fd00::/8;
};
options {
directory "/var/cache/bind";
recursion yes;
allow-query { internal_networks; };
allow-recursion { internal_networks; };
allow-query-cache { internal_networks; };
listen-on { 127.0.0.1; 10.1.0.10; };
listen-on-v6 { ::1; fd00::a01:10; };
forwarders {
1.1.1.1;
8.8.8.8;
};
dnssec-validation auto;
auth-nxdomain no;
};
EOFallow-query は問い合わせを許可する相手、allow-recursion は再帰問い合わせを許可する相手、allow-query-cache はキャッシュ応答を許可する相手です。内部 DNS では、これらを内部ネットワークに絞ります。
内部ゾーンを定義する
named.conf.local に内部向けゾーンを定義します。ここでは example.internal を正引きゾーン、10.1.0.0/24 を逆引きゾーンとして扱います。
sudo cp /etc/bind/named.conf.local /etc/bind/named.conf.local.bak.$(date +%Y%m%d%H%M%S)
sudo tee /etc/bind/named.conf.local >/dev/null <<'EOF'
zone "example.internal" {
type master;
file "/etc/bind/zones/db.example.internal";
allow-query { internal_networks; };
};
zone "0.1.10.in-addr.arpa" {
type master;
file "/etc/bind/zones/db.10.1.0";
allow-query { internal_networks; };
};
EOFゾーンファイルを置くディレクトリを作成します。
sudo mkdir -p /etc/bind/zones正引きゾーンを作成する
内部ホスト名を解決する正引きゾーンを作成します。
sudo tee /etc/bind/zones/db.example.internal >/dev/null <<'EOF'
$TTL 3600
@ IN SOA ns1.example.internal. admin.example.internal. (
2026061701
3600
900
604800
3600 )
@ IN NS ns1.example.internal.
ns1 IN A 10.1.0.10
ns1 IN AAAA fd00::a01:10
mail IN A 10.1.0.25
mail IN AAAA fd00::a01:25
web IN A 10.1.0.30
web IN AAAA fd00::a01:30
EOFSOA のシリアル値は、ゾーンを変更するたびに増やします。日付形式にしておくと管理しやすくなります。
逆引きゾーンを作成する
ログやメールサーバー、監視で逆引きが必要になる場合があります。内部 DNS でも、主要サーバーの PTR を用意しておくと運用しやすくなります。
sudo tee /etc/bind/zones/db.10.1.0 >/dev/null <<'EOF'
$TTL 3600
@ IN SOA ns1.example.internal. admin.example.internal. (
2026061701
3600
900
604800
3600 )
@ IN NS ns1.example.internal.
10 IN PTR ns1.example.internal.
25 IN PTR mail.example.internal.
30 IN PTR web.example.internal.
EOF設定を検査する
設定ファイルとゾーンファイルを検査します。
sudo named-checkconf
sudo named-checkzone example.internal /etc/bind/zones/db.example.internal
sudo named-checkzone 0.1.10.in-addr.arpa /etc/bind/zones/db.10.1.0問題がなければ BIND を再起動します。
sudo systemctl restart bind9.service
systemctl status bind9.service --no-pager名前解決を確認する
dig で正引き、逆引き、再帰問い合わせを確認します。
dig @127.0.0.1 ns1.example.internal A
dig @127.0.0.1 mail.example.internal AAAA
dig @127.0.0.1 -x 10.1.0.25
dig @127.0.0.1 www.iana.org A外部名の問い合わせが成功する場合、再帰問い合わせが動作しています。これが内部クライアントからだけ許可されることが重要です。
open resolver ではないことを確認する
許可していない外部ネットワークから、再帰問い合わせができないことを確認します。確認は、内部ネットワーク外の端末から行います。
dig @dns.example.com www.iana.org A許可外の端末から外部名を再帰解決できる場合は、allow-recursion、allow-query-cache、ファイアウォール、待ち受けアドレスを見直します。
運用上の注意
- 内部 DNS と外部 DNS のゾーン責務を混ぜない
- 再帰問い合わせは内部ネットワークだけに許可する
- ゾーン変更時はシリアルを更新する
- 正引きと逆引きの対応を維持する
- IPv4 と IPv6 のレコードを同時に確認する
- メール、証明書、LDAP、監視の名前解決に影響することを意識する
メール基盤では、内部 DNS の名前解決が Postfix や Dovecot の到達性に影響します。内部向け Postfix は Ubuntu 22.04 Postfix 内部向けメールサーバー で扱っています。
まとめ
Ubuntu 22.04 で BIND を内部 DNS として使う場合は、内部向けの権威ゾーンと再帰問い合わせの範囲を分けて考えます。内部ホスト名を返すだけでなく、再帰問い合わせをどのネットワークに許可するかが重要です。
allow-query、allow-recursion、allow-query-cache を内部ネットワークに限定し、named-checkconf、named-checkzone、dig で確認します。内部 DNS は、メール、証明書、認証、監視など多くの基盤に影響するため、単独の設定ではなく運用基盤として扱うのが良いです。

