web-dev-qa-db-ja.com

NetworkManagerが設定したdnsmasqがリクエストの転送に失敗する

新しいネットワークに接続すると、NetworkManagerサービス(サブシステム?)がいくつかの構成アクションを実行するLubuntu 17.04を使用しています。これらの1つは、/etc/resolv.confファイルを(再)設定することです。

# Generated by NetworkManager
search some-local-domain-here
nameserver 127.0.1.1

少なくとも、DHCPを使用しているときにそれが得られます。ローカルホストでリッスンするdnsmasqインスタンスがあります(詳細については、以下を参照してください)。

現在、一部のネットワークでは、かなり一貫して、この状況では名前を解決できません。しかし、nameserver行をDHCPリースから取得した実際のネームサーバーのアドレス(/var/lib/NetworkManager/dhclient-blah-blah.wlan0.lease)に置き換えると、解決は正常に機能します。

質問:

  • この問題の原因は何でしょうか?
  • NetworkManagerで設定されたdnsmasqがDHCPが提供するDNSサーバーに名前解決要求を実際に転送するように強制するにはどうすればよいですか? (これはsometimesですでに実行されていることに注意してください-この問題が発生しない場合)

追加情報:

ローカルDNSサーバーはdnsmasqインスタンスで、次のコマンドラインがあります。

/usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/NetworkManager/dnsmasq.pid --listen-address=127.0.1.1 --cache-size=0 --clear-on-reload --conf-file=/dev/null --proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d

構成ディレクトリ/etc/NetworkManager/dnsmasq.dには単一のファイルがあり、その内容は次のとおりです。

# Tell any system-wide dnsmasq instance to make sure to bind to interfaces
# instead of listening on 0.0.0.0
# WARNING: changes to this file will get lost if network-manager is removed.
bind-interfaces
6
einpoklum

最近のDebian関連のディストリビューションのほとんどは、直接編集するのではなく、/sbin/resolvconfツールを使用して/etc/resolv.confを構成する傾向があります。このツールは、各インターフェースで受信したDNSサーバー情報を追跡し、ファイル/etc/resolvconf/interface-orderで指定された順序に従ってDNSサーバー設定に優先順位を付けます。

このようにして、Wi-FiをオンにしたときにDNSサーバー設定の1つのセットを取得し、ネットワークケーブルを接続するときに別のセットを取得し、VPN接続を開始するときに3番目の設定を取得して、混乱した構成にならなくなる厳密に逆の順序でこれらをシャットダウンしたとき。また、この状況では、実際の/etc/resolv.confの制御を争う2つの異なるメカニズム(NetworkManagerとdnsmasqなど)を取得できます。

ただし、resolvconfはオプションパッケージです。 /sbin/resolvconfがシステムに存在しない場合、/etc/resolv.confがNetworkManagerの直接制御下にある可能性があります。しかし、dnsmasqパッケージ内のほとんどのスクリプトは、/sbin/resolvconfが存在することを前提として記述されているようです。これがないと、すべての状況を適切にカバーできないフォールバックに依存していることになります。 apt-get install resolvconfまたは同様のものでインストールしてみて、DNS設定がインストールされた状態でどのように動作するかを確認してください。

resolvconfパッケージがインストールされていない場合は、NetworkManagerがそれ自体ですべてを実行することになります。その場合、トラブルシューティングでは、NetworkManagerのソースコードを読んで、使用するDNS設定を実際に決定する方法を確認する必要があります。 resolvconfの不透明度ははるかに低くなります。

(L)Ubuntu Zesty(17.04)でdnsmasqが起動すると、その起動スクリプトで次のコマンドが実行されます(resolvconfパッケージがインストールされていると想定)。

echo "nameserver 127.0.0.1" | /sbin/resolvconf -a lo.dnsmasq

これは/sbin/resolvconfに、新しいDNSネームサーバーがインターフェイスloで利用可能になったことを通知し、実際の/etc/resolv.confを更新します。

/etc/resolv.confのこの(または任意の)更新が行われている間、/sbin/resolvconf/etc/resolvconf/update.dにあるすべてのスクリプトを実行します。その1つは、/etc/resolvconf/update.d/dnsmasqです。これは、現時点でresolvconfに認識されているすべての非ローカルDNSサーバーのリストを取得し、/run/dnsmasq/resolv.confにプッシュします。これは、dnsmasqが使用するはずのDNSサーバーリストです。

毎秒、dnsmasq/run/dnsmasq/resolv.confの変更時間をチェックし、その構成を更新することになっています。

ただし、dnsmasqコマンドラインは、デフォルト設定にいくつかの変更を加えた可能性があることを示しています。dnsmasqオプション--no-resolv--resolv-file=/run/dnsmasq/resolv.conf...に置き換えるか、NetworkManagerまたはresolv.conf関連のカスタマイズを削除することをお勧めします。 dnsmasqのデフォルト設定は、NetworkManagerおよびresolvconfと適切に統合するように設計されています。

resolvconfツールを使用している場合、ディレクトリ/run/resolvconf/interface/にあるさまざまなソースから提供されるDNSサーバー設定が見つかります。各ファイルの内容は、実際の/etc/resolv.confに似ています。ファイルの名前は、DNSサーバー情報のソース(特定のネットワークインターフェイスの静的な構成かDHCP構成か、一般的なNetworkManagerか、ローカルDNSサーバーの起動スクリプトか)を参照します。

以前、/sbin/resolvconfがインストールされている場合にdnsmasqの起動時に実行されるコマンドラインについて説明しました。これを一時的に元に戻したい場合(ローカルのdnsmasqがバイパスされている場合にDNSが機能するかどうかをテストするため)は、次のコマンドで実行できます。

resolvconf -d lo.dnsmasq

これを行うと、優先度が最も高いアクティブなネットワークインターフェイスのDNS設定が実際の/etc/resolv.confに引き継がれるはずです。

dnsmasq起動スクリプトがアクティブなDNS設定を「nameserver 127.0.0.1」行に置き換えるのを停止したい場合は(トラブルシューティングまたはその他の理由で)、明らかにDNSMASQ_EXCEPT=lo/etc/default/dnsmasqに追加するとそれが実現します。

ただし、ネームサーバーの行の値が127.0.1.1であるため、おそらくNetworkManagerによって直接記述されているため、resolvconfの問題が解決されていない場合に修正する手がかりはありません。

2
telcoM