DNS設定 · 4 min read · Sep 08, 2025
Ubuntu 22.04でUnboundを使用してローカルDNSリゾルバーを設定する方法

Unboundは、検証、再帰、およびキャッシュDNSリゾルバーとして使用できる無料のオープンソースDNSサーバーソフトウェアです。これは、DNS-over-TLS(DoT)、DNS-over-HTTPS(DoH)、クエリ名の最小化、DNSSEC検証キャッシュの積極的な使用、および権限ゾーンのサポートをサポートする機能豊富なDNSサーバーです。UnboundはDNSのプライバシーとセキュリティに重点を置いていますが、速度とパフォーマンスを犠牲にすることはありません。
Unboundは主にNLnet Labsによって開発され、BSDライセンスの下で配布されており、DNSサーバーのオープンスタンダードに基づく最新の機能をサポートしています。Unboundは厳密に監査されており、Linux、BSD、およびmacOSで実行できます。UnboundはこれらのOSのほとんどで利用可能で、システムパッケージマネージャーを介してインストールできます。
このチュートリアルでは、Ubuntu 22.04サーバーにUnboundをインストールし、DNSSEC、DNSキャッシュ、ローカルドメイン名とサブドメイン、DNS-over-TLS(DoT)などの機能を有効にしてローカルDNSサーバーとして設定します。また、Rsyslogとlogrotateを介してUnboundのログを設定し、Unboundのインストールを確認するためにUbuntuクライアントマシンを設定します。
前提条件
このチュートリアルを完了するには、以下の要件が必要です:
- Ubuntu 22.04サーバー - この例では、ホスト名が ‘unbound-server‘、IPアドレスが ‘192.168.5.100‘のUbuntuサーバーを使用します。
- sudo/root管理者権限を持つ非rootユーザー。
それだけです。これでUnboundのインストールを進める準備が整いました。
Unbound DNSサーバーのインストール
デフォルトでは、UbuntuリポジトリはAPTを介して簡単にインストールできるUnboundパッケージを提供します。Unboundのインストールを開始する前に、以下のaptコマンドを発行してUbuntuパッケージインデックスを更新およびリフレッシュします。
sudo apt update次に、以下のコマンドを使用してunboundパッケージの詳細を確認します。
sudo apt info unboundこの記事を書いている時点で、デフォルトのUbuntuリポジトリはUnbound 1.13を提供しています。

次に、以下のaptコマンドを使用してUnboundをインストールします。プロンプトが表示されたら、yを入力して確認し、ENTERを押して続行します。
sudo apt install unbound出力:

Unboundがインストールされたら、以下のsystemctlコマンドを実行してUnboundサービスを確認します。
sudo systemctl is-enabled unbound
sudo systemctl status unbound出力の ‘enabled‘ は、Unboundが有効であり、システム起動時に自動的に開始されることを確認します。そして、出力の ‘active (running)‘ は、Unboundが実行中であることを確認します。

