systemd-resolved

From ArchWiki
Jump to navigation Jump to search

関連記事

systemd-resolvedD-Bus インターフェイスと resolve NSS サービス (nss-resolve(8))、127.0.0.53 のローカル DNS スタブリスナによるネットワーク名前解決をローカルアプリケーションに提供する systemd サービスです。使用方法については systemd-resolved(8) を見てください。

インストール

systemd-resolvedsystemd パッケージに含まれておりデフォルトでインストールされています。

設定

systemd-resolvedDomain Name System (DNS) (DNSSECDNS over TLS を含む) と Multicast DNS (mDNS) そして Link-Local Multicast Name Resolution (LLMNR) のリゾルバサービスを提供します。

リゾルバは /etc/systemd/resolved.conf を編集するか、あるいは /etc/systemd/resolved.conf.d/ のドロップイン .conf ファイルで設定できます。resolved.conf(5) を参照してください。

systemd-resolved を使うには systemd-resolved.service起動有効化してください。

ヒント: systemd#特定のサービスの問題を診断に書かれているようにして systemd-resolved のデバッグ情報を有効にすることで、挙動を理解することができます。

DNS

systemd-resolvedドメイン名前解決を処理する4つのモードを備えています (4つのモードについては systemd-resolved(8) に説明があります)。ここでは重要な2つのモードについて説明します。

  1. systemd の DNS スタブファイルを使う - systemd の DNS スタブファイル /run/systemd/resolve/stub-resolv.conf にはローカススタブ 127.0.0.53 が唯一の DNS サーバーとして含まれ、検索ドメインのリストが記載されています。これは推奨されている動作モードです。サービスユーザーは /etc/resolv.conf ファイルを systemd-resolved によって管理されるローカルのスタブ DNS リゾルバファイル /run/systemd/resolve/stub-resolv.conf に転送することが推奨されます。これにより全てのクライアントについて systemd が設定を管理するようになります。/etc/resolv.conf を systemd スタブのシンボリックリンクに置き換えることで設定できます:
    # ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
  2. resolv.conf を保護 - このモードでは /etc/resolv.conf は維持され systemd-resolved はこのファイルのクライアントになります。このモードでは他のパッケージで /etc/resolv.conf を管理できるため作用を抑えられます。
ノート: systemd-resolved の動作モードは /etc/resolv.conf がローカルスタブ DNS リゾルバファイルのシンボリックリンクになっているか、あるいはサーバー名が含まれているかどうかによって自動的に検出されます。

DNS サーバーの設定

ヒント: systemd-resolved によって DNS が使われているかチェックするには、以下のコマンドを使用:
$ resolvectl status
自動

systemd-resolved/etc/resolv.conf によってネットワークマネージャでは自動的に使用されます。systemd-resolved/etc/resolv.conf シンボリックリンクで認識されるため特に設定は必要ありません。systemd-networkdNetworkManager がその場合に該当します。

