Linuxサーバーを運用していると、「systemd-resolved」というプロセスに出会うことがありますよね。
「DNS設定を変更したのに反映されない…」「/etc/resolv.confが勝手に書き換わる」といった経験はありませんか?その原因、実はsystemd-resolvedかもしれません。
systemd-resolvedは、現代的なLinuxシステムでDNS解決を担当する、systemdに統合されたネットワーク名前解決サービスなんです。従来の方法とは異なるアプローチで、より柔軟で高機能な名前解決を実現しています。
この記事では、systemd-resolvedの基礎から設定方法、トラブルシューティングまで、Linux初心者の方にも分かりやすく解説していきます。
DNSの仕組みも含めて、丁寧に説明していきますね!
DNSとは?まずは基礎を押さえよう

DNSの役割
DNS(Domain Name System)は、インターネットの「電話帳」のような役割を果たします。
人間が覚えやすい「www.example.com」というドメイン名を、コンピューターが理解できる「192.0.2.1」というIPアドレスに変換してくれるんです。
なぜDNSが必要?
IPアドレスだけでは不便:
- 192.168.1.100 は覚えにくい
- サーバーを移転するとアドレスが変わる
- 人間には直感的でない
ドメイン名なら便利:
- google.com は覚えやすい
- サーバーが変わってもドメイン名は同じ
- 意味が分かりやすい
この変換作業を「名前解決」と呼びます。
DNSリゾルバーとは
DNSリゾルバー(DNS Resolver)は、名前解決を実際に行うプログラムのことです。
ブラウザで「example.com」にアクセスしようとすると:
- アプリケーションがDNSリゾルバーに問い合わせ
- リゾルバーがDNSサーバーに問い合わせ
- IPアドレスが返される
- そのIPアドレスに接続
systemd-resolvedは、この「DNSリゾルバー」の役割を果たすんです。
systemd-resolvedとは?
基本的な説明
systemd-resolvedは、systemdプロジェクトの一部として開発された、ネットワーク名前解決のためのシステムサービスです。
2015年ごろから主要なLinuxディストリビューションに導入され始め、現在ではUbuntu、Fedora、Arch Linuxなど多くのディストリビューションで標準採用されています。
従来の方法との違い
従来の方法:
/etc/resolv.confファイルにDNSサーバーを直接記述- 静的な設定
- ネットワーク変更時に手動更新が必要
systemd-resolved:
- 動的にDNSサーバーを管理
- 複数のネットワークインターフェースに対応
- キャッシュ機能内蔵
- DNSSEC対応
- mDNS/LLMNR対応
つまり、より現代的で柔軟な仕組みなんですね。
主な機能
DNSキャッシング
一度問い合わせた結果を保存して、次回以降の問い合わせを高速化します。
マルチネットワーク対応
有線、無線、VPNなど複数のネットワークを使い分けられます。
DNSSEC検証
DNS応答の正当性を暗号技術で検証し、偽装を防ぎます。
mDNS/LLMNR対応
ローカルネットワーク内の名前解決をDNSサーバーなしで実行できます。
統合管理
NetworkManagerなど他のツールと連携して、自動的に設定を調整します。
systemd-resolvedの仕組み
アーキテクチャ
systemd-resolvedは、以下のような構造で動作します。
アプリケーション
↓ (名前解決の要求)
NSS(Name Service Switch)
↓
systemd-resolved
↓ (DNS問い合わせ)
外部DNSサーバー
アプリケーションからの名前解決要求を受け取り、適切なDNSサーバーに問い合わせて結果を返すんです。
/etc/resolv.confとの関係
従来、DNS設定は /etc/resolv.conf ファイルに記述していました。
systemd-resolvedを使う場合、このファイルはシンボリックリンクになります。
典型的な設定:
/etc/resolv.conf → /run/systemd/resolve/stub-resolv.conf
このファイルには、systemd-resolved自身のアドレス(127.0.0.53)が書かれているんです。
スタブリゾルバー
systemd-resolvedは、スタブリゾルバーとしてローカルの127.0.0.53で待ち受けます。
すべてのDNS問い合わせは、まずこのアドレスに送られ、systemd-resolvedが適切に処理します。
systemd-resolvedの設定方法
サービスの状態確認
まず、systemd-resolvedが動いているか確認しましょう。
systemctl status systemd-resolved
実行中の場合:
● systemd-resolved.service - Network Name Resolution
Loaded: loaded
Active: active (running)
現在のDNS設定を確認
詳細な状態確認:
resolvectl status
または
systemd-resolve --status
これで、現在使用中のDNSサーバーやドメイン、DNSSEC設定などが表示されます。
設定ファイルの場所
systemd-resolvedの主な設定ファイルは:
メイン設定:/etc/systemd/resolved.conf
ネットワーク別設定:/etc/systemd/network/*.network
設定を変更したら、サービスを再起動します。
sudo systemctl restart systemd-resolved
DNSサーバーの指定
方法1:resolved.confで設定
/etc/systemd/resolved.conf を編集:
[Resolve]
DNS=8.8.8.8 1.1.1.1
FallbackDNS=8.8.4.4 1.0.0.1
#Domains=
#DNSSEC=allow-downgrade
#DNSOverTLS=no
主な設定項目:
- DNS:優先DNSサーバー
- FallbackDNS:バックアップDNSサーバー
- Domains:検索ドメイン
- DNSSEC:DNSSEC検証の設定
- DNSOverTLS:DNS over TLS(暗号化)の有効化
方法2:NetworkManager経由
NetworkManagerを使っている場合:
nmcli connection modify eth0 ipv4.dns "8.8.8.8 1.1.1.1"
nmcli connection up eth0
NetworkManagerがsystemd-resolvedに自動的に設定を伝えます。
特定のドメインのDNS設定
特定のドメインだけ別のDNSサーバーを使うこともできます。
resolvectl dns eth0 8.8.8.8
resolvectl domain eth0 ~company.local
これで、company.local ドメインへの問い合わせは指定したDNSサーバーに送られるんです。
DNSSECの設定
DNSSECとは
DNSSEC(DNS Security Extensions)は、DNS応答の真正性を検証する仕組みです。
中間者攻撃などでDNS応答が改ざんされていないかチェックできます。
DNSSEC設定のオプション
systemd-resolvedでは、DNSSECを柔軟に設定できます。
設定値:
yes
DNSSECを常に有効化(厳格モード)
allow-downgrade(デフォルト)
可能な限りDNSSECを使用、非対応なら通常のDNS
no
DNSSECを完全に無効化
[Resolve]
DNSSEC=allow-downgrade
DNSSEC検証の確認
DNSSECが機能しているか確認できます。
resolvectl query sigfail.verteiltesysteme.net
DNSSECが有効なら、この不正な署名のドメインは解決に失敗します。
resolvectl query sigok.verteiltesysteme.net
こちらは正常に解決されるはずです。
DNS over TLS(DoT)の設定
DNS over TLSとは
DNS over TLS(DoT)は、DNS通信を暗号化する技術です。
通常のDNSは平文で送信されるため、盗聴される可能性があります。DoTを使えば、プライバシーが保護されるんです。
DoTの有効化
/etc/systemd/resolved.conf で設定します:
[Resolve]
DNS=1.1.1.1#cloudflare-dns.com 8.8.8.8#dns.google
DNSOverTLS=yes
# の後ろは、TLS証明書の検証に使うサーバー名です。
設定値:
- no:DoT無効
- opportunistic:可能なら使用
- yes:常に使用(失敗したらエラー)
mDNSとLLMNRの設定
mDNSとは
mDNS(Multicast DNS)は、ローカルネットワーク内でDNSサーバーなしに名前解決できる仕組みです。
.local ドメインを使います。
例:raspberry-pi.local でRaspberry Piにアクセス
LLMNRとは
LLMNR(Link-Local Multicast Name Resolution)は、Windowsネットワークでよく使われる名前解決プロトコルです。
mDNSと似た役割を果たします。
設定方法
/etc/systemd/resolved.conf で設定:
[Resolve]
MulticastDNS=yes
LLMNR=yes
注意:
セキュリティ上の理由で、本番サーバーでは無効化することが推奨される場合があります。
キャッシュの管理
キャッシュの仕組み
systemd-resolvedは、DNS問い合わせ結果をメモリにキャッシュします。
メリット:
- 応答が高速化
- 外部DNSサーバーへの負荷軽減
- ネットワーク障害時の一時的なバッファ
キャッシュの統計情報
現在のキャッシュ状態を確認できます。
resolvectl statistics
出力例:
DNSSEC supported: yes
Transactions
Current Transactions: 0
Total Transactions: 12345
Cache
Current Cache Size: 150
Cache Hits: 8901
Cache Misses: 3444
キャッシュのクリア
DNS設定を変更した後など、キャッシュをクリアしたい場合:
resolvectl flush-caches
これで、保存されているキャッシュがすべて削除されます。
よくある問題とトラブルシューティング
問題1:名前解決ができない
症状:ping google.com などが失敗する
確認手順:
1. サービスの状態確認:
systemctl status systemd-resolved
2. DNS設定の確認:
resolvectl status
3. 手動でDNS問い合わせ:
resolvectl query google.com
4. resolv.confの確認:
ls -l /etc/resolv.conf
cat /etc/resolv.conf
よくある原因:
- systemd-resolvedが停止している
- DNSサーバーが設定されていない
- ファイアウォールがDNS通信をブロック
問題2:/etc/resolv.confが勝手に書き換わる
症状:
手動で編集しても、再起動すると元に戻る
原因:
systemd-resolvedまたはNetworkManagerが自動管理している
解決策1:systemd-resolved経由で設定
sudo vim /etc/systemd/resolved.conf
sudo systemctl restart systemd-resolved
解決策2:systemd-resolvedを無効化
sudo systemctl disable --now systemd-resolved
sudo rm /etc/resolv.conf
sudo vim /etc/resolv.conf # 手動で設定
ただし、無効化すると便利な機能が使えなくなります。
問題3:特定のドメインだけ解決できない
症状:
会社の内部ドメインなど、特定のドメインだけ解決に失敗
原因:
そのドメイン専用のDNSサーバーが設定されていない
解決策:
# VPN接続の場合など
resolvectl dns tun0 192.168.10.1
resolvectl domain tun0 ~company.internal
~ を付けると、そのドメインは指定したDNSサーバーにだけ問い合わせます。
問題4:DNSSECエラーで解決できない
症状:
一部のドメインで DNSSEC validation failed エラー
原因:
DNSサーバーのDNSSEC設定に問題がある
一時的な解決策:
[Resolve]
DNSSEC=no
ただし、セキュリティが低下するので注意が必要です。
問題5:応答が遅い
症状:
名前解決に時間がかかる
確認:
time resolvectl query example.com
改善策:
1. より速いDNSサーバーを使う:
[Resolve]
DNS=1.1.1.1 8.8.8.8
2. キャッシュサイズを増やす:
[Resolve]
Cache=yes
CacheFromLocalhost=yes
3. 不要なプロトコルを無効化:
[Resolve]
LLMNR=no
MulticastDNS=no
systemd-resolvedの代替手段

従来の方法:直接resolv.confを編集
メリット:
- シンプルで分かりやすい
- 細かい制御が不要なら十分
デメリット:
- 動的なネットワーク変更に弱い
- キャッシュがない
- 複数ネットワークの管理が面倒
手順:
sudo systemctl disable --now systemd-resolved
sudo rm /etc/resolv.conf
sudo nano /etc/resolv.conf
nameserver 8.8.8.8
nameserver 1.1.1.1
dnsmasq
dnsmasqは、軽量なDNSキャッシュサーバーです。
特徴:
- 軽量で高速
- DHCPサーバー機能も持つ
- 小規模ネットワーク向け
併用も可能:
systemd-resolved → dnsmasq → 外部DNS
unbound
unboundは、本格的なDNSリゾルバーです。
特徴:
- 高性能
- 高度なDNSSEC対応
- キャッシュサーバーとして優秀
企業環境や高負荷環境に向いています。
resolvconf
resolvconfは、/etc/resolv.conf を動的に管理するツールです。
古いシステムで使われていましたが、最近はsystemd-resolvedに置き換わりつつあります。
実用的な設定例
例1:基本的なデスクトップ設定
用途: 個人のLinuxデスクトップ
# /etc/systemd/resolved.conf
[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=1.0.0.1 8.8.4.4
DNSSEC=allow-downgrade
DNSOverTLS=opportunistic
Cache=yes
Cloudflare(1.1.1.1)とGoogle(8.8.8.8)を使い、可能な限りDoTとDNSSECを有効にする安全な設定ですね。
例2:企業ネットワーク設定
用途: 社内DNSと外部DNSを使い分ける
# /etc/systemd/resolved.conf
[Resolve]
DNS=192.168.1.10 192.168.1.11
FallbackDNS=8.8.8.8 1.1.1.1
Domains=~company.internal
DNSSEC=no
LLMNR=no
MulticastDNS=no
社内DNSを優先して、外部はフォールバックとして使用します。
例3:プライバシー重視設定
用途: プライバシーを最大限保護
# /etc/systemd/resolved.conf
[Resolve]
DNS=1.1.1.1#cloudflare-dns.com 9.9.9.9#dns.quad9.net
DNSOverTLS=yes
DNSSEC=yes
LLMNR=no
MulticastDNS=no
Cache=yes
DNS over TLSを強制して、すべての通信を暗号化します。
例4:開発環境設定
用途: ローカル開発サーバーへのアクセス
# /etc/systemd/resolved.conf
[Resolve]
DNS=8.8.8.8
DNSSEC=allow-downgrade
MulticastDNS=yes
Domains=~local
.local ドメインでローカルサーバーに簡単アクセスできます。
パフォーマンスチューニング
キャッシュの最適化
デフォルトのキャッシュ設定:
[Resolve]
Cache=yes
これだけでも十分ですが、より細かい調整も可能です。
並列問い合わせ
systemd-resolvedは、複数のDNSサーバーに並列で問い合わせることができます。
最も速く応答したサーバーの結果を使用するので、高速化が期待できますよ。
タイムアウト設定
応答が遅いDNSサーバーのタイムアウトを調整できます(高度な設定)。
セキュリティのベストプラクティス
1. DNS over TLSを使う
通信を暗号化して、盗聴やDNSハイジャックを防ぎます。
DNSOverTLS=yes
2. DNSSECを有効にする
DNS応答の改ざんを検出できます。
DNSSEC=allow-downgrade
3. 不要なプロトコルを無効化
mDNSやLLMNRは、セキュリティリスクになる場合があります。
LLMNR=no
MulticastDNS=no
特にサーバー環境では無効化を推奨します。
4. 信頼できるDNSサーバーを使う
推奨されるパブリックDNS:
- Cloudflare (1.1.1.1):高速、プライバシー重視
- Google (8.8.8.8):安定性が高い
- Quad9 (9.9.9.9):セキュリティ重視、マルウェアドメインをブロック
ISPのDNSは、ログを取られる可能性があります。
ログとデバッグ
ログの確認
systemd-resolvedのログを確認するには:
journalctl -u systemd-resolved -f
-f オプションで、リアルタイムでログが表示されます。
デバッグモードの有効化
より詳細なログが必要な場合:
sudo systemctl edit systemd-resolved
以下を追加:
[Service]
Environment=SYSTEMD_LOG_LEVEL=debug
保存して再起動:
sudo systemctl restart systemd-resolved
注意: デバッグモードはログが大量に出るので、問題解決後は無効化しましょう。
問い合わせのトレース
特定のドメインの解決過程を詳しく見るには:
resolvectl query --legend=yes --caching=no example.com
どのDNSサーバーに問い合わせて、どう応答されたか分かります。
他のツールとの連携
NetworkManagerとの統合
NetworkManagerは、自動的にsystemd-resolvedと連携します。
確認:
cat /etc/NetworkManager/NetworkManager.conf
[main]
dns=systemd-resolved
この設定で、NetworkManagerで設定したDNSがsystemd-resolvedに反映されます。
Dockerとの共存
Dockerは独自のDNS設定を持ちますが、systemd-resolvedと共存できます。
コンテナから外部DNS問い合わせ:
Dockerが自動的にホストのDNS設定を使用します。
VPN接続時の注意
VPN接続すると、そのインターフェース用のDNS設定が追加されます。
確認:
resolvectl status tun0
VPN用のDNSサーバーが表示されるはずです。
まとめ
systemd-resolvedは、現代的なLinuxシステムで動的かつ柔軟なDNS解決を提供する重要なサービスです。
この記事のポイント:
- systemd-resolvedはsystemd統合型のDNSリゾルバー
- DNSキャッシュ、DNSSEC、DNS over TLSに対応
- 複数ネットワークの動的管理が可能
- /etc/resolv.confは自動管理される
- resolvectlコマンドで詳細な制御が可能
- NetworkManagerなど他ツールと統合
- セキュリティとプライバシーを強化できる
- トラブルシューティングには十分なツールがある
最初は従来の /etc/resolv.conf 編集に慣れている方には戸惑うかもしれません。
でも、systemd-resolvedの仕組みを理解すれば、より柔軟で安全なDNS設定ができるようになります。
特に、複数のネットワークを使うノートPCや、VPN接続が多い環境では、systemd-resolvedの自動管理機能が非常に便利ですよ。
現代のLinuxシステム管理者にとって、systemd-resolvedの理解は必須のスキルと言えるでしょう。
ぜひ、あなたの環境でもsystemd-resolvedを活用して、快適なネットワーク体験を実現してくださいね!


コメント