systemd-resolvedとは?Linuxの名前解決を担う現代的なDNSサービス完全ガイド

プログラミング・IT

Linuxサーバーを運用していると、「systemd-resolved」というプロセスに出会うことがありますよね。

「DNS設定を変更したのに反映されない…」「/etc/resolv.confが勝手に書き換わる」といった経験はありませんか?その原因、実はsystemd-resolvedかもしれません。

systemd-resolvedは、現代的なLinuxシステムでDNS解決を担当する、systemdに統合されたネットワーク名前解決サービスなんです。従来の方法とは異なるアプローチで、より柔軟で高機能な名前解決を実現しています。

この記事では、systemd-resolvedの基礎から設定方法、トラブルシューティングまで、Linux初心者の方にも分かりやすく解説していきます。

DNSの仕組みも含めて、丁寧に説明していきますね!


スポンサーリンク
  1. DNSとは?まずは基礎を押さえよう
    1. DNSの役割
    2. なぜDNSが必要?
    3. DNSリゾルバーとは
  2. systemd-resolvedとは?
    1. 基本的な説明
    2. 従来の方法との違い
    3. 主な機能
  3. systemd-resolvedの仕組み
    1. アーキテクチャ
    2. /etc/resolv.confとの関係
    3. スタブリゾルバー
  4. systemd-resolvedの設定方法
    1. サービスの状態確認
    2. 現在のDNS設定を確認
    3. 設定ファイルの場所
    4. DNSサーバーの指定
    5. 特定のドメインのDNS設定
  5. DNSSECの設定
    1. DNSSECとは
    2. DNSSEC設定のオプション
    3. DNSSEC検証の確認
  6. DNS over TLS(DoT)の設定
    1. DNS over TLSとは
    2. DoTの有効化
  7. mDNSとLLMNRの設定
    1. mDNSとは
    2. LLMNRとは
    3. 設定方法
  8. キャッシュの管理
    1. キャッシュの仕組み
    2. キャッシュの統計情報
    3. キャッシュのクリア
  9. よくある問題とトラブルシューティング
    1. 問題1:名前解決ができない
    2. 問題2:/etc/resolv.confが勝手に書き換わる
    3. 問題3:特定のドメインだけ解決できない
    4. 問題4:DNSSECエラーで解決できない
    5. 問題5:応答が遅い
  10. systemd-resolvedの代替手段
    1. 従来の方法:直接resolv.confを編集
    2. dnsmasq
    3. unbound
    4. resolvconf
  11. 実用的な設定例
    1. 例1:基本的なデスクトップ設定
    2. 例2:企業ネットワーク設定
    3. 例3:プライバシー重視設定
    4. 例4:開発環境設定
  12. パフォーマンスチューニング
    1. キャッシュの最適化
    2. 並列問い合わせ
    3. タイムアウト設定
  13. セキュリティのベストプラクティス
    1. 1. DNS over TLSを使う
    2. 2. DNSSECを有効にする
    3. 3. 不要なプロトコルを無効化
    4. 4. 信頼できるDNSサーバーを使う
  14. ログとデバッグ
    1. ログの確認
    2. デバッグモードの有効化
    3. 問い合わせのトレース
  15. 他のツールとの連携
    1. NetworkManagerとの統合
    2. Dockerとの共存
    3. VPN接続時の注意
  16. まとめ

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」にアクセスしようとすると:

  1. アプリケーションがDNSリゾルバーに問い合わせ
  2. リゾルバーがDNSサーバーに問い合わせ
  3. IPアドレスが返される
  4. その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を活用して、快適なネットワーク体験を実現してくださいね!

コメント

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