systemd-resolved完全ガイド:Linuxの現代的なDNS管理【初心者向け】

Ubuntuやその他のLinuxディストリビューションを使っていて、ネットワーク設定で困った経験はありませんか?

特にDNSの設定をしようと/etc/resolv.confを開いたら、「これは自動生成ファイルです。編集しないでください」と書かれていて戸惑った方も多いでしょう。

その背後で動いているのがsystemd-resolvedです。今回は、この現代的なDNS管理サービスについて、初心者の方でも分かりやすく解説していきます!


スポンサーリンク
  1. systemd-resolvedとは?基本を理解しよう
    1. 名前解決って何?
    2. systemdファミリーの一員
  2. なぜsystemd-resolvedが必要になったの?
    1. 従来の方式の問題点
    2. systemd-resolvedの解決策
  3. systemd-resolvedの主な機能
    1. DNS解決とキャッシング
    2. DNSSEC検証
    3. mDNS対応
    4. LLMNR対応
  4. systemd-resolvedの基本的な使い方
    1. 状態の確認
    2. 手動で名前解決してみる
    3. キャッシュの操作
  5. /etc/resolv.confとの関係
    1. スタブリゾルバーの仕組み
    2. 3つのresolv.confファイル
  6. 設定ファイルの編集方法
    1. メイン設定ファイル
    2. 特定のネットワーク向け設定
  7. DNS over TLS(DoT)の設定
    1. DNS over TLSを有効にする
    2. 動作確認
  8. トラブルシューティング:よくある問題と解決法
    1. 問題1:名前解決ができない
    2. 問題2:特定のドメインだけ解決できない
    3. 問題3:resolv.confが書き換わってしまう
    4. 問題4:DNSSECエラー
  9. systemd-resolvedを無効にする方法
    1. 完全に無効化する
    2. resolvconfやdnsmasqに切り替える
  10. 実用例:様々なシナリオでの活用
    1. シナリオ1:VPN接続時の設定
    2. シナリオ2:広告ブロックDNSの利用
    3. シナリオ3:開発環境での.localドメイン使用
  11. セキュリティのベストプラクティス
    1. DNS over TLSを有効にする
    2. DNSSECを有効にする
    3. 信頼できるDNSプロバイダーを使う
    4. 不要なプロトコルを無効化
  12. パフォーマンス最適化
    1. キャッシュサイズの調整
    2. 応答時間の監視
    3. 並列クエリの活用
  13. よくある質問
  14. まとめ:systemd-resolvedを使いこなそう

systemd-resolvedとは?基本を理解しよう

systemd-resolved(システムディー・リゾルブド)は、Linuxシステムでネットワークの名前解決を担当するサービスです。

名前解決って何?

インターネット上のサービスにアクセスするとき、私たちは「google.com」のような名前を使いますよね。でも、実際の通信には「142.250.196.78」のようなIPアドレスが必要です。

この「名前からIPアドレスへの変換」を名前解決と呼び、その仕組みをDNSリゾルバーと言います。

systemd-resolvedは、まさにこのDNSリゾルバーの役割を果たすんですよ。

systemdファミリーの一員

systemdはLinuxシステムの初期化システムで、様々なサービスを管理しています。

systemd-resolvedは、そのファミリーの一員として:

  • ネットワーク名の解決
  • DNSキャッシュの管理
  • セキュリティ機能の提供
  • 複数のネットワークインターフェースの統合管理

これらの機能を一手に引き受けているんです。


なぜsystemd-resolvedが必要になったの?

従来のLinuxでは、/etc/resolv.confにDNSサーバーを直接書き込む方式でした。

従来の方式の問題点

問題1:複数のネットワークへの対応が難しい

Wi-Fiと有線LANを同時に使う場合、どちらのDNSサーバーを使うべきか判断できませんでした。

問題2:VPN接続での混乱

VPNに接続すると、企業の内部DNSと一般のDNSが混在して、うまく名前解決できないことがありました。

問題3:動的な変更に弱い

ネットワーク環境が変わるたびに、手動で設定を変える必要がありましたね。

systemd-resolvedの解決策

複数のDNSソースを統合管理

各ネットワークインターフェースごとに異なるDNSサーバーを設定でき、適切に使い分けられます。

動的な設定変更に対応

NetworkManagerなどと連携して、ネットワーク環境が変わっても自動的に設定を更新しますよ。

キャッシュ機能で高速化

一度解決した名前をキャッシュして、次回からの応答を高速化します。

セキュリティ機能の統合

DNSSEC(DNSのセキュリティ拡張)にも対応しています。


