systemd-resolved
systemd-resolved は D-Bus インターフェイスと resolve
NSS サービス (nss-resolve(8))、127.0.0.53
のローカル DNS スタブリスナによるネットワーク名前解決をローカルアプリケーションに提供する systemd サービスです。使用方法については systemd-resolved(8) を見てください。
目次
インストール
systemd-resolved はデフォルトでインストールされる systemd パッケージの一部です。
設定
systemd-resolved は Domain Name System (DNS) (DNSSEC と DNS 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
を起動・有効化してください。
DNS
systemd-resolved はドメイン名前解決を処理する4つのモードを備えています (4つのモードについては systemd-resolved(8) § /ETC/RESOLV.CONF に説明があります)。ここでは重要な2つのモードについて説明します。
- 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
- resolv.conf を保護 - このモードでは
/etc/resolv.conf
は維持され systemd-resolved はこのファイルのクライアントになります。このモードでは他のパッケージで/etc/resolv.conf
を管理できるため作用を抑えられます。
DNS サーバーの設定
自動
systemd-resolved は /etc/resolv.conf
によってネットワークマネージャでは自動的に使用されます。systemd-resolved は /etc/resolv.conf
シンボリックリンクで認識されるため特に設定は必要ありません。systemd-networkd や NetworkManager がその場合に該当します。
ただし DHCP や VPN クライアントが resolvconf プログラムを使用して名前サーバーや検索ドメインを設定する場合 (resolvconf を使用するソフトウェアの一覧については openresolv#使用プログラムを見てください)、/usr/bin/resolvconf
シンボリックリンクを作るために追加パッケージ systemd-resolvconf が必要です。
手動
ローカル DNS スタブモードでは、resolved.conf(5) ファイルで別の DNS サーバーが提供されます:
/etc/systemd/resolved.conf.d/dns_servers.conf
[Resolve] DNS=192.168.35.1 fd7b:d0bd:7a6e::1 Domains=~.
フォールバック
systemd-resolved がネットワークマネージャから DNS サーバーアドレスを受信できず手動でも DNS サーバーが設定されていない場合、DNS 解決が常に機能するように systemd-resolved はフォールバック DNS アドレスにフォールバックします。
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
不正な署名のドメインを問い合わせて 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
DNS over TLS はデフォルトでは無効になっています。有効にするには resolved.conf(5) の [Resolve]
セクションの DNSOverTLS=
設定を変更してください。To enable validation of your DNS provider's server certificate, include their hostname in the DNS=
setting in the format ip_address#hostname
. For example:
/etc/systemd/resolved.conf.d/dns_over_tls.conf
[Resolve] DNSOverTLS=yes
ngrep can be used to test if DNS over TLS is working since DNS over TLS always uses port 853 and never port 53. The command ngrep port 53
should produce no output when a hostname is resolved with DNS over TLS and ngrep port 853
should produce encrypted output.
Wireshark can be used for more detailed packet inspection of DNS over TLS queries.
mDNS
systemd-resolved は マルチキャスト DNS リゾルバ・レスポンダとして使えます。
リゾルバは "hostname.local" 命名規則によるホストネーム解決を提供します。
mDNS は systemd-resolved の全体設定 (resolved.conf(5) の MulticastDNS=
) とネットワークマネージャの接続毎の設定の両方が有効になっている場合にのみ使われます。デフォルトで systemd-resolved は mDNS レスポンダを有効にしますが systemd-networkd と NetworkManager はどちらも接続毎の設定で有効にしません:
- systemd-networkd の場合、
[Network]
セクションにMulticastDNS=
設定があります。systemd.network(5) を見てください。 - NetworkManager の場合、設定は
[connection]
セクションのmdns=
です。利用可能な値:0
- 無効,1
- リゾルバのみ,2
- リゾルバとレスポンダ [1]。
mDNS とファイアウォールを使う場合は、UDP ポート 5353
が開いていることを確認してください。
LLMNR
Link-Local Multicast Name Resolution は Microsoft によって作られたホストネーム解決プロトコルです。
LLMNR は systemd-resolved の全体設定 (resolved.conf(5) の LLMNR=
) とネットワークマネージャの接続毎の設定の両方が有効になっている場合にのみ使われます。デフォルトで systemd-resolved は LLMNR レスポンダを有効にし、systemd-networkd と NetworkManager は接続の設定も有効にします。
- systemd-networkd の場合、設定は
[Network]
セクションのLLMNR=
です。systemd.network(5) を見てください。 - NetworkManager の場合、
[connection]
セクションのllmnr=
が設定です。nm-settings(5) を見てください。利用可能な値:0
- 無効化,1
- リゾルバのみ,2
- リゾルバとレスポンダ。
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) § EXAMPLES には他の例が存在します。
トラブルシューティング
system-resolved がローカルドメインを検索しない
systemd-resolved は、 UseDomains = yes
または Domains=[domain-list]
が存在する場合でも、ホスト名のみが指定されているとローカルドメインを検索しない場合があります。適切な systemd-networkdの .network ファイルにあり、そのファイルは resolv.conf
によって search[domain-list]
を生成します。 networkctlstatus
または resolvectl status
を実行して、検索ドメインが実際に取得されているかどうかを確認できます。
考えられる回避策:
- LLMNR を無効にすると、「systemd-resolved」がすぐに DNS サフィックスの追加を続行できるようになります。
/etc/nsswitch.conf
のhosts
データベースをトリミングします (たとえば、resolve service の
)[!UNAVAIL=return]
オプションを削除します- 完全修飾ドメイン名の使用に切り替えます。
- ホスト名を解決するには
/etc/hosts
を使用します。 - systemdの
resolve
を使用する代わりに、 glibc のdns
を使用するようにフォールバックします。
systemd-resolved がサフィックスがないホスト名を解決できない
完全修飾ドメイン名ではないシステム解決ホスト名を解決するには、 R olveUnicastSingleLabel=yes
を /etc/systemd/resolved.conf
に追加します。
これは、 LLMR がディセーブル (LLMR=no
) の場合にのみ発生するようです。
systemd-networkd を使用している場合、DHCP サーバーまたは IPv6 ルーター通知によって提供されるドメインを検索ドメインとして使用できます。デフォルトでは無効になっており、インターフェイスの .network ファイルに追加して有効にします。
[DHCPv4] UseDomains=true [IPv6AcceptRA] UseDomains=yes
各インターフェイスの systemd-resolved の内容を確認するには、次のコマンドを使用します。
$ resolvectl domain