初めに #
DNSサーバーは、現代のインターネットを支える基盤技術のひとつです。
私たちが日常的に利用している Web サイトへのアクセスや、メールの送受信といった通信の多くは、DNS による名前解決機能によって成り立っています。
しかし、AWS Route 53 や GCP Cloud DNS といった高性能なクラウド DNS サービスの普及により、権威 DNS サーバーを自前で構築・運用する機会は、減少傾向にあります。
一方で、オンプレミス環境での運用や独自インフラの構築、DNS の仕組みを理解するための学習用途など、クラウドに依存しない DNS サーバーを構築したい場面も今なお存在します。
また、近年ではデータ主権やセキュリティ、法令遵守の観点から国産サービスや国内環境を選択する動きも広がっており、自前でインフラを構築・管理する重要性があらためて注目されています。
こうした背景を踏まえて、本記事では最新の AlmaLinux 10 環境にて Knot DNS を利用し、権威 DNS サーバーを構築する方法を、初心者の方に向けて解説します。
Knot DNS とは #
Knot DNS は、チェコのドメインレジストリである CZ.NIC によって開発されている、OSS(オープンソース)の 権威 DNS サーバー です。
再帰的な名前解決機能は持たず、権威 DNS サーバーとしての機能に特化しています。
そのため、キャッシュ DNS サーバーやフォワーダとしては動作しません。
Knot DNS は 高パフォーマンスかつ高効率に設計されており、広く利用されている BIND と比較しても、高速に動作するとされています。
また、設定ファイルはシンプルな書き方になっており、DNS サーバーを初めて構築する場合でも、無理なく扱うことができます。
Knot DNS のインストール #
Knot DNS のインストール方法には、EPEL リポジトリからインストールする方法と、Copr リポジトリを利用する方法の2通りがあります。
このうち、初心者の方には EPEL リポジトリを利用する方法がおすすめです。
EPEL は Fedora Project によって提供されている、Enterprise Linux 向けの追加パッケージリポジトリとなっており、高い安定性と信頼性を備えた、準公式的な位置づけのリポジトリとなっています。
初めに次のコマンドを実行し EPEL を有効化してください。
すでに有効になっている場合は、この作業は不要です。
dnf install epel-release
続いて、Knot DNS の本体および関連パッケージのインストールを行います。
次のコマンドを実行してください。
dnf install knot
実行すると、以下のようにインストールパッケージの確認画面が表示されます。
dnf install knot
Extra Packages for Enterprise Linux 10 - x86_64 5.3 MB/s | 5.6 MB 00:01
Last metadata expiration check: 0:00:04 ago on Sun 14 Dec 2025 12:46:27 PM JST.
Dependencies resolved.
=======================================================================================================================================================================
Package Architecture Version Repository Size
=======================================================================================================================================================================
Installing:
knot x86_64 3.4.8-1.el10_1 epel 709 k
Installing dependencies:
knot-libs x86_64 3.4.8-1.el10_1 epel 416 k
libxdp x86_64 1.5.5-1.el10_0 appstream 66 k
Transaction Summary
=======================================================================================================================================================================
Install 3 Packages
Total download size: 1.2 M
Installed size: 4.1 M
Is this ok [y/N]:
内容を確認し問題なければ y を入力してインストールを進めてください。
EPEL リポジトリを初めて利用する場合は、GPG キーのインポート確認が表示されます。
先ほど同様に y を入力して続行してください。
Total 655 kB/s | 1.2 MB 00:01
Extra Packages for Enterprise Linux 10 - x86_64 1.6 MB/s | 1.6 kB 00:00
Importing GPG key 0xE37ED158:
Userid : "Fedora (epel10) <epel@fedoraproject.org>"
Fingerprint: 7D8D 15CB FC4E 6268 8591 FB26 33D9 8517 E37E D158
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-10
Is this ok [y/N]:
インストールが完了すると、次のメッセージが表示されます。
Complete!
以下のコマンドを実行することで、パッケージの導入有無を確認することができます。
rpm -qa |grep "knot"
knot-libs-3.4.8-1.el10_1.x86_64
上記のようにパッケージ情報が表示されれば、Knot DNS のインストールは完了となります。
ゾーンファイルの作成 #
DNS では、利用するドメイン名に関する情報を 「ゾーン」 と呼びます。
その内容はファイルとして管理されることもあれば、実装によってはデータベースなどで管理される場合もあります。
Knot DNS では、これらのゾーン情報をファイルとして定義します。
ここからは、Knot DNS で管理するゾーン情報を作成していきます。
1.ディレクトリの作成 #
ゾーンファイルは任意のディレクトリに配置することができます。
配置先のディレクトリは、後述する knot.conf の設定項目で指定する必要があります。
本記事では、公式ドキュメントの例に従い、/var/lib/knot/zones/ をゾーンファイルの配置先として使用します。
以下のコマンドを実行しディレクトリを作成してください。
mkdir -p /var/lib/knot/zones/
2.ゾーンファイルの作成 #
次にゾーンファイルの作成を行ないます。
今回は例として example.com のゾーンファイルを作成します。
以下のコマンドを実行し先ほど作成したディレクトリにゾーンファイルを作成してください
vi /var/lib/knot/zones/example.com.zone
続いて、作成したファイルに以下の内容を記述してください。
$ORIGIN example.com.
$TTL 86400
@ IN SOA ns1.example.com. hostmaster.example.com. (
2025121401 ; Serial
10800 ; Refresh
3600 ; Retry
604800 ; Expire
3600 ; Negative Cache TTL
)
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
@ IN A 192.0.2.10
www IN A 192.0.2.10
ns1 IN A 192.0.2.11
ns2 IN A 192.0.2.12
このゾーンファイルでは、ドメインに関する DNS 情報を定義しています。
ゾーンファイルの冒頭にある $ORIGIN および $TTL は、このファイル全体の基本ルールを定めています。
| 項目 | 設定値 | 内容 |
|---|---|---|
$ORIGIN |
example.com. |
このゾーンファイルで扱うドメイン名 |
$TTL |
86400 |
レコードのキャッシュ時間(秒) |
以降の設定はレコード情報を記述しています。
設定内容は以下の通りとなります。
| 設定項目 | 名前 | 値 | 内容 |
|---|---|---|---|
| SOA | ― | ― | ゾーン全体の管理情報を定義 |
| NS | ns1.example.com. |
― | プライマリネームサーバー |
| NS | ns2.example.com. |
― | セカンダリネームサーバー |
| A | example.com |
192.0.2.10 |
ドメイン本体の IP アドレス |
| A | www.example.com |
192.0.2.10 |
Web サイト用 |
| A | ns1.example.com |
192.0.2.11 |
ネームサーバー 1 |
| A | ns2.example.com |
192.0.2.12 |
ネームサーバー 2 |
3.設定ファイル編集 #
続いて、Knot DNSのメイン設定ファイルである /etc/knot/knot.conf を編集し、先ほど作成したゾーンファイルを利用するように設定します。
初めに以下のコマンドを実行しバックアップを作成してください。
今回はわかりやすく knot.conf.bk としてバックアップを作成します。
cp -a /etc/knot/knot.conf /etc/knot/knot.conf.bk
次に以下のコマンドを実行し編集を行なってください。
vi /etc/knot/knot.conf
ファイルに以下の内容を記述してください。
server:
rundir: "/run/knot"
user: knot:knot
automatic-acl: on
listen: [ 0.0.0.0@53 ]
log:
- target: syslog
any: info
database:
storage: "/var/lib/knot"
zone:
- domain: example.com
storage: "/var/lib/knot/zones/"
file: "%s.zone"
以下のセクションでは、サーバー全体の設定を行っています。
Knot DNS の動作に必要なソケットファイルや PID ファイルのディレクトリ、実行するユーザー、待ち受ける IP アドレスとポートなどを指定しています。
server:
rundir: "/run/knot"
user: knot:knot
automatic-acl: on
listen: [ 0.0.0.0@53 ]
以下のセクションでは Knot DNS のログ出力先やレコードデータの保存場所を設定しています。
log:
- target: syslog
any: info
database:
storage: "/var/lib/knot"
以下のセクションでは実際に管理するゾーン(ドメイン)ごとの設定を行なっています。
ドメイン数が多くなる場合は template セクションを利用し、ゾーンごとの設定を共通化する事で効率的に管理を行う事ができます。
zone:
- domain: example.com
storage: "/var/lib/knot/zones/"
file: "%s.zone"
4.権限の設定 #
Knot DNS はセキュリティ上の理由から、管理者(root)ではなく専用ユーザーである knot を利用し実行することが推奨されています。
そのため、ゾーンファイルや設定ファイルが knot ユーザーから読み書き可能である必要があります。
以下のコマンドを実行して必要ファイルの権限を設定してください。
chown -R knot:knot /var/lib/knot/zones
chown -R knot:knot /etc/knot/
5.設定の文法チェック #
設定が完了したら、以下のコマンドを実行し内容に問題がないか構文チェック(シンタックスチェック)を行ってください。
knotc conf-check
問題がなければ、次のようなメッセージが表示されます。
Configuration is valid
ファイアウォールの設定 #
DNS サーバーを運用する場合、外部からの DNS クエリを受け付けられるように、53 番ポートを開放する必要があります。
なお、本手順はサーバーのファイアウォール管理ツールとして firewalld が稼働している環境を前提としています。
利用環境に合わせて手順を調整し進めてください。
DNS は UDP と TCP の両方で通信を行うため、以下のコマンドを順に実行してください。
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=53/udp
どちらのコマンドも実行結果が success と表示されれば成功となります。
--permanent で変更した設定を反映させるために以下のコマンドを実行しリロードしてください。
firewall-cmd --reload
こちらも実行結果が success と表示されれば成功となります。
DNSサーバーの起動 #
各種設定や権限の確認が完了したら、Knot DNS サーバーを起動する事ができます。
以下のコマンドにてサービスと自動起動を有効化する事ができます。
systemctl enable --now knot
次に以下のコマンドを実行し、サービスの起動確認を行ってください。
systemctl is-active knot
以下のように表示されれば、サービスが正常に稼働しています。
active
動作確認 #
サービスの起動が完了したら、dig コマンドを利用し DNS が正しく応答しているか確認してください。
今回はサンプル用のドメインを利用しているためドメイン登録情報(Whois)を利用せず、直接サーバーを指定し名前解決の確認を行います。
確認を行うには以下のコマンドを実行してください。
dig @<サーバーIP> example.com +short
以下のようにゾーンファイルに設定した IP アドレスが返答されていれば成功です。
192.0.2.10
本番環境にて利用する場合 #
今回の手順は、学習やテスト、個人利用向けのシングルサーバー構成となります。
本番環境での安定運用を目的とする場合は、以下のような追加対策が必要となります。
| 項目 | 内容 |
|---|---|
| 冗長化構成 | 複数の権威 DNS サーバーを用意し、障害時もサービスが継続できるようにする |
| セキュリティ対策 | DDoS 対策やアクセス制御、不要なポートの閉鎖など |
| 監視とログ管理 | DNS クエリの監視や異常検知、ログの定期的な確認 |
| バックアップ | ゾーンファイルや設定ファイルの定期的なバックアップ |