NetworkManager で dnsmasq を使用する

NetworkManager で dnsmasq を使用する

dnsmasqNetworkManager が(ref:とうまく連携しないことはよく知られています。ここ)。私は長文のここで議論するしかし、この状況に対処するための推奨される方法がまだわかりません。

私がしたいのはdnsmasqローカルネットワークにDNSとDHCPを提供するこの場合、どのような方法が推奨されるでしょうか?

Ubuntu 14.04でも問題は残っているようですが、バグ修正されたと主張されています。

dnsmasq-base回避策として、次の理由によりNM スレーブを無効にする人がいます。

NM-enslaved はdnsmasq、非常に制限された機能を提供するハードコードされたオプション (C 言語) を使用します。

  • ethX ( ) をリッスンしません--listen-address=127.0.0.1。そのため、サーバーをローカル ネットワーク PC の DNS サーバーとして使用することはできません。つまり、LAN ではまったく役に立ちません。
  • リクエストをキャッシュしません ( --cache-size=0)。キャッシュなし ==> DNS クエリの高速化なし。同時ユーザーが多い LAN では、これも非常に重要です。
  • 最後に、dnsmasqのDHCPとTFTP機能も必要なので、NM+dnsmasqに実際のDNSサーバーが含まれていたとしても、別のdnsmasqを実行する必要があります。

しかし、私はそれらがまだ有効であるかどうか、また修正がどのように問題を解決したかはわかりません。さらに、彼らの誰も、問題を解決するために何をしたか、どのようにしたかを明確にしていません。つまり、解決策の部分が欠落しています。長い議論誰か空欄を埋めてもらえますか?つまり、