systemd-resolvedの主な機能

このサービスには、便利な機能がたくさんあります。

DNS解決とキャッシング

基本的なDNS解決:

アプリケーションからの名前解決リクエストを受け取り、適切なDNSサーバーに問い合わせます。

インテリジェントなキャッシング:

頻繁にアクセスするドメイン名をキャッシュに保存し、応答時間を短縮しますね。

DNSSEC検証

DNSSECは、DNS応答が改ざんされていないことを検証する技術です。

systemd-resolvedは、このDNSSEC検証を自動的に行えます。セキュリティ意識の高い環境では重要な機能ですよ。

mDNS対応

mDNS(マルチキャストDNS)は、ローカルネットワーク内で名前解決するための仕組みです。

「printer.local」のようなローカル名を使えるようになります。特にホームネットワークで便利です。

LLMNR対応

LLMNR(Link-Local Multicast Name Resolution)は、Windowsネットワークでよく使われる名前解決の仕組みです。

異種OS混在環境で、相互に名前解決ができるようになりますね。


systemd-resolvedの基本的な使い方

実際にどう使うのか見ていきましょう。

状態の確認

現在の設定や状態を確認するには、以下のコマンドを使います。

# systemd-resolvedの状態確認
systemctl status systemd-resolved

# 詳細な解決情報を表示
resolvectl status

出力例:

Global
       Protocols: +LLMNR +mDNS +DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
     DNS Servers: 8.8.8.8
                  8.8.4.4

Link 2 (enp0s3)
    Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6
         Protocols: +DefaultRoute +LLMNR +mDNS +DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.1.1
       DNS Servers: 192.168.1.1

これで、どのDNSサーバーが使われているか一目で分かりますよ。

手動で名前解決してみる

特定のドメイン名を解決してテストできます。

# ドメイン名を解決
resolvectl query google.com

# 詳細情報も表示
resolvectl query google.com --verbose

出力例:

google.com: 142.250.196.78
           -- link: enp0s3
           -- Information acquired via protocol DNS in 23.4ms.

どのネットワークインターフェース経由で、どのくらいの時間で解決されたかが分かります。

キャッシュの操作

DNSキャッシュをクリアしたい場合もあります。

# キャッシュをフラッシュ
resolvectl flush-caches

# 統計情報を表示
resolvectl statistics

DNS関連のトラブルシューティングで役立ちますね。


/etc/resolv.confとの関係

systemd-resolvedを使っている環境では、/etc/resolv.confの扱いが特殊です。

スタブリゾルバーの仕組み

多くのディストリビューションでは、/etc/resolv.confはシンボリックリンクになっています。

# シンボリックリンクを確認
ls -l /etc/resolv.conf

典型的な出力:

lrwxrwxrwx 1 root root 39 Mar 15 10:23 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf

3つのresolv.confファイル

systemd-resolved環境には、実は3種類のファイルがあります。

stub-resolv.conf(推奨)

/run/systemd/resolve/stub-resolv.conf

ローカルのスタブリゾルバー(127.0.0.53)を指定します。ほとんどの場合、これを使うのが適切ですよ。

resolv.conf(動的生成)

/run/systemd/resolve/resolv.conf

現在使用中の実際のDNSサーバーのリストです。レガシーなアプリケーション用に用意されています。

static resolv.conf(フォールバック)

/etc/systemd/resolved.conf

設定ファイルで、デフォルトのDNSサーバーなどを指定できます。


設定ファイルの編集方法

systemd-resolvedの動作をカスタマイズしたい場合は、設定ファイルを編集します。

メイン設定ファイル

sudo nano /etc/systemd/resolved.conf

主な設定項目:

[Resolve]
# グローバルDNSサーバー
DNS=8.8.8.8 8.8.4.4
#FallbackDNS=1.1.1.1 1.0.0.1

# ドメイン
#Domains=

# DNSSEC検証
DNSSEC=allow-downgrade

# DNS over TLS
#DNSOverTLS=no

# mDNSを有効化
#MulticastDNS=yes

# LLMNRを有効化
#LLMNR=yes

# キャッシュサイズ
#Cache=yes
#CacheFromLocalhost=no

# DNSスタブリゾルバー
#DNSStubListener=yes

編集後は、サービスを再起動します。

sudo systemctl restart systemd-resolved

特定のネットワーク向け設定

NetworkManagerを使っている場合、接続ごとにDNSを設定できます。

# GUI設定(Ubuntu/Gnome)
# 設定 → ネットワーク → 接続の設定 → IPv4/IPv6タブ → DNS

