web-dev-qa-db-ja.com

systemd-resolvedを無効にしてdnsmasqでDNSを解決する方法は?

Ubuntu 16.10以降は、systemd-resolvedをDNSリゾルバーとして使用します。

リゾルバとしてdnsmasqを使用するセットアップ16.04を好みます。

16.10以降、特に17.04ではどうすればよいですか?

27
Artyom

dnsmasqパッケージは、16.10および17.04でも引き続き使用可能です。

  1. dnsmasqおよび依存関係のインストール(または少なくともパッケージをダウンロード)beforesystemd-resolvedを無効化 =:

    Sudo apt-get install dnsmasq
    
  2. systemd-resolvedを無効にし、dnsmasqが実行されていることを確認します。

    Sudo systemctl stop systemd-resolved
    Sudo systemctl disable systemd-resolved
    
    systemctl status dnsmasq
    
  3. シーズンdnsmasqを味わう。設定を適用した後、dnsmasqを再起動します:

    Sudo systemctl stop dnsmasq
    Sudo systemctl start dnsmasq
    

ステップ2の後、ステップ3が完了するまで、システムリゾルバーが動作しない場合があります。デフォルトの設定でdnsmasqが機能するようにするには、ネットワークサブシステムを再起動(または単に再起動)する必要がある場合があります。私のテストでは、既知のDNSサーバーを/etc/dnsmasq.confに追加し、dnsmasqを再起動するだけで、liveCD環境で動作するようになりました。

32
quixotic

@quixoticの答えに加えて:

/etc/NetworkManager/NetworkManager.confにあることを確認してください:

[main]
dns=dnsmasq

追加する必要がある場合は、次のようにNetworkManagerを再起動します。

Sudo systemctl restart NetworkManager

/etc/resolv.conf/var/run/NetworkManager/resolv.confへのシンボリックリンクである必要があります。このようにすることができます

Sudo rm /etc/resolv.conf; Sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf
16
blabla

(X)Ubuntu 18.04の場合(私の stackexchangeでの回答 を参照)。

ここにコピーがあります(コピーを作成する必要がありますか?)

これが(X)Ubuntu 18.04 Bionicのソリューションです。

Dnsmasqをインストールする

Sudo apt install dnsmasq

ポート53のsystemd-resolvedリスナーを無効にします(アップグレード時に上書きされる可能性があるため、/ etc/systemd/resolved.confには触れないでください)。

$ cat /etc/systemd/resolved.conf.d/noresolved.conf 
[Resolve]
DNSStubListener=no

そしてそれを再起動します

$ Sudo systemctl restart systemd-resolved

(または$ Sudo systemctl disable systemd-resolved.serviceで完全に無効にする)

/etc/resolv.confを削除して、再度作成します。 resolv.confはデフォルトで/run/systemd/resolve/stub-resolv.confへのシンボリックリンクであるため、これは重要です。シンボリックリンクを削除しない場合、ファイルはリブート時にsystemdによって上書きされます(systemd-resolvedを無効にした場合でも!)。また、NetworkManager(NM)は、systemdで解決された構成を検出するためのシンボリックリンクであるかどうかを確認します。

$ Sudo rm /etc/resolv.conf
$ Sudo touch /etc/resolv.conf

NMによる/etc/resolv.confの上書きを無効にします(rc-managerオプションもありますが、マニュアルに記載されているにもかかわらず機能しません)。

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

それを再起動します:

$ Sudo systemctl restart NetworkManager

NMのresolv.confを使用するようにdnsmasqに指示します。

$ cat /etc/dnsmasq.d/nmresolv.conf 
resolv-file=/var/run/NetworkManager/resolv.conf

それを再起動します:

$ Sudo systemctl restart dnsmasq

解決にはdnsmasqを使用します。

$ cat /etc/resolv.conf 
# Use local dnsmasq for resolving
nameserver 127.0.0.1
0
sena

systemd-resolved のマニュアルによると、systemd-resolvedは3つの異なるインターフェイスを介して名前解決サービスを提供します。

  1. 「バスで完全に機能するAPI systemd-resolved公開」
  2. 「ローカルループバックインターフェイス上のIPアドレス127.0.0.53のローカルDNSスタブリスナー」
  3. RFC3493で定義されているglibc getaddrinfo(3)APIおよびgethostbyname(3)を含む関連するリゾルバ関数。このAPIは、Linuxプラットフォーム以外にも広くサポートされています。現在の形式では、DNSSEC検証ステータス情報は公開されませんが、同期のみです。このAPIは、glibcネームサービススイッチ(nss(5))によってサポートされています。 glibcのNSSリゾルバー機能がsystemd-resolvedを介してホスト名を解決できるようにするには、glibc NSSモジュールnss-resolve(8)の使用が必要です。

最初の2つのインターフェースは通常のDNS解決に干渉しないようで、私にとっては問題は3番目にある可能性が高いです。

nss-resolve のマニュアル:

NSSモジュールをアクティブにするには、/ etc/nsswitch.confの「hosts:」で始まる行に「resolve」を追加します。具体的には、/ etc/nsswitch.confの「hosts:」行の「resolve」を早期に(ただし、「files」または「mymachines」エントリの後に)、「dns」エントリが存在する場合はその直前に置き、 「[!UNAVAIL = return]」。DNSクエリが実行されている場合は常にsystemd-resolved(8)を介してルーティングされますが、このサービスが利用できない場合はnss-dnsにルーティングされます。

そのため、/ etc/nsswitch.confの「Host:」行で「dns」を「resolve」よりも前にする必要があります。そしてgetaddrinfo/ etc/resolv.confに忠実に従うべきです。

この解決策は、systemd-resolvedがすべてのDNS解決要求を処理するのを防ぐだけであり、特定のネットワークマネージャーに制限されません。また、LLMNRおよびmDNSサービスが正常に動作していることも確認します。

(Linuxで名前解決がどのように機能するかについてはあまりよく知らず、これらのマニュアルから理解したことについても確信が持てません。何か間違いがあった場合は喜んで指摘します。Thx:))

0
Dummmy