UnboundをローカルDNSサーバーとして構成する
デフォルトのUnbound構成は‘/etc/unbound/unbound.conf’にあります。このステップでは、好みのエディタを使用してメインのUnbound構成ファイル‘/etc/unbound/unbound.conf’を変更します。
Unbound DNSサーバーの基本構成、DNSキャッシュの有効化、ローカルドメイン名とサブドメインの設定、DoT(DNS-over-TLS)を有効にしたDNSリゾルバーとしてUnboundを設定する方法を学びます。
基本構成
好みのエディタを使用してデフォルトのUnbound構成ファイル‘/etc/unbound/unbound.conf’を開きます。この例では、構成ファイル‘/etc/unbound/unbound.conf’を編集するためにnanoを使用します。
sudo nano /etc/unbound/unbound.confファイルに以下の行を追加します。 ‘server‘ セクションでは、基本的なUnbound構成を設定できます。この例では、UnboundをローカルIPアドレス ‘192.168.5.100‘ でデフォルトポート 53 で実行します。また、Syslogメッセージへのログ記録を設定し、IPv6を無効にします。最後に、UnboundをルートDNSサーバーから任意のホスト名を再帰的にクエリするように設定します。 ‘root-hints‘ ファイルを介して。
#Adding DNS-Over-TLS support
server:
use-syslog: yes
username: "unbound"
directory: "/etc/unbound"
tls-cert-bundle: /etc/ssl/certs/ca-certificates.crt
do-ip6: no
interface: 192.168.5.100
port: 53
prefetch: yes
root-hints: /usr/share/dns/root.hints
harden-dnssec-stripped: yes詳細パラメータ:
- use-syslog: Syslogメッセージへのログ記録を有効にします。
- username: デフォルトユーザーである unbound として実行します。
- directory: Unboundのデフォルト作業ディレクトリは ‘/etc/unbound’ ディレクトリです。
- tls-cert-bundle: 上流に接続するために使用される証明書。Debianベースのディストリビューションでは、証明書ファイルは ‘/etc/ssl/certs/ca-certificates.crt ‘ にあります。
- do-ip6: UnboundをIPv6で実行するには ‘yes‘ を使用し、IPv6を無効にするには ‘no‘ を設定します。
- interface: Unboundが実行されるネットワークインターフェースまたはIPアドレス。IPアドレスまたはインターフェース名(例: ‘eth0‘)を使用できます。また、次の形式で特定のポートで実行することもできます: ‘IP-ADDRESS@PORT‘。
- port: Unboundが実行されるポートを指定し、このポートがクライアントの接続を処理します。デフォルトのDNSポートは 53 です。
- prefetch: ほぼ期限切れのメッセージキャッシュエントリのプリフェッチを有効にするには ‘yes‘ に設定します。
- root-hints: ルートDNSサーバーの詳細を含むファイル。ファイル ‘/usr/share/dns/root.hints’ は ‘dns-root-data‘ パッケージによって提供されます。また、ここからroot-hintsファイルをダウンロードすることもできます ‘ https://www.internic.net/domain/named.cache ‘。
- harden-dnssec-stripped: dnssec-strippedデータを受信することに対して強化するには ‘yes‘ に設定します。
DNSキャッシュの有効化
次に、UnboundインストールでDNSキャッシュクエリを有効にするために、以下の行を追加します。
cache-max-ttl: 14400
cache-min-ttl: 11000詳細パラメータ:
- cache-max-ttl: RRSetsおよびDNSキャッシュ内のメッセージのTTL(生存時間)。形式は秒単位です。
- cache-min-ttl: キャッシュの最小TTL。デフォルトは0ですが、好みに応じて ‘11000‘ 秒に変更できます。1時間を超えて設定しないでください。さもなければ、古いデータのために問題が発生します。
Unboundのプライバシーとセキュリティ
次に、Unboundの基本的なプライバシーとセキュリティを設定するために、以下の行を追加できます。
aggressive-nsec: yes
hide-identity: yes
hide-version: yes
use-caps-for-id: yes詳細パラメータ:
- aggressive-nsec: DNSSEC NSECチェーンを使用してNXDOMAINおよびその他の拒否を合成するために、’ yes ‘ に設定します。 ‘NSEC’に関するIETFのウェブページを確認してください https://www.ietf.org/archive/id/draft-ietf-dnsop-nsec-ttl-00.html。
- hide-identity: id.serverまたはhostname.bindに関するbindクエリからの応答を無効にするには、yesに設定します。
- hide-version: version.serverおよびversion.bindクエリを無効にするには、yesに設定します。
- use-caps-for-id: スプーフィングの試みを防ぐために、クエリで ‘0x100-encoded ‘ の使用を有効にするには、yesに設定します。
プライベートネットワークとアクセス制御リスト(ACL)の定義
次に、ネットワークのプライベートアドレスとACL(アクセス制御リスト)を定義する必要があります。以下の行のローカルサブネットを現在のネットワーク環境に変更してください。
private-address: 192.168.0.0/16
private-address: 192.168.5.0/24
private-address: 169.254.0.0/16
private-address: 172.16.0.0/12
private-address: 10.0.0.0/8
private-address: fd00::/8
private-address: fe80::/10
#control which clients are allowed to make (recursive) queries
access-control: 127.0.0.1/32 allow_snoop
access-control: ::1 allow_snoop
access-control: 127.0.0.0/8 allow
access-control: 192.168.5.0/24 allow詳細パラメータ:
- private-address: インフラストラクチャ上のプライベートネットワークサブネットを定義します。これらのプライベートアドレスを持つのは ‘private-domain‘ と ‘local-data’ 名のみです。
- access-control: クライアントがUnboundサーバーに対して(再帰的)クエリを行うことができるアクセス制御を定義します。パラメータ ‘allow‘ は再帰を有効にし、‘allow_snoop‘ は再帰的および非再帰的の両方を有効にします。
ローカルドメインの設定
プライベートアドレスとアクセス制御リストを構成した後、ドメイン名のローカルゾーンを定義します。これは、特にローカルネットワーク上に複数の自己ホストアプリケーションがある場合に非常に便利です。ドメイン名やサブドメインを簡単に定義し、特定のターゲットIPアドレスにポイントできます。
この例では、ドメイン ‘home.lan‘ のゾーンをタイプ ‘static‘ で作成し、その後、’ local-data ‘ パラメータを介して複数のサブドメインを作成します。各サブドメインは特定のIPアドレスにポイントされ、’ local-data-ptr ‘ パラメータを介してPTRレコードも作成します。
# local zone
local-zone: "home.lan." static
local-data: "firewall.home.lan. IN A 10.0.0.1"
local-data: "vault.home.lan. IN A 10.0.0.2"
local-data: "media.home.lan. IN A 10.0.0.3"
local-data: "docs.home.lan. IN A 10.0.0.4"
local-data: "wiki.home.lan. IN A 10.0.0.5"
local-data-ptr: "10.0.0.1 firewall.home.lan"
local-data-ptr: "10.0.0.2 vault.home.lan"
local-data-ptr: "10.0.0.3 media.home.lan"
local-data-ptr: "10.0.0.4 docs.home.lan"
local-data-ptr: "10.0.0.5 wiki.home.lan"詳細パラメータ:
- local-zone: ここでローカルドメインを定義します。
- local-data: サブドメインのAレコードを定義し、どのローカルIPアドレスが解決されるかを指定します。
- local-data-ptr: サブドメインのptrレコードを定義します。
Unboundパフォーマンスの調整と微調整
以下の行を追加して、パフォーマンスを向上させます。以下のパラメータは、現在の環境に合わせて調整できます。
num-threads: 4
msg-cache-slabs: 8
rrset-cache-slabs: 8
infra-cache-slabs: 8
key-cache-slabs: 8
rrset-cache-size: 256m
msg-cache-size: 128m
so-rcvbuf: 8m詳細パラメータ:
- num-threads: 作成されるスレッドの数。値はサーバーのCPUコアに一致する必要があります。
- msg-cache-slabs: メッセージキャッシュに使用するスラブの数。Unboundがキャッシュのためにより多くのメモリを使用するように最適化するために8に設定します。
- rrset-cache-slabs: RRsetキャッシュに使用するスラブの数。UnboundがRRSetキャッシュのためにより多くのメモリを使用するように最適化するために8に設定します。
- infra-cache-slabs: インフラストラクチャキャッシュに使用するスラブの数。Unboundがインフラストラクチャキャッシュのためにより多くのメモリを使用するように最適化するために8に設定します。
- key-cache-slabs: キーキャッシュに使用するスラブの数。Unboundがキーキャッシュのためにより多くのメモリを使用するように最適化するために8に設定します。
- rrset-cache-size: RRSetキャッシュのためのメモリ量を指定します。この例では256MBを使用し、デフォルトはわずか4MBです。
- msg-cache-size: メッセージキャッシュのためのメモリ量を指定します。この例では128MBを使用し、デフォルトはわずか4MBです。
- so-rcvbuf: DNSポート53/udpのバッファサイズを8 MBに設定します。Ubuntuシステムでは、カーネルパラメータ ‘net.core.rmem_max‘ に対しても高い値を設定する必要があります。
DNS-over-TLS(DoT)を使用したDNSリゾルバーとしてUnboundを設定する
最後に、UnboundをローカルネットワークのDNSリゾルバーとして設定するために、新しいセクション ‘forward-zone‘ を追加します。この例では、DoT(DNS-over-TLS)が有効なQuad9 DNSサーバーを使用します。
forward-zone:
name: "."
forward-ssl-upstream: yes
## Also add IBM IPv6 Quad9 over TLS
forward-addr: 9.9.9.9@853#dns.quad9.net
forward-addr: 149.112.112.112@853#dns.quad9.net詳細パラメータ:
- forward-zone: Unboundのフォワードゾーンを定義します。
- name: “.” に設定してすべてのDNSクエリを転送します。
- forward-addr: すべてのDNSクエリを転送するために特定のフォワーダーを使用します。この例では、DNS-over-TLS(DoT)が有効なQuad9 DNSを使用します。
ファイル ‘/etc/unbound/unbound.conf’ を変更したら、保存して終了します。Unbound構成ファイルが変更されたので、Unboundサービスを再起動して変更を適用できます。
以下のコマンドを実行してUnbound構成を確認し、検証します。成功した場合、’ unbound-checkconf: no errors in /etc/unbound/unbound.conf’ のような出力が得られます。
sudo unbound-checkconf次に、以下のコマンドを実行して、‘/etc/sysctl.conf’ファイルを介してシステムのデフォルトの ‘net.core.rmem_max’ を増やします。その後、’ sysctl ‘ コマンドを介して変更を適用します。
echo "net.core.rmem_max= 8388608" >> /etc/sysctl.conf
sudo sysctl -pその後、以下のsystemctlコマンドを実行してUnboundサービスを再起動し、変更を適用します。
sudo systemctl restart unboundこれで、UnboundサービスはIPアドレス 192.168.5.100 のポート 53 で新しい構成で実行されているはずです。

