新しいネットワークに接続すると、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
)に置き換えると、解決は正常に機能します。
質問:
追加情報:
ローカル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
最近の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
の問題が解決されていない場合に修正する手がかりはありません。