Unbound on Ubuntu — プライバシー重視の高速再帰DNSリゾルバ構築

ネットワーク

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 — バージョン差に注意

目次

  1. Unbound とは何か
  2. インストール手順(Ubuntu 24.04)
  3. 設定ファイルの編集
  4. サービスの起動と動作確認
  5. 実測:DNSキャッシュ効果とレイテンシ
  6. DNS-over-TLS で上流通信を暗号化する
  7. DNSSECで改ざん検知
  8. resolv.conf を Unbound に向ける
  9. よくあるエラーと対処
  10. まとめ

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:パッケージリストを更新してインストールする




ubuntu@vps: ~
$ sudo apt update
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検証に必要なものが揃うのは地味にありがたいです。

Unboundインストールログ(実測・ubuntu:24.04)
Unboundインストールログ(実測・ubuntu:24.04)

手順2:バージョンを確認する




ubuntu@vps: ~
$ unbound -V
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 がインストールされます。

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

設定ファイルの編集

インストール直後の /etc/unbound/unbound.conf を見ると、1行だけ書いてあります。




ubuntu@vps: ~
$ cat /etc/unbound/unbound.conf
# 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:基本設定ファイルを作成する




ubuntu@vps: ~
$ sudo nano /etc/unbound/unbound.conf.d/local.conf

以下の内容をファイルに書きます。




ubuntu@vps: /etc/unbound/unbound.conf.d/local.conf
server:
# ローカルループバックのみで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:設定ファイルの構文チェック




ubuntu@vps: ~
$ sudo unbound-checkconf
unbound-checkconf: no errors in /etc/unbound/unbound.conf

エラーが出たら行番号と内容が表示されます。no errors が出るまで修正してから次に進みます。

サービスの起動と動作確認

手順5:Unboundを起動して有効化する




ubuntu@vps: ~
$ sudo systemctl enable 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
Unbound設定ファイルと起動ログ(実測)
Unbound設定ファイルと起動ログ(実測)

手順6:dig で動作確認する




ubuntu@vps: ~
$ dig @127.0.0.1 github.com A +short
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)を計測しました。

DNSクエリ遅延比較(Unbound vs パブリックリゾルバ・実測)
DNSクエリ遅延比較(Unbound vs パブリックリゾルバ・実測)

キャッシュヒット時(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フォワーダーを設定する




ubuntu@vps: /etc/unbound/unbound.conf.d/dot-forward.conf
forward-zone:
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 を書かないか削除してください。




ubuntu@vps: ~
$ sudo unbound-checkconf
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レコードが返ってくるか確認します。




ubuntu@vps: ~
$ dig @127.0.0.1 cloudflare.com A +dnssec | grep -E ‘(RRSIG|flags:)’
;; 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がローカルでその署名を検証します。

DNSSEC検証とDoT設定(実測)
DNSSEC検証とDoT設定(実測)

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 を無効化します。




ubuntu@vps: ~
$ sudo systemctl disable 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が既に使われている




ubuntu@vps: ~
[error] unbound: can’t bind socket: Address already in use
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ルートキーが見つからない




ubuntu@vps: ~
[fatal] auto-trust-anchor-file: “/var/lib/unbound/root.key” does not exist
$ sudo unbound-anchor -a /var/lib/unbound/root.key
0

unbound-anchor コマンドでルートキーを手動取得します。正常終了時は終了コードが 01 (変更なし or 更新)です。

③ forward-tls-upstream で名前解決に失敗する

forward-addr#dns.google などのSNIホスト名を書いている場合、TLSハンドシェイク時にホスト名検証が走ります。ネットワーク環境によってはポート853が閉じている場合があります。まずポート53のフォワーダーで動作確認してから DoT を有効にするとデバッグが楽です。




ubuntu@vps: ~
$ nc -zv 1.1.1.1 853
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: yesforward-addr: 1.1.1.1@853#cloudflare-dns.com で有効化
  • systemd-resolved との競合はサービス停止と resolv.conf 書き換えで解決

VPSを借りて自分でサーバーを管理するなら、まずDNSを自前で持つのは良い出発点です。DigitalOceanやVultrの最小プランでも問題なく動きます。

VPS選びで迷ったら の比較記事も参考にしてください。

コメント

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