以下のssコマンドを介して、システム上のオープンポートのリストを確認します。
ss -tulpn次のような出力が得られます - デフォルトのDNS UDPポート 53 はUnboundサービスによって使用されています。

Unboundの構成が完了したので、UFWファイアウォールを設定し、デフォルトのDNSポート53を開きます。
UFWファイアウォールの設定
Ubuntuでは、デフォルトでインストールされているファイアウォールはUFWです。これはインストールされていますが、まだ非アクティブです。このステップでは、UFWファイアウォールを設定し、UnboundのUDPポートを開きます。
以下のコマンドを実行して、UFWを介してOpenSSHサービスを開きます。その後、DNSポート 53/udp をUFWファイアウォールに追加できます。
sudo ufw allow OpenSSH
sudo ufw allow 53/udp次に、以下のコマンドを実行してUFWファイアウォールサービスを開始し、有効にします。プロンプトが表示されたら、yを入力して確認し、ENTERを押して続行します。
sudo ufw enable出力の ‘Firewall is active and enabled on system startup‘ は、UFWファイアウォールが実行中であり、有効であることを確認します。つまり、UFWファイアウォールはシステム起動時に自動的に開始されます。
出力:

次に、以下のufwコマンドを実行してUFWファイアウォールのステータスを確認します。UFWのステータスが ‘active‘ で、OpenSSHサービスとDNSポート53/udpが有効になっているという出力が得られるはずです。
sudo ufw status出力:

RsyslogとLogrotateを介したUnboundログの設定
UFWファイアウォールを構成した後、rsyslogとlogrotateを介してUnboundのログファイルを設定します。rsyslogサービスはUnbound用の特定のログファイルを作成し、logrotateはUnboundのログファイルを一定の時間でローテーションします。
以下のコマンドを実行して、Unboundサービス用の新しいRsyslog構成 ‘/etc/rsyslog.d/unbound.conf’ を追加します。これにより、Unboundのログは ‘/var/log/unbound.log‘ に保存されます。
cat <次に、以下のコマンドを実行して、Unboundサービス用のlogrotate構成 ‘/etc/logrotate.d/unbound ‘ を追加します。これにより、Unboundのログファイル ‘/var/log/unbound.log‘ のログローテーションが日次で作成されます。
cat <
次に、以下のsystemctlコマンドを実行してRsyslogとLogrotateサービスを再起動します。これにより、両方のサービスに対して行った変更が適用されます。
sudo systemctl restart rsyslog logrotate最後に、以下のコマンドを使用してUnboundサービスを再起動し、ログファイルを確認できます。
これにより、再起動プロセス中にUnboundサービスによって生成されたメッセージがログファイル ‘/var/log/unbound.log‘ に保存されます。以下のコマンドを実行して、ログファイル ‘/var/log/unbound.log‘ の内容を表示します。
sudo systemctl restart unbound
cat /var/log/unbound.log出力:

クライアントでのDNSリゾルバーの設定
クライアント側では、DNSリゾルバーを設定し、クライアントシステムでUnboundをデフォルトリゾルバーとして使用する必要があります。Ubuntuディストリビューションでは、NetworkManager、systemd-resolvedサービスを使用するか、 ‘/etc/resolv.conf’ の静的ファイルを設定できます。
このステップでは、Ubuntu DesktopおよびUbuntu ServerでDNSリゾルバーを設定する方法を学びます。
Ubuntu Desktopの場合
NetworkManagerサービスは、Ubuntu Desktopバージョンのデフォルトのネットワーキングを処理します。したがって、NetworkManagerを介してDNSリゾルバーを簡単に設定できます。これは、コマンドラインGUIを介して行うことも、各ネットワークインターフェースの構成ファイルを編集することでもできます。
コマンドラインを介してDNSリゾルバーを設定するには、nmcliを使用できます。以下のコマンドを実行して、特定のネットワークインターフェースのDNSリゾルバーを設定します。インターフェース名eth0を置き換えることができます。
sudo nmcli connection modify eth0 ipv4.dns "192.168.5.100"NetworkManagerによって管理される各インターフェースには、‘/etc/NetworkManager/system-connections’ ディレクトリに格納されている特定の構成ファイルがあり、形式は ‘.nmconnection ‘ です。
好みのテキストエディタでインターフェース構成を変更し、’ [ipv4] ‘ セクションに以下の行を追加できます。
[ipv4]
dns=192.168.5.100
ignore-auto-dns=true
never-default=trueGUIアプリケーションを使用することを好む場合は、マシン上のNetworkManagerアプリケーションを開き、変更したいインターフェース名を編集します。 ‘IPv4 Settings ‘ タブをクリックし、ローカルDNSサーバーを入力します。次に、保存をクリックして確認します。

一般的なUbuntu Serverの場合
一般的なUbuntuサーバーマシンでは、ネットワーキングはnetplanによって処理され、バックエンドはsystemd-networkdサービスです。そして、DNSリゾルバー構成には、systemd-networkdがsystemd-resolvedを使用します。したがって、一般的なUbuntuサーバーでDNSリゾルバーを設定するには、systemd-resolvedサービスを介して実現できます。
好みのエディタを使用してsystemd-resolved構成ファイルを開きます。この例では、nanoエディタを使用します。
sudo nano /etc/systemd/resolved.conf‘ [Resolve] ‘ セクションで、’ DNS ‘ パラメータのコメントを外し、ローカルDNSサーバーのIPアドレスを入力します。
[Resolve]
DNS=192.168.5.100終了したら、ファイルを保存して終了します。
次に、以下のコマンドを実行してsystemd-resolvedサービスを再起動し、変更を適用します。その後、以下のresolvectlコマンドを介してDNSリゾルバーのステータスを確認できます。
sudo systemctl restart systemd-resolved
sudo resolvectl status成功した場合、次のような出力が表示されます - デフォルトのDNSリゾルバーがUnboundローカルDNSサーバーのIPアドレス192.168.5.100に変更されます。