dnsmasqUbuntuが提供する標準機能は、上記の理由により、サーバー側では動作しません。また、クライアント側でも、「Ubuntu ラップトップにインストールされている dnsmasq は、DNS サーバーからの LAN DNS クエリを実行できません」、 なぜなら「(Ubuntu ラップトップの)NetworkManager により、奇妙な 127.0.1.1 ネームサーバー設定が発生します」(参照:LANまたはローカルホームネットワーク用のDNSソリューション

サーバー側とクライアント側の両方でローカル ネットワークに DNS と DHCP (および TFTP) を提供できるように、dnsmasq を NetworkManager でスムーズに動作させるにはどうすればよいですか?

要約

答えを探している人のために。以下の回答の中で、@bradの回答が最も簡単な解決策だとわかりました。サーバ側(クライアント側ではまだ良い答えがありません):

この問題の唯一の解決策は、NM ドライブの dnsmasq を無効にし、「標準」の dnsmasq をインストールして、標準の/etc/dnsmasq.conf構成ファイルを使用して構成することです。

答え1

私もあなたと同じ問題を抱えています。

原則として、wiki.archlinux/etc/NetworkManager/dnsmasq.d/cacheキャッシュを有効にするには、単に次のような内容のファイルを作成するだけで十分であるようです。

$ cat /etc/NetworkManager/dnsmasq.d/cache 
cache-size=1000

これを試してみましたが、NM を再起動した後もキャッシュがありません:

# ps ax | grep dns
11724 ?        S      0:00 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/sendsigs.omit.d/network-manager.dnsmasq.pid --listen-address=127.0.1.1 --conf-file=/var/run/NetworkManager/dnsmasq.conf --cache-size=0 --proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d

引用された conf ファイルは常に空であることに注意してください。この手順を使用してオプションを構成することはできませんでした。

全体として、14.04 の NM スレーブ dnsmask (dnsmasq-base パッケージによって提供される) は完全にロックされているため、キャッシュやその他の機能 (dhcp、tftp) を有効にすることはできないようです。

もしこれが正しいなら、あなたが言うように、問題の唯一の解決策は、次の行をコメントアウトしてNMドライブのdnsmasqを無効にすることだと思います。

dns=dnsmasq

ファイルに/etc/NetworkManager/NetworkManager.conf「標準」dnsmasq をインストールし、標準/etc/dnsmasq.conf構成ファイルを使用して構成します。

答え2

に設定を上書きするには、 に入力します/etc/NetworkManager/dnsmasq.d/*.conf。 設定ファイルの設定は、コマンドライン フラグよりも優先されます。 NetworkManager が dnsmasq を起動したときに適用されます。 を実行してsudo service network-manager restart再適用します。 (疑問がある場合: brad の回答では、 が引数ps ax | grep dnsを示すという事実が抜けています--conf-dir)

例えば:

echo cache-size=1000 |sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf

私の記憶では、NetworkManager はキャッシュ ポイズニングの懸念から、dnsmasq キャッシュをデフォルトで無効にしています。すべてのユーザーが信頼されているマシンでは、問題にならない可能性があります。

NetworkManager は と統合されておらずresolvconf、resolvconf パッケージがインストールされている場合、 の NM のサーバーは127.0.1.1ローカルでは使用されません。resolvconf は、ubuntu-minimal および標準の Debian インストールの一部です。NetworkManager は、その機能をより統合された、スクリプトベースではない方法で再実装します。

bind-interfacesNetworkManager は、グローバル dnsmasq インスタンス (セカンダリ ループバック IP にバインドし、 を介して設定) に干渉しないようにします。グローバル dnsmasq インスタンスをインストールし、NM のインスタンスを保持する場合は、ホストがデフォルトでどれを使用するかを/etc/dnsmasq.d/network-manager再確認してください。/etc/resolv.conf

上記のように NetworkManager の dnsmasq インスタンスをカスタマイズできますが、パブリック インターフェイスにバインドする DNS サーバーが必要な場合は、 パッケージをインストールしdnsmasq(NetworkManager は のみを使用しdnsmasq-base、グローバル インスタンスを構成しません)、 に設定を配置する/etc/dnsmasq.d/*.conf必要があります。NetworkManager のスレーブ インスタンスは、ループバック インターフェイスにバインドすることのみを目的としており、その範囲を超えて構成すると、インスタンスが壊れるリスクがあります。


要約すると、ローカル DNS キャッシュだけが必要な人の場合:

sudo apt-get remove dnsmasq resolvconf dhcpcd5 rdnssd
echo cache-size=1000 |sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf

シンプルな LAN であれば、NetworkManager の接続共有で十分です。ただし、TFTP などを使用してカスタム設定された LAN の場合は次のようになります。

sudo apt-get install resolvconf dnsmasq
echo 192.168.0.50,192.168.0.150,12h |sudo tee -a /etc/dnsmasq.d/lan.conf
echo enable-tftp |sudo tee -a /etc/dnsmasq.d/lan.conf
sudo service dnsmasq restart

答え3

この投稿への以前の返信に加えて、Network-managerのdnsmasq-baseインスタンスも、(/etc/NetworkManager/dnsmasq-shared.d/の下に作成された構成ファイルに配置されている)ディレクティブに従い、dnsmasqがNetwork-Managerによってオプションで呼び出されているにもかかわらずaddn-hosts、dnmasq-baseにローカルファイルを読み取るように強制することを付け加えたいと思います。/etc/hosts--no-hosts

このようにして、Mint 20.1 ラップトップにローカル DNS サーバーを正常にセットアップできました。IP アドレスをいじる必要はありません (適切にセットアップされて/etc/hostsいれば...)

以下に動作サンプルを示します...

 # /etc/NetworkManager/dnsmasq-shared.d/local-DNS.conf
 domain=local.wifi              // specify the (local) DNS-domain
 addn-hosts=/etc/hosts          // force dnmasq to read /etc/hosts despite --no-host
 bogus-priv                     // do not forward private reverse lookups to upstream server (not needed if there is none...)
 dhcp-option=6,[IP-OF-WIFI_IF]  // tell client to use [IP-OF-WIFI_IF] as DNS-Server

答え4

特定の MAC を特定の IP アドレスに割り当て、安定性を確保するために、可能な限りデフォルトの Network Manager/dnsmasq を使い続けたいと考えました。

https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/src/dnsmasq/nm-dnsmasq-manager.c--conf-fileを使用して設定を無視するというコメントがありますが、ファイルの後半では

/* dnsmasq exits if the conf dir is not present */
    if (g_file_test (CONFDIR, G_FILE_TEST_IS_DIR))
        nm_cmd_line_add_string (cmd, "--conf-dir=" CONFDIR);

Ubuntu 16.04 LTS では、Wi-Fi ホットスポットを設定し、別の接続を共有すると、ps auxgww | grep dnsmasq各 dnsmasq プロセスの最後のコマンド ライン引数が次のようになることがわかります。

--conf-dir=/etc/NetworkManager/dnsmasq-shared.d

したがって、Network Manager によって開始される dnsmasq のすべての呼び出し間で共有される構成ファイルをそのディレクトリに作成することが可能になります。

/etc/NetworkManager/dnsmasq-shared.d/Hueを作成しました

dhcp-host=0c:4d:e9:a0:ce:cf,192.168.1.221

再起動しましたが、実行中です

sudo service network-manager restart

うまくいっただろう。

その結果、デバイスは適切な IP アドレスを取得しました。

はい、これは間違っています。NetworkManager による dnsmasq の呼び出しのすべてでこの宣言が取得されることを意味しますが、この場合、MAC が問題のネットワークに表示されるかどうかだけが問題となるため、無害です。ネットワークが 192.168.1 でない場合は、問題が発生します。

これは、/usr/sbin/dnsmasqをスクリプトに置き換えるよりも堅牢です。https://gist.github.com/magnetikonline/6236150

正しい解決策は、dnsmasq の起動方法を変更して、dnsmasq 構成ファイルを適切に使用することです。Network Manager を「そのまま動作させる」という要望は理解できますが、ツールを愚か者にも使いやすくすることは、愚か者だけが使用できることを意味します。

関連情報