DNSの問題を解決するためにsystemd-resolvedを使用する方法は?

DNSの問題を解決するためにsystemd-resolvedを使用する方法は?

systemd-resolvedトラブルシューティングに使用しているDNSサーバーを見つける方法は?

dig通常、に示されているDNSサーバーを使用してテストできます/etc/resolv.conf。 (またはWindows - ipconfig /all+ nslookup)。ただし、resolv.confがループバックアドレスのローカルリゾルバデーモンのみを指している場合、この方法は機能しません。使用しているDNSサーバーを表示するためにsystemd-resolvedでどのような方法が使用されますか?


unbound私が見ることができる設定ファイルがあり dnsmasqますが、設定ファイルなしでサーバーを動的に追加できるかどうかはわかりません。NetworkManagerにもそのファイルがあり、インターフェイスのDNS設定を表示するようにnmcliクエリできます。nmcli d show wlan0

答え1

また、トラブルシューティングにも非常に便利です。

journalctl -u systemd-resolved -f

systemd-resolvedそこで実際に何が起こっているのかを見ることができます。私の場合、systemd-resolve --status報告されたDNSサーバーにまったくアクセスしませんでした。そのような奇妙なことをしている場合は、時には再起動することをお勧めしますsudo systemctl restart systemd-resolved

編集する:

より多くの情報を得るためにresolved必要

[Service]
Environment=SYSTEMD_LOG_LEVEL=debug

経由でoverride.conf入力systemd-resolved

sudo systemctl edit systemd-resolved

再起動が適用されます。

sudo systemctl restart systemd-resolved

編集2:

@bmaupinと@Aminovicがコメントで指摘したように、後でこれを元に戻すことを忘れないでください。

sudo systemctl revert systemd-resolved
sudo systemctl restart systemd-resolved

答え2

使用済みresolvectl statussystemd-resolve --statusこれより前に使用された場合239)あなたの姿を見せるためにグローバルおよびリンクごとのDNS設定

答え3

resolv.conf書類

このマニュアルには次のように記載されています。

リゾルバは、インターネット上のドメインネームシステム(DNS)へのアクセスを提供するCライブラリの一連のルーチンです。パーサー構成ファイルには、プロセスがパーサールーチンを初めて呼び出すときに読み取る情報が含まれています。

ファイルが存在しない場合は、ローカルシステムのネームサーバーのみが照会され、検索リストにはホスト名で決定されたローカルドメイン名が含まれます。

systemd-resolved

Ubuntu 20.04にはsystemd-resolvedローカルDNSサーバーが含まれています。systemd/etc/resolv.confこれは、編集に自動的に正しい設定を使用する必要があるスタブリゾルバとして機能します。

以前のバージョンでは、以下を使用して手動でシンボリックリンクする必要があります。

$ sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

デフォルトでは、systemd-resolvedローカルDNSサーバーのリスニング127.0.0.53ポートが設定されており、53それを実行lsof -i @127.0.0.53:53して確認できます。dnsmasq同じアドレスとポートでリッスンする他のサービスがないことを確認してください。

これはループバックインターフェイスですが、ループバック127.0.0.53インターフェイスの他のIPアドレスからポート53をリッスンする別のDNSサーバーを持つことができます127.0.0.1127.0.0.2

それでも問題が解決しない場合は、以下を試してください。

$ sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

このファイルには DHCP リースの DNS サーバーが含まれていますが、スタブリゾルバーのキャッシュ機能の利点はありません。

dnsmasqそしてNetworkManager

これdnsmasq軽量キャッシュ DNS サーバーは DNS クエリを受け入れ、小規模なローカル キャッシュから応答するか、実際の再帰 DNS サーバーに転送します。

Web開発マシンには、ローカルWebサイトをテストできる小さなDNSサービスをお勧めします。

まず、NetworkManager現在のインターフェイスの管理を確認します(wlp0s20f3私の場合)。

$ nmcli dev
$ nmcli dev set wlp0s20f3 managed yes

これでNetworkManager組み込みdnsmasqパーサーを有効にできます。

$ cat /etc/NetworkManager/NetworkManager.conf
[main]
dns=dnsmasq

NetworkManagerdnsmasqこれで、次の設定で柔軟性の利点を享受できます/etc/NetworkManager/dnsmasq.d