Unbound DNSサーバーのテスト
Unbound DNSがDNSリゾルバーとして機能していることを確認するために、Ubuntuクライアントマシンから以下のdigコマンドを実行します。パラメータ ‘@192.168.5.100‘ は、IPアドレス ‘192.168.5.100‘ で実行されているUnbound DNSサーバーを使用していることを確認します。
dig @192.168.5.100成功すると、次のような出力が得られます。ルートDNSサーバーからの応答が得られます。また、ヘッダー出力に ‘ad‘(authentic data)フラグが表示され、DNSSECが有効であることを示します。

次に、以下のコマンドを実行して、クライアントがインターネット上のドメイン名にアクセスできることを確認します。
dig github.com
dig duckduckgo.com成功すると、ドメイン ‘github.com‘ と ‘duckduckgo.com‘ のDNSレコードの詳細が表示されます。クエリに応答するDNSリゾルバーが ‘127.0.0.53#53’ であり、systemd-resolvedがUnboundをデフォルトリゾルバーとして使用していることがわかります。また、各クエリの ‘Query time ‘ も表示され、ドメイン ‘github.com‘ への ‘Query time‘ は ‘1748‘、ドメイン ‘duckduckgo.com‘ への ‘Query time‘ は ‘999‘ です。
github.comの出力:

duckduckgo.comの出力:

上記のdigコマンドを再実行すると、’Query time’ が短縮されるはずです。これにより、クエリがキャッシュされ、DNSキャッシュが機能していることが確認されます。
dig github.com
dig duckduckgo.comキャッシュが保存された後にGithubにアクセス:

キャッシュが保存された後にduckduckgoにアクセス:

次に、以下のdigコマンドを使用してローカルドメインまたはサブドメインを確認します。成功すると、各サブドメインはUnbound構成ファイル ‘/etc/unbound/unbound.conf‘ に設定された正しいIPアドレスにポイントされます。
dig firewall.home.lan +short
dig vault.home.lan +short
dig media.home.lan +short出力:

次に、以下のdigコマンドを実行して、PTRレコードが正しいドメイン名にポイントされていることを確認します。
dig -x 10.0.0.1 +short
dig -x 10.0.0.2 +short
dig -x 10.0.0.3 +short出力:

また、tcpdumpを介してDoT(DNS over TLS)を確認できます。Unboundサーバーに ‘tcpdump‘ パッケージをインストールします。
sudo apt install tcpdumpプロンプトが表示されたらyを入力し、ENTERを押して続行します。

次に、以下のtcpdumpコマンドを実行して、DoTポート 853 でインターフェース ‘eth0‘ のトラフィックを監視します。この例では、Unbound DNSはIPアドレス ‘192.168.5.100‘ で実行され、インターフェースは ‘eth0‘ です。
tcpdump -vv -x -X -s 1500 -i eth0 'port 853'クライアントマシンに移動し、以下のコマンドを実行して、digコマンドを介して外部/インターネットドメイン名にアクセスします。
dig google.com出力:

その後、Unboundサーバーに戻ると、tcpdump出力に次のような出力が表示されるはずです。

これで、UbuntuサーバーでUnboundを介してローカルDNSサーバーをインストールおよび構成しました。また、UbuntuデスクトップおよびサーバーでNetworkManagerおよびsystemd-resolvedを介してDNSリゾルバーを構成しました。
結論
このガイドでは、Ubuntu 22.04サーバーにUnboundローカルDNSサーバーをインストールしました。DNSキャッシュ、DNSSEC(デフォルトで有効)、プライベートアドレスとACLの構成、local-zoneを介したローカルドメインの追加、次にDoT(DNS-over-TLS)を使用したDNSリゾルバーとしてUnboundを構成しました。
さらに、基本的なDNSプライバシーとセキュリティを構成し、Unboundを最適化し、rsyslogとlogrotateを介してUnboundログを構成しました。
このガイドの最後に、UbuntuデスクトップおよびサーバーでNetworkManagerおよびsystemd-resolvedを介してDNSリゾルバーを設定する方法を学びました。また、DNSサーバーを確認するためのdigコマンドの基本的な使用法も学びました。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。