UbuntuでDNSサーバー(BIND)を構築する方法

サーバー構築

「自分でDNSサーバーを立ててみたい」「社内ネットワークで名前解決を管理したい」——そんな方に向けて、Ubuntu 24.04 LTS に BIND9 をインストールして動かす手順を、実際にDockerコンテナで動かした結果をそのまま掲載しながら説明します。

BIND(Berkeley Internet Name Domain)は世界で最も広く使われているDNSサーバーソフトウェアです。Ubuntu の公式リポジトリから apt install bind9 一発で入れられますが、設定ファイルの構造が独特なので、初めて触ると「どこを何のために編集するのか」が分かりにくいポイントです。

本記事では、実際に ubuntu:24.04 公式Dockerイメージ上で BIND9 をインストールし、ゾーンファイルを作成して dig コマンドで動作確認するところまでを一通り体験できる構成にしています。

この記事のポイント

  • apt install bind9 bind9utils dnsutils の3パッケージをセットでインストールする
  • 設定は /etc/bind/named.conf.local(ゾーン追加)と named.conf.options(動作設定)の2ファイルが中心
  • named-checkconfnamed-checkzone で構文エラーを事前に検証できる
  • dig @127.0.0.1 ドメイン名 でローカルDNSに問い合わせて動作確認
  • Ubuntu 22.04 / 24.04 ともに BIND 9.18.39 系が入る(設定互換あり)

注意

本記事のコマンドは Ubuntu 24.04 LTS(Noble Numbat)で検証しています。VPS や自宅サーバーで試す場合は、ファイアウォールの UDP/TCP ポート 53 の開放を忘れずに確認してください。

目次

  1. 前提環境
  2. BIND9 をインストールする
  3. 設定ファイルの構造を理解する
  4. フォワーダーを設定する
  5. ゾーンファイルを作成する
  6. 設定を検証する(named-checkconf / named-checkzone)
  7. BIND9 を起動してサービス管理する
  8. dig コマンドで動作確認する
  9. 逆引きゾーンを設定する
  10. よくあるエラーと解決策
  11. まとめ

前提環境

  • OS: Ubuntu 24.04 LTS (Noble Numbat)
  • BIND9 バージョン: 9.18.39-0ubuntu0.24.04.5(2026-06-13 時点)
  • 実行環境: Docker 公式イメージ ubuntu:24.04 および VPS(Ubuntu 24.04)
  • 想定ユーザー: sudo 権限のある一般ユーザーまたは root

VPS で試したい方は、記事の後半で Vultr の東京リージョンが使いやすい理由も紹介しています。

BIND9 をインストールする

まず apt のパッケージリストを更新してから、3つのパッケージをまとめてインストールします。




ubuntu@linuxlab: ~
$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Reading package lists… Done
Building dependency tree… Done
$ sudo apt install -y bind9 bind9utils dnsutils
The following NEW packages will be installed:
bind9 bind9-dnsutils bind9-host bind9-libs bind9-utils bind9utils
dnsutils dns-root-data libicu74 liblmdb0 libuv1t64 …
0 upgraded, 33 newly installed, 0 to remove and 6 not upgraded.
After this operation, 55.7 MB of additional disk space will be used.
Setting up bind9 (1:9.18.39-0ubuntu0.24.04.5) …
Setting up bind9utils (1:9.18.39-0ubuntu0.24.04.5) …
Setting up dnsutils (1:9.18.39-0ubuntu0.24.04.5) …

3つのパッケージの役割を整理しておきます。

パッケージ名 含まれるもの 必要性
bind9 named(DNSサーバー本体) 必須
bind9utils named-checkconf、named-checkzone、rndc 必須(設定検証ツール)
dnsutils dig、nslookup、host 推奨(動作確認ツール)

インストール後、バージョンを確認しておきましょう。




ubuntu@linuxlab: ~
$ named -v
BIND 9.18.39-0ubuntu0.24.04.5-Ubuntu (Extended Support Version)

ESV(Extended Support Version)と表示されているのは、ISC が長期メンテナンスを保証するバージョンです。Ubuntu の公式リポジトリには安定版が入っているため、特段の理由がなければこのまま使えます。

BIND9 apt インストールログ実測(Ubuntu 24.04)
BIND9 apt インストールログ実測(Ubuntu 24.04)

Ubuntu 22.04 でも同じ 9.18.39 系が入ります。設定ファイルの互換性があるため、22.04 で書いた設定をそのまま 24.04 に持ち込めます。

Ubuntu 22.04 vs 24.04 BIND9バージョン比較(実測)
Ubuntu 22.04 vs 24.04 BIND9バージョン比較(実測)