# CLIでの設定(nmcli)
nmcli connection modify "接続名" ipv4.dns "8.8.8.8 8.8.4.4"
nmcli connection up "接続名"

VPNや企業ネットワークでは、この方法が便利ですね。


DNS over TLS(DoT)の設定

systemd-resolvedは、暗号化されたDNS通信もサポートしています。

DNS over TLSを有効にする

設定ファイルで有効化します。

sudo nano /etc/systemd/resolved.conf
[Resolve]
DNS=1.1.1.1#cloudflare-dns.com 8.8.8.8#dns.google
DNSOverTLS=opportunistic

モードの説明:

モード説明
noDNS over TLSを使用しない
opportunistic可能なら使用(推奨)
yes必ず使用(サーバーが対応していない場合は失敗)

設定を反映します。

sudo systemctl restart systemd-resolved

動作確認

DNS over TLSが使われているか確認しましょう。

resolvectl status

+DNSOverTLSと表示されていればOKです。


トラブルシューティング:よくある問題と解決法

systemd-resolvedで問題が起きたときの対処法を紹介します。

問題1:名前解決ができない

症状:

インターネットに接続できない、Webサイトが開けない。

確認手順:

# systemd-resolvedが動作しているか確認
systemctl status systemd-resolved

# 手動で解決を試みる
resolvectl query google.com

# ログを確認
journalctl -u systemd-resolved -n 50

解決策:

# サービスを再起動
sudo systemctl restart systemd-resolved

# キャッシュをクリア
resolvectl flush-caches

問題2:特定のドメインだけ解決できない

症状:

社内サーバーや.localドメインが解決できない。

原因:

VPNやスプリットDNSの設定が不適切な可能性があります。

解決策:

# 現在の設定を確認
resolvectl status

# 特定のドメインに対するDNSサーバーを指定
resolvectl dns インターフェース名 DNSサーバーIP
resolvectl domain インターフェース名 ドメイン名

例:

# tun0インターフェースで会社のDNSを使用
sudo resolvectl dns tun0 10.0.0.1
sudo resolvectl domain tun0 company.local

問題3:resolv.confが書き換わってしまう

症状:

/etc/resolv.confを編集しても、すぐに元に戻ってしまう。

原因:

systemd-resolvedが自動管理しているためです。

解決策:

直接編集するのではなく、正しい設定方法を使いましょう。

# systemd-resolved用の設定ファイルを編集
sudo nano /etc/systemd/resolved.conf

# または、NetworkManagerで設定
nmcli connection modify "接続名" ipv4.dns "8.8.8.8"

問題4:DNSSECエラー

症状:

「DNSSEC validation failed」というエラーが出る。

原因:

DNSサーバーがDNSSECに対応していないか、設定に問題があります。

一時的な解決策:

sudo nano /etc/systemd/resolved.conf
[Resolve]
DNSSEC=no
sudo systemctl restart systemd-resolved

ただし、これはセキュリティを下げるので、本番環境では注意が必要です。


systemd-resolvedを無効にする方法

どうしても従来の方式に戻したい場合の手順です。

完全に無効化する

# systemd-resolvedを停止・無効化
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

# シンボリックリンクを削除
sudo unlink /etc/resolv.conf

# 手動でresolv.confを作成
sudo nano /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
# 編集を防ぐため、属性を変更(オプション)
sudo chattr +i /etc/resolv.conf

resolvconfやdnsmasqに切り替える

別のDNS管理ツールを使うこともできます。

# resolvconfをインストール(Ubuntu/Debian)
sudo apt install resolvconf

# または、dnsmasqをインストール
sudo apt install dnsmasq

ただし、最近のディストリビューションはsystemd-resolvedを前提に設計されているため、無効化すると一部の機能が使えなくなる可能性があることに注意しましょう。


実用例:様々なシナリオでの活用

実際の使用場面を見てみましょう。

シナリオ1:VPN接続時の設定

VPNで会社に接続したとき、社内DNSを使いたい場合です。

# VPN接続を確立
sudo openvpn --config company.ovpn

# VPNインターフェース(tun0)にDNSを設定
sudo resolvectl dns tun0 10.0.0.53
sudo resolvectl domain tun0 ~company.local

# 確認
resolvectl status tun0

これで、server.company.localのような社内ドメインが解決できるようになります。

シナリオ2:広告ブロックDNSの利用

AdGuard DNSなどを使って、広告をブロックしたい場合です。

sudo nano /etc/systemd/resolved.conf
[Resolve]
DNS=94.140.14.14 94.140.15.15
DNSOverTLS=opportunistic
sudo systemctl restart systemd-resolved

