Ubuntu 16.10以降は、systemd-resolved
をDNSリゾルバーとして使用します。
リゾルバとしてdnsmasq
を使用するセットアップ16.04を好みます。
16.10以降、特に17.04ではどうすればよいですか?
dnsmasq
パッケージは、16.10および17.04でも引き続き使用可能です。
dnsmasq
および依存関係のインストール(または少なくともパッケージをダウンロード)beforesystemd-resolved
を無効化 =:
Sudo apt-get install dnsmasq
systemd-resolved
を無効にし、dnsmasq
が実行されていることを確認します。
Sudo systemctl stop systemd-resolved
Sudo systemctl disable systemd-resolved
systemctl status dnsmasq
シーズンdnsmasq
を味わう。設定を適用した後、dnsmasq
を再起動します:
Sudo systemctl stop dnsmasq
Sudo systemctl start dnsmasq
ステップ2の後、ステップ3が完了するまで、システムリゾルバーが動作しない場合があります。デフォルトの設定でdnsmasq
が機能するようにするには、ネットワークサブシステムを再起動(または単に再起動)する必要がある場合があります。私のテストでは、既知のDNSサーバーを/etc/dnsmasq.conf
に追加し、dnsmasq
を再起動するだけで、liveCD環境で動作するようになりました。
@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
(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
systemd-resolved のマニュアルによると、systemd-resolvedは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:))