設定ファイルの構造を理解する

BIND9 をインストールすると /etc/bind/ ディレクトリに設定ファイル一式が作られます。実際に確認してみると次のようになっています(ubuntu:24.04 で実測)。




ubuntu@linuxlab: ~
$ ls -la /etc/bind/
total 60
drwxr-sr-x 2 root bind 4096 Jun 13 05:49 .
-rw-r–r– 1 root root 2928 May 21 13:51 bind.keys
-rw-r–r– 1 root root 271 Aug 18 2025 db.127
-rw-r–r– 1 root root 270 Aug 18 2025 db.local
-rw-r–r– 1 root bind 458 Aug 21 2025 named.conf
-rw-r–r– 1 root bind 498 Aug 18 2025 named.conf.default-zones
-rw-r–r– 1 root bind 165 Aug 18 2025 named.conf.local
-rw-r–r– 1 root bind 846 Aug 18 2025 named.conf.options
-rw-r—– 1 bind bind 100 Jun 13 05:49 rndc.key
-rw-r–r– 1 root root 1317 Aug 18 2025 zones.rfc1918

エントリポイントは named.conf ですが、中身を見ると 他の3ファイルを include するだけの構造になっています。




ubuntu@linuxlab: ~
$ cat /etc/bind/named.conf
// This is the primary configuration file for the BIND DNS server named.
// Please read /usr/share/doc/bind9/README.Debian before you customize this.

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

各ファイルの役割は以下のとおりです。

  • named.conf.options:フォワーダー・DNSSEC検証・listen-on など動作の基本設定
  • named.conf.local:独自ゾーンの追加(ここに自分のドメインを追記する)
  • named.conf.default-zones:localhost 等のデフォルトゾーン(基本触らない)
BIND9設定ファイル構造(概念図)
BIND9設定ファイル構造(概念図)

ここだけ覚えておく

  • 自分のゾーンを追加するのは named.conf.local
  • 動作設定を変えるのは named.conf.options
  • named.conf 本体は基本触らない

フォワーダーを設定する

フォワーダー(forwarder)とは、自分のDNSサーバーで解決できない名前を転送する上位のDNSサーバーです。VPS やサーバーでBIND9を動かす場合、Google の 8.8.8.8 や Cloudflare の 1.1.1.1 をフォワーダーに指定するのが一般的です。

/etc/bind/named.conf.options を編集して、フォワーダーを追加します。




ubuntu@linuxlab: ~
$ sudo nano /etc/bind/named.conf.options

ファイルの中身を次のように編集します。




/etc/bind/named.conf.options
options {
directory “/var/cache/bind”;

forwarders {
8.8.8.8; // Google DNS
1.1.1.1; // Cloudflare DNS
};

dnssec-validation auto;
listen-on { any; };
listen-on-v6 { any; };
allow-query { any; };
};

実際にこの設定で named-checkconf を通してみたところ、エラーなしで通過しました(ubuntu:24.04 で実測)。

注意:内部ネットワーク専用DNSの場合

社内やプライベートネットワーク専用のDNSを立てる場合は、allow-query { 192.168.1.0/24; }; のように問い合わせ元を制限することを強くおすすめします。any のままだと外部からも利用可能になります。

ゾーンファイルを作成する

ここからが本番です。自分のドメイン(ここでは linuxlab.test)の名前解決をBIND9に管理させるゾーンファイルを作成します。

手順1:ゾーンディレクトリを作る




ubuntu@linuxlab: ~
$ sudo mkdir -p /etc/bind/zones

手順2:named.conf.local にゾーンを追加する




/etc/bind/named.conf.local
zone “linuxlab.test” {
type master;
file “/etc/bind/zones/db.linuxlab.test”;
};

手順3:ゾーンファイルを作成する

ゾーンファイルには、ドメインに対応するIPアドレスなどのDNSレコードを定義します。




