Ubuntu 17.04: systemd-resolvedで複数の異なる用途のnameserverが使えない

systemd-resolvedが/etc/resolv.confを管理するようになりました。複数の異なる用途のnameserverが使えないようです。

1 複数の異なる用途のnameserver

DHCPサーバから以下の2つのnameserverをクライアントに配布しています。

  • 192.168.11.2のDNSサーバはhiroom2.comというドメインに所属するマシンの名前解決を実行します。
  • 192.168.11.1のDNSサーバはインターネット向けの名前解決を実行します(ルータなのでISPが提供するDNSサーバにforwardしています)。

結論を言いますと、192.168.11.2で192.168.11.1への再帰問い合わせを有効にして、DHCPサーバはnameserver 192.168.11.2のみを配布すれば問題は解決します。ただし、192.168.11.2のDNSサーバが落ちている場合は名前解決できなくなります。

2 Ubuntu 17.10以外の/etc/resolv.conf

Fedora 26の/etc/resolv.confは以下の通りです。Ubuntu 17.10以外のLinuxディストリでも同様になります。OSXやBSDでも同様です。

$ cat /etc/resolv.conf
# Generated by NetworkManager
search hiroom2.com
nameserver 192.168.11.2
nameserver 192.168.11.1

最初に192.168.11.2に対して問い合わせて、192.168.11.2が解決できない場合は192.168.11.1へ問い合わせるようになっています。

この挙動が正しいのかはわかりません。ただ、いままでそうだったという事実があります。

3 Ubuntu 17.10の/etc/resolv.conf

Ubuntu 17.10の/etc/resolv.confは以下の通りです。nameserver 127.0.0.53に対して名前を問い合わせるとsystemd-resolvedが応答します。

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "systemd-resolve --status" to see details about the actual nameservers.

nameserver 127.0.0.53

systemd-resolvedでは複数のnameserverを認識しています。DNSサーバのvalidationの為か、"Switching to DNS server …"で適時切り替えを行うようです。

$ systemd-resolve --status
Global
<snip>
Link 2 (ens3)
      Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 192.168.11.2
                      192.168.11.1
          DNS Domain: hiroom2.com

192.168.11.2で再帰問い合わせを無効にした場合は192.168.11.2のみが使用されます。

つまりインターネットの名前解決ができません。

$ sudo journalctl --no-pager -u systemd-resolved -f
systemd-resolved[3077]: Switching to DNS server 192.168.11.2 for interface ens3.

192.168.11.2で再帰問い合わせを有効ににした場合はランダムな間隔でDNSサーバの切り替えが発生します。systemdのデバッグログを有効にしたところ、どうやら192.168.11.2の再帰問い合わせにかかる時間でタイムアウトすることで192.168.11.1へ切り替わるようです。192.168.11.2へはポーリングで切り替わるのでしょうか。

つまりhiroom2.comというドメインに所属するマシンの名前解決が失敗する場合があります。

$ sudo journalctl --no-pager -u systemd-resolved -f
systemd-resolved[3077]: Switching to DNS server 192.168.11.2 for interface ens3.
systemd-resolved[3077]: Switching to DNS server 192.168.11.1 for interface ens3.
systemd-resolved[3077]: Switching to DNS server 192.168.11.2 for interface ens3.
systemd-resolved[3077]: Switching to DNS server 192.168.11.1 for interface ens3.

この切り替えるという動作が他のLinuxやBSDと異なっています。また切り替えが適時発生する場合があるので、複数の異なる用途のnameserverを使うことができません。

よって、DHCPサーバで複数のnameserverを配布せず、192.168.11.2で再帰問い合わせを有効にする必要があります。

できればsystemd-resolvedで今までの挙動を再現して欲しいのですが。