ただし DHCPVPN クライアントが resolvconf プログラムを使用して名前サーバーや検索ドメインを設定する場合 (resolvconf を使用するソフトウェアの一覧については openresolv#使用プログラムを見てください)、/usr/bin/resolvconf シンボリックリンクを作るために追加パッケージ systemd-resolvconf が必要です。

ノート: systemd-resolvedresolvconf インターフェイスには制限がありクライアントによっては動作しない可能性があります。詳しくは resolvectl(1) を参照。
手動

ローカル DNS スタブモードでは、resolved.conf(5) ファイルで別の DNS サーバーが提供されます:

/etc/systemd/resolved.conf.d/dns_servers.conf
[Resolve]
DNS=91.239.100.100 89.233.43.71
ノート: ネットワークマネージャはそれぞれ独自に DNS 設定を保持しており systemd-resolved のデフォルト設定を上書きしてしまうことがあります。
フォールバック

systemd-resolvedネットワークマネージャから DNS サーバーアドレスを受信できず手動でも DNS サーバーが設定されていない場合、DNS 解決が常に機能するように systemd-resolved はフォールバック DNS アドレスにフォールバックします。

ノート: フォールバック DNS は次の順番で使われます: Cloudflare, Quad9 (フィルタリングや DNSSEC なし), Google。サーバーがどこに定義されているかどうかは systemd の PKGBUILD を見てください。

resolved.conf(5)FallbackDNS= を設定することでフォールバックのアドレスは変更できます。例:

/etc/systemd/resolved.conf.d/fallback_dns.conf
[Resolve]
FallbackDNS=127.0.0.1 ::1

フォールバック DNS 機能を無効化したい場合は特にアドレスを指定せずに FallbackDNS オプションを設定してください:

/etc/systemd/resolved.conf.d/fallback_dns.conf
[Resolve]
FallbackDNS=

DNSSEC

デフォルトでは、上流の DNS サーバーが DNSSEC をサポートしている場合のみ、DNSSEC 検証が有効になります。常に DNSSEC を確認したい場合 (DNSSEC をサポートしていない名前サーバーでは DNS 解決ができなくなります)、DNSSEC=true を設定してください:

/etc/systemd/resolved.conf.d/dnssec.conf
[Resolve]
DNSSEC=true
ヒント: DNS サーバーが DNSSEC をサポートしておらずデフォルトの allow-downgrade モードでは問題が発生するとき (例: systemd issue 10579)、DNSSEC=false を設定することで systemd-resolved の DNSSEC サポートを明示的に無効化できます。

不正な署名のドメインを問い合わせて DNSSEC 検証をテスト:

$ resolvectl query sigfail.verteiltesysteme.net
sigfail.verteiltesysteme.net: resolve call failed: DNSSEC validation failed: invalid

正しい署名を使っているドメインをテスト:

$ resolvectl query sigok.verteiltesysteme.net
sigok.verteiltesysteme.net: 134.91.78.139

-- Information acquired via protocol DNS in 266.3ms.
-- Data is authenticated: yes

DNS over TLS

警告: systemd-resolved only validates the DNS server certificate if it is issued for the server's IP address (a rare occurrence). DNS server certificates without an IP address are not checked making systemd-resolved vulnerable to man-in-the-middle attacks. See systemd issue 9397.

DNS over TLS はデフォルトでは無効になっています。有効にするには resolved.conf(5)[Resolve] セクションの DNSOverTLS= 設定を変更してください:

/etc/systemd/resolved.conf.d/dns_over_tls.conf
[Resolve]
DNSOverTLS=yes
ノート: 使用する DNS サーバーが DNS over TLS をサポートしていない場合、DNS リクエストが全て失敗するようになります。

mDNS

systemd-resolvedマルチキャスト DNS リゾルバ・レスポンダとして使えます。

リゾルバは "hostname.local" 命名規則によるホストネーム解決を提供します。

mDNS は systemd-resolved の全体設定 (resolved.conf(5)MulticastDNS=) とネットワークマネージャの接続毎の設定の両方が有効になっている場合にのみ使われます。デフォルトで systemd-resolved は mDNS レスポンダを有効にしますが systemd-networkdNetworkManager はどちらも接続毎の設定で有効にしません:

  • systemd-networkd の場合、[Network] セクションに MulticastDNS= 設定があります。systemd.network(5) を見てください。
  • NetworkManager の場合、設定は [connection] セクションの mdns= です。利用可能な値: 0 - 無効, 1 - リゾルバのみ, 2 - リゾルバとレスポンダ [1]
ノート: If Avahi をインストールしている場合、systemd-resolved と衝突しないようにするため avahi-daemon.serviceavahi-daemon.socket無効化してください。
ヒント: NetworkManager の接続設定は /etc/NetworkManager/conf.d/ に設定ファイルを作成して [connection] セクションで connection.mdns= を設定することで設定できます。例えば以下の設定で全ての接続で mDNS リゾルバが有効になります:
/etc/NetworkManager/conf.d/mdns.conf
[connection]
connection.mdns=1

NetworkManager.conf(5) を見てください。

mDNS とファイアウォールを使う場合は、UDP ポート 5353 が開いていることを確認してください。

LLMNR

Link-Local Multicast Name Resolution は Microsoft によって作られたホストネーム解決プロトコルです。

LLMNR は systemd-resolved の全体設定 (resolved.conf(5)LLMNR=) とネットワークマネージャの接続毎の設定の両方が有効になっている場合にのみ使われます。デフォルトで systemd-resolved は LLMNR レスポンダを有効にし、systemd-networkdNetworkManager は接続の設定も有効にします。

  • systemd-networkd の場合、設定は [Network] セクションの LLMNR= です。systemd.network(5) を見てください。
  • NetworkManager の場合、[connection] セクションの llmnr= が設定です。nm-settings(5) を見てください。利用可能な値: 0 - 無効化, 1 - リゾルバのみ, 2 - リゾルバとレスポンダ。
ヒント: NetworkManager の接続設定は /etc/NetworkManager/conf.d/ に設定ファイルを作成して [connection] セクションで connection.llmnr= を設定することで設定できます。例えば以下の設定で全ての接続で LLMNR が無効になります:
/etc/NetworkManager/conf.d/llmnr.conf
[connection]
connection.llmnr=0

NetworkManager.conf(5) を参照。

LLMNR とファイアウォールを使う場合、UDP と TCP のポート 5355 を開いてください。

検索

DNS レコードや mDNS あるいは LLMNR ホストを問い合わせるには resolvectl ユーティリティを使います。

例えば DNS レコードを確認するには:

$ resolvectl query archlinux.org
archlinux.org: 2a01:4f8:172:1d86::1
               138.201.81.199

-- Information acquired via protocol DNS in 48.4ms.
-- Data is authenticated: no

resolvectl(1) には他の例が存在します。