$ cat /etc/NetworkManager/dnsmasq.d/custom.conf
# Resolve all domains ending in .dev to 127.0.0.1
address=/.dev/127.0.0.1

dnsmasqシステム全体のサービス(存在する場合)を無効にし、変更を適用することを忘れないでください。

$ sudo systemctl stop dnsmasq.service && sudo systemctl disable dnsmasq.service
$ sudo systemctl restart NetworkManager.service

dnsmasq何らかの理由で単独で実行する前に、NetworkManager上書きを避ける必要があります/etc/resolv.conf

$ cat /etc/NetworkManager/NetworkManager.conf
[main]
dns=none

dnsmasqこれで、アップストリームサーバーに他の場所からインポートするように指示する必要があります/etc/resolv.conf

$ cat /etc/dnsmasq.conf
listen-address=127.0.0.53
resolv-file=/run/NetworkManager/resolv.conf

このファイルは DHCP リースで生成され、NetworkManagerDNS サーバーも含まれます。これでdnsmasqソリューションを設定します。

$ cat /etc/resolv.conf
# Use local dnsmasq resolver
nameserver 127.0.0.53

独自のローカルDNS設定を構成します。

$ cat /etc/dnsmasq.d/custom.conf
# Resolve all domains ending in .dev to 127.0.0.1
address=/.dev/127.0.0.1

新しい設定を適用します。

$ sudo systemctl stop systemd-resolved.service && sudo systemctl disable systemd-resolved.service
$ sudo systemctl restart dnsmasq.service

dnsmasqそしてsystemd-networkd

残念ながら、DHCPサーバーによって管理されているため、DHCPサーバーから取得したDNSネームサーバーファイルを公開しないため、NetworkManager使用は簡単ではありません。systemd-networkdsystemd-resolved

完全に使用されていないパッケージを使用しても同様ですifupdown

開いている:mandhclient-script

$ man 8 dhclient-script

これつながる部分的には次のように言います。

クライアントスクリプトが起動されると、最初に後でmake_resolv_confファイル/etc/resolv.confを生成するために使用されるシェル関数を定義します。デフォルトの動作をオーバーライドするには、Enter フックスクリプトでこの関数をオーバーライドします。

dnsmasqしたがって、まだ一緒に使用するには、DHCP設定からアップストリームサーバーを取得できるようにforを作成するようにsystemd-networkd上書きする必要があります。make_resolv_confresolv-filednsmasq

これresolvconfパッケージは、アクションの/etc/resolv.conf設定に使用できるPopulationに関連するさまざまなデーモンの周りにラッパーインターフェイスを提供します。make_resolv_conf


ルーター広告メッセージのRDNSSからIPv6アップストリームサーバーをインポートする必要がある場合でも、同じ問題が発生します(参照:近隣検索プロトコル)、これも管理されるからですsystemd-resolved

次のコマンドを試してください。ndisc6パック:

$ rdisc6 wlp0s20f3

IPv6 アドレスプレフィックスや DNS サーバーなど、ルーターのさまざまな情報が表示されます。何も表示されない場合は、ルータがそれをサポートしていない可能性があります。

このrdisc6プログラムは、以下を使用してユーザ空間でICMPv6ルータ検索を実装します。NETLINK_ROUTERDNSSソケットのサポートはLinuxカーネル2.6.24に追加されました。以前のバージョンをサポートするには、次を使用してOSIレイヤ2デバイスドライバと対話する必要があります。SOCK_RAWソケット。

答え4

ここへの答えのどれも私の仕事に近づいていませんでしたsystemd-resolved。すべての問題を解決する1つの方法systemd-resolvedは、方程式から問題を取り除くことです。

まず、これを無効にします(root):

service systemd-resolved stop
systemctl disable systemd-resolved

しかし、これだけでは十分ではありません。 Systemdはそれを再度有効にし、数分後に再起動します。したがって、systemd-resolvedサーバーから完全に削除してこれを防ぐ必要があります。

rm -f /lib/systemd/systemd-resolved

私はこれを行うsystemdの他の部分で問題が発生したことはありませんが、YMMVです。削除する代わりに名前を変更できます。

最後に、/etc/resolv.conf一部のネームサーバーを編集して追加します。

nameserver 8.8.8.8
nameserver 8.8.4.4

関連情報