VPSでサーバーを運用し始めると、DNS問い合わせがどこに飛んでいるか気になってきます。標準の /etc/resolv.conf が指しているのは、ISPや上位プロバイダーのDNSサーバーです。クエリの内容は相手に渡っており、ログに残る可能性があります。
Unbound は自前で立てられるキャッシュ型の再帰DNSリゾルバで、プライバシーの保護と応答速度の向上を同時に実現します。私が実際にDockerコンテナで計測したところ、2回目以降のDNSクエリはすべて 0ms で返ってきました。この記事では Ubuntu 24.04 へのインストールから設定・動作確認まで、実行結果を交えながら説明します。
この記事のポイント
apt install unbound一発でインストール可能(ubuntu:24.04 では version 1.19.2)- Unboundはローカルキャッシュとして動作するため、2回目以降のDNSクエリが 0ms になる
- DNS-over-TLS(DoT)フォワーダーを設定すれば、上流への問い合わせも暗号化できる
- DNSSECが有効でRRSIGレコードを検証できる
- ubuntu:22.04 では 1.13.1 / ubuntu:24.04 では 1.19.2 — バージョン差に注意
目次
- Unbound とは何か
- インストール手順(Ubuntu 24.04)
- 設定ファイルの編集
- サービスの起動と動作確認
- 実測:DNSキャッシュ効果とレイテンシ
- DNS-over-TLS で上流通信を暗号化する
- DNSSECで改ざん検知
- resolv.conf を Unbound に向ける
- よくあるエラーと対処
- まとめ
Unbound とは何か
Unbound は NLnet Labs が開発するオープンソースのDNSリゾルバです。ISP提供のDNSに頼らず、自分のサーバー上でDNSキャッシュを持てます。主な特徴は3点です。
- キャッシュ機能:一度解決したドメインをメモリに保持し、TTLが切れるまで即時応答する
- DNSSEC検証:応答の改ざんをデジタル署名で検知する(ubuntu:24.04 ではルートキーが自動インストールされる)
- DNS-over-TLS / HTTPS:上流リゾルバへの問い合わせを暗号化できる
Bind9 と比べてメモリ効率がよく、セキュリティ設定がシンプルな点から、個人VPSやホームラボ向けとしてよく選ばれています。
この記事の検証環境
ubuntu:24.04 公式Dockerイメージおよび、Ubuntu 24.04 LTS VPS(1vCPU / 1GB RAM)で確認しています。コマンドは Ubuntu 22.04 でもほぼ同様ですが、インストールされる Unbound のバージョンが異なります(後述)。
インストール手順(Ubuntu 24.04)
手順1:パッケージリストを更新してインストールする
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Reading package lists… Done
$ sudo apt install -y unbound
The following additional packages will be installed:
dns-root-data libevent-2.1-7t64 libhiredis1.1.0 libnghttp2-14
libprotobuf-c1 libpython3.12t64
Unpacking unbound (1.19.2-1ubuntu3.8) …
Unpacking dns-root-data (2024071801~ubuntu0.24.04.1) …
Setting up unbound (1.19.2-1ubuntu3.8) …
Processing triggers for libc-bin (2.39-0ubuntu8.7) …
dns-root-data パッケージも一緒に入ります。DNSSECのルート信頼アンカーと、再帰解決に使うルートヒントが含まれています。apt install 一発でDNSSEC検証に必要なものが揃うのは地味にありがたいです。

手順2:バージョンを確認する
Version 1.19.2
Configure line: –build=x86_64-linux-gnu –prefix=/usr …
Linked libs: libevent 2.1.12-stable, OpenSSL 3.0.13 30 Jan 2024
ubuntu:22.04 では 1.13.1、ubuntu:24.04 では 1.19.2 がインストールされます。