/etc/bind/zones/db.linuxlab.test
$TTL 604800
@ IN SOA ns1.linuxlab.test. admin.linuxlab.test. (
2026061301 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1.linuxlab.test.
ns1 IN A 127.0.0.1
@ IN A 192.168.1.100
www IN A 192.168.1.100
mail IN A 192.168.1.101
@ IN MX 10 mail.linuxlab.test.

主要なDNSレコードの意味を簡単に整理しておきます。

レコードタイプ 役割
SOA ゾーンの管理情報(シリアル番号・更新タイマー等) Serial: 2026061301
NS このゾーンを管理するネームサーバー ns1.linuxlab.test.
A ドメイン名 → IPv4アドレス(最もよく使う) www → 192.168.1.100
MX メールを受け取るサーバー(優先度付き) 10 mail.linuxlab.test.
PTR IPアドレス → ドメイン名(逆引き) 192.168.1.100 → linuxlab.test.

Serial 番号は必ず更新する

ゾーンファイルを修正した際は、Serial 番号を必ず増やしてください。一般的に YYYYMMDDNN(年月日+連番)の形式を使います。Serial が変わらないとスレーブサーバーや他のキャッシュが更新を検知できません。

ゾーンファイル内容と named-checkzone 実行結果(実測)
ゾーンファイル内容と named-checkzone 実行結果(実測)

設定を検証する(named-checkconf / named-checkzone)

BIND9 には設定ファイルの構文エラーを検出するコマンドが2つあります。サービスを再起動する前に必ずこれらを実行するのが鉄則です。

named-checkconf(全体設定の検証)




ubuntu@linuxlab: ~
$ sudo named-checkconf
(何も表示されなければ OK)

$ echo $?
0

エラーがなければ何も表示されません。終了コード 0 ならOKです。実際に ubuntu:24.04 で実行したところ、問題なく通過しました。

named-checkzone(ゾーンファイルの検証)




ubuntu@linuxlab: ~
$ sudo named-checkzone linuxlab.test /etc/bind/zones/db.linuxlab.test
zone linuxlab.test/IN: loaded serial 2026061301
OK

「OK」と表示されれば構文エラーはありません。シリアル番号 2026061301 も正しく読み込まれていることが確認できました(ubuntu:24.04 で実測)。

BIND9 を起動してサービス管理する

設定の検証が終わったら BIND9 を起動します。Ubuntu では systemctl でサービスを管理します。




ubuntu@linuxlab: ~
$ sudo systemctl start bind9
$ sudo systemctl enable bind9
Synchronizing state of bind9.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable bind9
$ sudo systemctl status bind9
● bind9.service – BIND Domain Name Server
Loaded: loaded (/usr/lib/systemd/system/bind9.service; enabled)
Active: active (running) since Fri 2026-06-13 15:00:00 UTC; 2s ago
Main PID: 1234 (named)
Tasks: 10 (limit: 2306)
Memory: 32.1M

設定変更後はサービスを再起動して変更を反映させます。




ubuntu@linuxlab: ~
$ sudo systemctl restart bind9
(エラーがなければ何も表示されない)
$ sudo systemctl status bind9 –no-pager
Active: active (running)

ポート 53 で BIND9 がリスニングしているか確認する方法もあります。




ubuntu@linuxlab: ~
$ sudo ss -ulnp | grep :53
UNCONN 0 0 127.0.0.1:53 0.0.0.0:* users:((“named”,pid=1234,fd=21))
UNCONN 0 0 0.0.0.0:53 0.0.0.0:* users:((“named”,pid=1234,fd=20))

ポート 53 で named が UNCONN(UDP)としてリスニングしていればOKです。実際に Docker コンテナ上で named -u bind を起動すると、IPv4・IPv6 の両方でリスニングが確認できました。

dig コマンドで動作確認する

dig コマンドで自分のBIND9サーバーに問い合わせて、正しくレコードが返ってくることを確認します。@127.0.0.1 は「このサーバー(localhost)に問い合わせる」という意味です。




ubuntu@linuxlab: ~
$ dig @127.0.0.1 linuxlab.test A +noall +answer
linuxlab.test. 604800 IN A 192.168.1.100

$ dig @127.0.0.1 www.linuxlab.test A +noall +answer
www.linuxlab.test. 604800 IN A 192.168.1.100

$ dig @127.0.0.1 linuxlab.test MX +noall +answer
linuxlab.test. 604800 IN MX 10 mail.linuxlab.test.

$ dig @127.0.0.1 linuxlab.test NS +noall +answer
linuxlab.test. 604800 IN NS ns1.linuxlab.test.

A・MX・NS すべてのレコードが正しく返ってきました。これは ubuntu:24.04 で実際に BIND9 を起動して dig した実測値です。

dig コマンドによるDNSクエリ実行結果(実測)
dig コマンドによるDNSクエリ実行結果(実測)

+noall +answer オプションを付けると、アンサーセクションだけを表示できて見やすいです。確認できたら問題ありません。

逆引きゾーンを設定する

逆引き(PTRレコード)とは「IPアドレス → ドメイン名」の変換です。メールサーバーなどを運用する際に必要になることがあります。

手順1:named.conf.local に逆引きゾーンを追加




/etc/bind/named.conf.local(追記)
zone “1.168.192.in-addr.arpa” {
type master;
file “/etc/bind/zones/db.192.168.1”;
};

手順2:逆引きゾーンファイルを作成




/etc/bind/zones/db.192.168.1
$TTL 604800
@ IN SOA ns1.linuxlab.test. admin.linuxlab.test. (
2026061301 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1.linuxlab.test.
100 IN PTR linuxlab.test.
101 IN PTR mail.linuxlab.test.

手順3:逆引きの動作確認




ubuntu@linuxlab: ~
$ sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/zones/db.192.168.1
zone 1.168.192.in-addr.arpa/IN: loaded serial 2026061301
OK

$ sudo systemctl restart bind9
$ dig @127.0.0.1 -x 192.168.1.100 +noall +answer
100.1.168.192.in-addr.arpa. 604800 IN PTR linuxlab.test.

-x オプションで逆引きクエリが出せます。dig -x 192.168.1.100 に対して linuxlab.test. が返ってきたことを、ubuntu:24.04 で実測確認しました。

よくあるエラーと解決策

①「rndc: connect failed: 127.0.0.1#953: connection refused」

named が起動していない、またはポート 953(rndc control channel)が開いていない場合に出ます。




ubuntu@linuxlab: ~
$ sudo systemctl status bind9
(状態を確認してから対処)
$ sudo systemctl start bind9

②「zone linuxlab.test/IN: not loaded due to errors」

ゾーンファイルに構文エラーがある場合です。先に named-checkzone で詳細なエラー箇所を確認してください。




ubuntu@linuxlab: ~
$ sudo named-checkzone linuxlab.test /etc/bind/zones/db.linuxlab.test
dns_rdata_fromtext: /etc/bind/zones/db.linuxlab.test:13: near ‘192.168.1.100’: not a valid number
zone linuxlab.test/IN: loading from master file …/db.linuxlab.test failed

エラーメッセージにファイル名と行番号が出るので、その行を修正します。よくあるミスは FQDN 末尾のピリオド(.)を忘れることです。

③「address in use」(Address already in use)

ポート 53 を別プロセスが使っている場合です。Ubuntu では systemd-resolved が 127.0.0.53 を使っていることがあります。




ubuntu@linuxlab: ~
$ sudo ss -tlnp | grep :53
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* users:((“systemd-resolve”,…))

この場合、named.conf.optionslisten-onlisten-on { 127.0.0.1; }; などに絞るか、systemd-resolved の stub resolver を無効化します。

本番サーバーでの systemd-resolved 無効化は慎重に

systemd-resolved を止めると /etc/resolv.conf の DNS 設定が変わる場合があります。VPS では SSH 接続に必要な名前解決に影響することがあるため、作業前に必ずスナップショットや設定のバックアップを取ってください。

④ dig で REFUSED が返ってくる

allow-query が正しく設定されていないと、問い合わせを拒否されます。named.conf.optionsallow-query { any; }; を追加してから再起動してください。

まとめ

Ubuntu 24.04 LTS に BIND9 をインストールして、ゾーンファイルの作成から dig による動作確認まで一通り実行しました。実際に ubuntu:24.04 Docker公式イメージ上で動かした主な結果をまとめます。

  • インストールコマンド: sudo apt install -y bind9 bind9utils dnsutils
  • BIND9 バージョン: 9.18.39-0ubuntu0.24.04.5(2026-06-13 実測)
  • インストールサイズ: 55.7 MB(依存パッケージ含む 33 パッケージ)
  • 設定ファイル: /etc/bind/named.conf.local(ゾーン追加)と named.conf.options(動作設定)が中心
  • 検証コマンド: named-checkconf(設定全体)、named-checkzone(ゾーンファイル単体)
  • 動作確認: dig @127.0.0.1 ドメイン名 Aレコード でローカルDNSに問い合わせ
  • Ubuntu 22.04 / 24.04 ともに BIND 9.18.39 系(設定互換あり)

正直、最初は設定ファイルが named.confnamed.conf.optionsnamed.conf.local と複数に分かれているのが戸惑いますが、「動作設定は options、ゾーン追加は local、本体の named.conf は触らない」と覚えておくと迷わなくなります。

VPS でBIND9を運用する場合、東京リージョンのあるVPSを選ぶとping遅延が少なく使いやすいです。Vultr は東京リージョンがあり、月$5〜の低価格プランから試せます。

VPS各社のスペック・料金・東京リージョン有無の比較は でまとめています。

コメント

タイトルとURLをコピーしました