システム全体で広告がブロックされるようになりますよ。

シナリオ3:開発環境での.localドメイン使用

ローカル開発で「project.local」のようなドメインを使いたい場合です。

sudo nano /etc/systemd/resolved.conf
[Resolve]
MulticastDNS=yes
LLMNR=yes
sudo systemctl restart systemd-resolved

これで、Avahi(mDNSデーモン)と連携して、ローカル名が使えるようになります。


セキュリティのベストプラクティス

systemd-resolvedを安全に使うためのポイントです。

DNS over TLSを有効にする

通信を暗号化することで、DNSスプーフィング攻撃を防げます。

[Resolve]
DNS=1.1.1.1#cloudflare-dns.com
DNSOverTLS=opportunistic

DNSSECを有効にする

DNS応答の改ざんを検出できるようになります。

[Resolve]
DNSSEC=allow-downgrade

allow-downgradeは、対応していないサーバーでも動作するモードです。

信頼できるDNSプロバイダーを使う

プライバシーポリシーが明確で、信頼できるDNSサービスを選びましょう。

推奨サービス:

  • Cloudflare(1.1.1.1)
  • Google Public DNS(8.8.8.8)
  • Quad9(9.9.9.9)

不要なプロトコルを無効化

LLMNRは攻撃に悪用される可能性があるため、必要なければ無効にします。

[Resolve]
LLMNR=no

パフォーマンス最適化

systemd-resolvedのパフォーマンスを向上させる方法です。

キャッシュサイズの調整

デフォルトでは、約4096エントリがキャッシュされます。

# 統計情報を確認
resolvectl statistics

キャッシュヒット率が低い場合は、設定ファイルで調整できます。

[Resolve]
Cache=yes

応答時間の監視

各DNSサーバーの応答時間を確認して、遅いサーバーを除外しましょう。

# 詳細情報を表示
resolvectl query google.com --verbose

並列クエリの活用

複数のDNSサーバーを設定すると、並列にクエリが送信されて高速化します。

[Resolve]
DNS=8.8.8.8 8.8.4.4 1.1.1.1

よくある質問

Q: systemd-resolvedは必須?無効にしても大丈夫?

A: 必須ではありませんが、無効にすると一部の機能(VPNのスプリットDNSなど)が使いにくくなります。特別な理由がなければ、有効にしておくことをおすすめしますよ。

Q: キャッシュはどのくらいの期間保持される?

A: DNS応答に含まれるTTL(Time To Live)値に従います。一般的には数分〜数時間ですが、ドメインによって異なりますね。

Q: systemd-resolvedとdnsmasqの違いは?

A: どちらもローカルDNSキャッシュですが、systemd-resolvedはsystemdと統合されていて、現代的な機能(DNS over TLS、DNSSECなど)をサポートしています。dnsmasqはシンプルで軽量ですが、機能は限定的です。

Q: Docker環境での注意点は?

A: Dockerは独自のDNS解決を行うため、systemd-resolvedとコンフリクトすることがあります。Dockerが127.0.0.53を使えるよう設定を調整する必要がある場合があります。

Q: 複数のネットワークインターフェースがある場合は?

A: systemd-resolvedは自動的に最適なDNSサーバーを選択します。各インターフェースに異なるDNS設定をすることもできますよ。


まとめ:systemd-resolvedを使いこなそう

systemd-resolvedについて、重要なポイントをおさらいします。

今日学んだこと:

  • systemd-resolvedは現代的なDNSリゾルバー
  • 複数のネットワークを統合管理できる
  • DNSSEC、DNS over TLS、mDNSをサポート
  • /etc/resolv.confは自動管理される
  • resolvectlコマンドで状態確認・操作
  • 設定は/etc/systemd/resolved.confで行う
  • VPNやスプリットDNSにも対応
  • セキュリティとパフォーマンスの両立が可能

systemd-resolvedは、一見複雑に見えますが、実は非常に便利なツールです。

特に、複数のネットワークを切り替えながら使うノートPCや、VPNを頻繁に使う環境では、その真価を発揮しますよ。従来の方式に比べて、設定が自動化されて手間が減るだけでなく、セキュリティも向上するんです。

最初は戸惑うかもしれませんが、基本的な使い方を覚えてしまえば、快適なLinux生活が待っています。ぜひ、今日学んだ知識を活かして、systemd-resolvedを使いこなしてみてください!


関連記事:

  • NetworkManagerの基本と設定方法
  • VPN接続の設定とトラブルシューティング
  • Linuxのネットワーク診断コマンド集

コメント

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