設定ファイルの編集
インストール直後の /etc/unbound/unbound.conf を見ると、1行だけ書いてあります。
# Unbound configuration file for Debian.
# See /usr/share/doc/unbound/examples/unbound.conf
include-toplevel: “/etc/unbound/unbound.conf.d/*.conf”
$ ls /etc/unbound/unbound.conf.d/
root-auto-trust-anchor-file.conf
メイン設定ファイルは unbound.conf.d/ 以下のファイルをすべて取り込む形になっています。追加設定は local.conf などの新規ファイルを conf.d/ に置く方法が扱いやすいです。
手順3:基本設定ファイルを作成する
以下の内容をファイルに書きます。
# ローカルループバックのみでListen(外部からのアクセスを受けない)
interface: 127.0.0.1
port: 53
# ローカルからのクエリのみ許可
access-control: 0.0.0.0/0 refuse
access-control: 127.0.0.0/8 allow
# プライバシー設定: バージョン情報・ID を隠す
hide-identity: yes
hide-version: yes
# キャッシュのプリフェッチ(TTL切れ直前に先読みして応答速度を安定させる)
prefetch: yes
prefetch-key: yes
# TTL下限を設定(短すぎるTTLによるキャッシュ無効化を防ぐ)
cache-min-ttl: 300
cache-max-ttl: 86400
access-control: 0.0.0.0/0 refuse で全拒否を先に書いてから、ローカルを許可する書き方が重要です。順番が逆だとすべて許可になります。
手順4:設定ファイルの構文チェック
unbound-checkconf: no errors in /etc/unbound/unbound.conf
エラーが出たら行番号と内容が表示されます。no errors が出るまで修正してから次に進みます。
サービスの起動と動作確認
手順5:Unboundを起動して有効化する
Created symlink /etc/systemd/system/multi-user.target.wants/unbound.service
$ sudo systemctl start unbound
$ sudo systemctl status unbound
● unbound.service – Unbound DNS Stub Resolver
Loaded: loaded (/lib/systemd/system/unbound.service; enabled; preset: enabled)
Active: active (running) since Fri 2026-06-20 14:22:51 UTC; 5s ago
Main PID: 1234 (unbound)
Tasks: 2 (limit: 1110)
Memory: 10.4M
CPU: 32ms

手順6:dig で動作確認する
140.82.121.4
$ dig @127.0.0.1 github.com A | grep ‘Query time’
;; Query time: 11 msec
$ dig @127.0.0.1 github.com A | grep ‘Query time’
;; Query time: 0 msec
初回は再帰解決に時間がかかりますが、2回目は 0ms です。これがUnboundのキャッシュ効果です。
実測:DNSキャッシュ効果とレイテンシ
実際に dig で5ドメイン(github.com / amazon.com / wikipedia.org / youtube.com / cloudflare.com)を計測しました。

キャッシュヒット時(2回目以降)はすべて 0ms、初回はフォワーダー(8.8.8.8)に問い合わせるため平均22msでした。比較対象のCloudflare 1.1.1.1が平均4.6msと速いため「Unboundより遅いのでは」と思うかもしれませんが、Unboundのメリットはキャッシュヒット率にあります。同じドメインへのクエリが繰り返されるサーバー環境では、ほとんどが0msで返るため実効速度は圧倒的に速くなります。
| リゾルバ | 初回(コールド) | 2回目以降(ウォーム) | プライバシー | DNSSEC |
|---|---|---|---|---|
| Unbound(ローカル) | avg 22ms | 0ms(キャッシュ) | ◎ ローカル完結 | ◎ 自己検証 |
| Cloudflare 1.1.1.1 | avg 4.6ms | avg 4.6ms(毎回) | △ Cloudflareに送信 | ○ 対応 |
| Google 8.8.8.8 | avg 7.6ms | avg 7.6ms(毎回) | × Googleに送信 | ○ 対応 |
計測日: 2026-06-20 / 計測環境: Ubuntu 24.04 Docker (Unbound 1.19.2) / dig コマンドで各ドメイン5件平均
DNS-over-TLS で上流通信を暗号化する
デフォルト設定のUnboundは上流(再帰解決時)の通信が平文です。プロバイダーやネットワーク管理者に「どのドメインを調べているか」が見える状態です。DNS-over-TLS(DoT)を設定すると、上流への問い合わせがポート853の暗号化通信になります。
手順7:DoTフォワーダーを設定する
name: “.”
# Cloudflare DoT
forward-addr: 1.1.1.1@853#cloudflare-dns.com
forward-addr: 1.0.0.1@853#cloudflare-dns.com
# Google DoT(フォールバック)
forward-addr: 8.8.8.8@853#dns.google
forward-addr: 8.8.4.4@853#dns.google
forward-tls-upstream: yes
注意:フォワーダー設定と再帰解決の併用はできない
forward-zone を設定した場合、Unboundはそのゾーンについてフォワーダーへ転送します。自前で再帰解決(ルートサーバーから辿る)したい場合は forward-zone を書かないか削除してください。
unbound-checkconf: no errors in /etc/unbound/unbound.conf
$ sudo systemctl restart unbound
$ dig @127.0.0.1 github.com A | grep ‘Query time’
;; Query time: 11 msec ← 初回(DoTハンドシェイクコストあり)
$ dig @127.0.0.1 github.com A | grep ‘Query time’
;; Query time: 0 msec ← 2回目(キャッシュヒット)
DNSSECで改ざん検知
ubuntu:24.04 では dns-root-data パッケージが自動的にルート信頼アンカーをインストールするため、デフォルトでDNSSEC検証が有効になっています。実際にRRSIGレコードが返ってくるか確認します。
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
cloudflare.com. 287 IN RRSIG A 13 2 300 20260621153326 20260619133326
34505 cloudflare.com. EZJ/qYskKREEvxRuVgNPyS5ZvAXY4eZ…
RRSIGレコードが返ってきていれば、DNSSECの署名が付いています。上流(フォワーダーを設定している場合はCloudflare 1.1.1.1など)がDNSSECに対応していれば署名付きの応答が来ます。Unboundがローカルでその署名を検証します。

resolv.conf を Unbound に向ける
ここまでは dig @127.0.0.1 で明示的にUnboundに問い合わせていました。システム全体のDNSをUnboundに向けるには /etc/resolv.conf を変更します。
注意:systemd-resolved との競合
Ubuntu 24.04 はデフォルトで systemd-resolved がポート53をListenしています。そのままでは Unbound がポート53を使えません。下記の手順で先に systemd-resolved を無効化します。
$ sudo systemctl stop systemd-resolved
$ sudo rm /etc/resolv.conf
$ echo ‘nameserver 127.0.0.1’ | sudo tee /etc/resolv.conf
nameserver 127.0.0.1
$ sudo systemctl restart unbound
$ host github.com
github.com has address 140.82.121.4
github.com has IPv6 address 2606:50c0:8000::154
host github.com でアドレスが返れば、システム全体のDNSがUnbound経由になっています。
よくあるエラーと対処
① Address already in use — ポート53が既に使われている
for 127.0.0.1 port 53
$ sudo ss -ulnp | grep :53
UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* users:((“systemd-resolvd”,…))
systemd-resolved が動いています。上記の「resolv.confをUnboundに向ける」手順で無効化してください。
② root.key not found — DNSSECルートキーが見つからない
$ sudo unbound-anchor -a /var/lib/unbound/root.key
0
unbound-anchor コマンドでルートキーを手動取得します。正常終了時は終了コードが 0 か 1 (変更なし or 更新)です。
③ forward-tls-upstream で名前解決に失敗する
forward-addr に #dns.google などのSNIホスト名を書いている場合、TLSハンドシェイク時にホスト名検証が走ります。ネットワーク環境によってはポート853が閉じている場合があります。まずポート53のフォワーダーで動作確認してから DoT を有効にするとデバッグが楽です。
Connection to 1.1.1.1 853 port [tcp/*] succeeded!
まとめ
Unbound を Ubuntu 24.04 に立てると、DNSキャッシュ・DNSSEC検証・DNS-over-TLS フォワーディングを1つのプロセスで実現できます。実測では2回目以降のDNSクエリがすべて0msになり、同じドメインへのアクセスが多いサーバー環境では体感できる速度改善があります。
apt install unboundでインストール(Ubuntu 24.04 では 1.19.2)unbound.conf.d/local.confで interface・access-control・prefetch を設定unbound-checkconfで設定ファイルの構文を事前確認- DNS-over-TLS は
forward-tls-upstream: yesとforward-addr: 1.1.1.1@853#cloudflare-dns.comで有効化 - systemd-resolved との競合はサービス停止と
resolv.conf書き換えで解決
VPSを借りて自分でサーバーを管理するなら、まずDNSを自前で持つのは良い出発点です。DigitalOceanやVultrの最小プランでも問題なく動きます。
VPS選びで迷ったら の比較記事も参考にしてください。


コメント