「自分で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-checkconfとnamed-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 の開放を忘れずに確認してください。
目次
- 前提環境
- BIND9 をインストールする
- 設定ファイルの構造を理解する
- フォワーダーを設定する
- ゾーンファイルを作成する
- 設定を検証する(named-checkconf / named-checkzone)
- BIND9 を起動してサービス管理する
- dig コマンドで動作確認する
- 逆引きゾーンを設定する
- よくあるエラーと解決策
- まとめ
前提環境
- 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つのパッケージをまとめてインストールします。
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 | 推奨(動作確認ツール) |
インストール後、バージョンを確認しておきましょう。
BIND 9.18.39-0ubuntu0.24.04.5-Ubuntu (Extended Support Version)
ESV(Extended Support Version)と表示されているのは、ISC が長期メンテナンスを保証するバージョンです。Ubuntu の公式リポジトリには安定版が入っているため、特段の理由がなければこのまま使えます。

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

設定ファイルの構造を理解する
BIND9 をインストールすると /etc/bind/ ディレクトリに設定ファイル一式が作られます。実際に確認してみると次のようになっています(ubuntu:24.04 で実測)。
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 するだけの構造になっています。
// 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 等のデフォルトゾーン(基本触らない)

ここだけ覚えておく
- 自分のゾーンを追加するのは
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 を編集して、フォワーダーを追加します。
ファイルの中身を次のように編集します。
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:ゾーンディレクトリを作る
手順2:named.conf.local にゾーンを追加する
type master;
file “/etc/bind/zones/db.linuxlab.test”;
};
手順3:ゾーンファイルを作成する
ゾーンファイルには、ドメインに対応するIPアドレスなどのDNSレコードを定義します。
@ 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-checkconf / named-checkzone)
BIND9 には設定ファイルの構文エラーを検出するコマンドが2つあります。サービスを再起動する前に必ずこれらを実行するのが鉄則です。
named-checkconf(全体設定の検証)
(何も表示されなければ OK)
$ echo $?
0
エラーがなければ何も表示されません。終了コード 0 ならOKです。実際に ubuntu:24.04 で実行したところ、問題なく通過しました。
named-checkzone(ゾーンファイルの検証)
zone linuxlab.test/IN: loaded serial 2026061301
OK
「OK」と表示されれば構文エラーはありません。シリアル番号 2026061301 も正しく読み込まれていることが確認できました(ubuntu:24.04 で実測)。
BIND9 を起動してサービス管理する
設定の検証が終わったら BIND9 を起動します。Ubuntu では systemctl でサービスを管理します。
$ 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
設定変更後はサービスを再起動して変更を反映させます。
(エラーがなければ何も表示されない)
$ sudo systemctl status bind9 –no-pager
Active: active (running)
ポート 53 で BIND9 がリスニングしているか確認する方法もあります。
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)に問い合わせる」という意味です。
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 した実測値です。

+noall +answer オプションを付けると、アンサーセクションだけを表示できて見やすいです。確認できたら問題ありません。
逆引きゾーンを設定する
逆引き(PTRレコード)とは「IPアドレス → ドメイン名」の変換です。メールサーバーなどを運用する際に必要になることがあります。
手順1:named.conf.local に逆引きゾーンを追加
type master;
file “/etc/bind/zones/db.192.168.1”;
};
手順2:逆引きゾーンファイルを作成
@ 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:逆引きの動作確認
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)が開いていない場合に出ます。
(状態を確認してから対処)
$ sudo systemctl start bind9
②「zone linuxlab.test/IN: not loaded due to errors」
ゾーンファイルに構文エラーがある場合です。先に named-checkzone で詳細なエラー箇所を確認してください。
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 を使っていることがあります。
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* users:((“systemd-resolve”,…))
この場合、named.conf.options の listen-on を listen-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.options に allow-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.conf・named.conf.options・named.conf.local と複数に分かれているのが戸惑いますが、「動作設定は options、ゾーン追加は local、本体の named.conf は触らない」と覚えておくと迷わなくなります。
VPS でBIND9を運用する場合、東京リージョンのあるVPSを選ぶとping遅延が少なく使いやすいです。Vultr は東京リージョンがあり、月$5〜の低価格プランから試せます。
VPS各社のスペック・料金・東京リージョン有無の比較は でまとめています。


コメント