Lubuntu 18.04 で内部 DNSを利用する

現行、多くのディストリビューションはシステム管理に systemd を利用しています。
Lubuntu(Ubuntu)も例外ではなく、systemd-resolved により「/etc/resolv.conf」が管理されています。

目次

環境

設定したクライアントPCは Lubuntu 18.04 LTS です。

$ cat /etc/issue
Ubuntu 18.04.2 LTS n l

$ ssh root@192.168.2.xxx
 _   _                   ____  _   _   _            
|  | | __ _ _ __   ___ |  _ (_) |  | | ___  ___  
|  | |/ _` | '_  / _ | |_) | | |  | |/ _ / _  
| |  | (_| | | | | (_) |  __/| | | |  |  __/ (_) |
|_| _|__,_|_| |_|___/|_|   |_| |_| _|___|___/ 


Welcome to ARMBIAN 5.75 stable Debian GNU/Linux 9 (stretch) 4.19.20-sunxi   
System load:   0.00 0.00 0.00   Up time:       1 day        
Memory usage:  17 % of 493MB    IP:            192.168.2.xxx
CPU temp:      43°C             
Usage of /:    15% of 7.0G      storage/:      1% of 466M       

[ General system configuration (beta): armbian-config ]


# dpkg -l | grep dnsmasq
ii  dnsmasq                           2.76-5+deb9u2                  all          Small caching DNS proxy and DHCP/TFTP server
ii  dnsmasq-base                      2.76-5+deb9u2                  armhf        Small caching DNS proxy and DHCP/TFTP server

DNSサーバは、先日設定した dnsmasq です。

注意点

systemd-resolved で管理されているため「/etc/resolv.conf」は書き換えてもサービス再起動時に上書きされます。
また「/etc/resolv.conf」は以下ファイルのシンボリックリンクになっています。

$ ls -lh /etc/resolv.conf
lrwxrwxrwx 1 root root 39 12月 24 23:36 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf

/run/systemd/resolve 以下には、resolv.conf と stub-resolv.conf の2つのファイルがあります。

$ ls -lhF /run/systemd/resolve/
-rw-r--r-- 1 systemd-resolve systemd-resolve 644  4月 18 08:41 resolv.conf
-rw-r--r-- 1 systemd-resolve systemd-resolve 733  4月 18 08:41 stub-resolv.conf
ファイル 概要
/run/systemd/resolve/resolv.conf 外部DNSサーバへ接続するための resolv.conf (/etc/resolv.conf の実体)
/run/systemd/resolve/stub-resolv.conf systemd-resolved の内部DNSスタブリゾルバに接続するための resolv.conf(127.0.0.53)

systemd は、ネットワーク設定を行うデーモン systemd-networkd が基本的なネットワーク設定を行いますが、Lubuntu は既定で Network-Manager を使っています。
また、同様に名前解決に systemd-resolved を使うように変更されています。
(systemd-resolved は Lubuntu でも既定で利用されている)。

上記で確認したとおり /etc/resolv.conf はシンボリックリンクで、その参照先である2つのファイル(systemd-networkd, systemd-resolved)は /run 配下にあるので tmpfs(揮発性)です。

$ df -lh /run
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           1.6G  1.4M  1.6G   1% /run

そのため、以降の設定は下記3つのサービス(デーモン)に対して行います。

  • systemd-networkd
  • systemd-resolved
  • network-manager (利用する場合)

設定

network-manager

dns と rc-manager を設定します。
※ディストリビューションによりデフォルトの挙動が異なります。
(ディストリによっては default のままで問題ない場合もありますが、下記では敢えて設定しています)。

$ sudo diff -u /root/NetworkManager.conf /etc/NetworkManager/NetworkManager.conf
--- /root/NetworkManager.conf   2019-04-17 15:39:59.399093253 +0900
+++ /etc/NetworkManager/NetworkManager.conf 2019-04-18 09:59:58.466014226 +0900

 [main]
 plugins=ifupdown,keyfile
-dns=default
+dns=systemd-resolved
+rc-manager=resolvconf

 [ifupdown]
 managed=false

base on NetworkManagerやらresolvconfやらLinuxのDNSまわりを調べて、DHCP環境下でDNSキャッシュしてみた - Qiita
2017年12月07日に投稿

dns

dnsモード 振る舞い
default 取得したDNSサーバーをそのまま使います。
dnsmasq キャッシュ用にdnsmasqをサブプロセスとして起動します。DNSサーバーは127.0.0.1を使います。
unbound 上のunboundバージョン
systemd-resolved 上のsystemd-resolvedバージョン
none NetworkManagerはDNSに関して何もしません。また次に書いてあるrc-managerも無効になります。

指定しない場合はdefaultが使用されますが、もし/etc/resolv.confがsystemd-resolvedへのシンボリックリンクだった場合は、systemd-resolvedがDNSを司っているのだと判断し自動でsystmed-resolvedを使用します。

rc-manager

rc-managerモード 振る舞い
symlink /etc/resolv.confがただのファイルの場合は、NetworkManagerが直接ファイルに書き込みをします。もしシンボリックリンクだった場合はファイルに何もしません。
file 直接/etc/resolv.confに書き込みます。シンボリックリンクの場合もシンボリックリンク元に書き込みます。
resolvconf NetworkManagerは、resolvconfにresolv.confの更新を頼みます。
netconfig netconfigに更新を頼みます。
unmanaged 何もしません。
none syslinkと同じ動作をします。

何も指定しない場合の動作はディストリビューションによってまちまちらしいですが、自分の環境だとresolvconfでした。man NetworkManager.confと打ちrc-manager項目を確認することでで確認できます。

systemd-networkd

Lubuntu 18.04 は既定では systemd-networkd が起動していなかったので、起動・有効化します。

$ sudo systemctl start systemd-networkd
$ sudo systemctl enable systemd-networkd
Created symlink /etc/systemd/system/dbus-org.freedesktop.network1.service → /lib/systemd/system/systemd-networkd.service.
Created symlink /etc/systemd/system/multi-user.target.wants/systemd-networkd.service → /lib/systemd/system/systemd-networkd.service.
Created symlink /etc/systemd/system/sockets.target.wants/systemd-networkd.socket → /lib/systemd/system/systemd-networkd.socket.
Created symlink /etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service → /lib/systemd/system/systemd-networkd-wait-online.service.

設定

今回は固定IP用ファイル static.network を作成しました。

$ cat /etc/systemd/network/static.network
[Match]
Name=enp1s0

[Network]
DHCP=no
Address=192.168.2.111/24
Gateway=192.168.2.1
DNS=192.168.2.254
Domains=local.ddd

base on 第5章 ネットワークの設定

DHCP クライアントの設定は "/etc/systemd/network/dhcp.network" を作成することで設定できます。
静的ネットワーク設定は "/etc/systemd/network/static.network" を作成することで設定できます。例えば:

[Match]
Name=en*

[Network]
Address=192.168.0.15/24
Gateway=192.168.0.1

systemd-resolved

設定

外部DNSサーバを設定します。
※「systemd-resolve --status」の項目 Global に相当。

$ cat /etc/systemd/resolved.conf

[Resolve]
DNS=8.8.8.8 8.8.4.4
FallbackDNS=2606:4700:4700::1111 2606:4700:4700::1001
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=no

FallbackDNS(フォールバック)には、疎通できない場合にリトライを行う先を指定します。

base on フォールバック(縮退運転)とは - IT用語辞典 e-Words

フォールバックとは、システムに障害が発生したときに性能を落としたり機能を制限したりして限定的ながら稼動を続行すること。あるいは、利用したい機能が条件が悪く使えない場合に、代替となる機能に切り替えること。また、そのような機能や構成。

設定変更

サービスの再起動・リロードで設定を反映します。

$ sudo systemctl restart systemd-networkd
$ sudo systemctl restart systemd-resolved
$ sudo systemctl restart network-manager
$ sudo systemctl daemon-reload

※「systemctl daemon-reload」は Unit設定ファイルを変更時、変更内容を systemd に認識させるために必要。

結果

stub-resolv.conf

内部名前解決用ファイルには「/etc/systemd/network/static.network」で設定した search とローカル DNS が指定されています。

$ cat /run/systemd/resolve/stub-resolv.conf

nameserver 127.0.0.53
options edns0
search local.ddd

resolv.conf

外部DNSサーバには「/etc/systemd/resolved.conf」で設定したDNSサーバと「/etc/systemd/network/static.network」で設定したネームサーバが設定されています。

$ cat /run/systemd/resolve/resolv.conf

nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 192.168.2.254
search local.ddd

なお、「/etc/resolv.conf 」と「/run/systemd/resolve/stub-resolv.conf」は同じ内容が設定されます。

$ cat /etc/resolv.conf 

nameserver 127.0.0.53
options edns0
search local.ddd

参照 DNS の確認

現在使用中のアップリンクDNSサーバーに関する詳細を表示するには、 "systemd-resolve --status"を実行します。

  • Global
    外部用には「/etc/systemd/resolved.conf」で設定した内容が表示される。
  • Link 2
    内部用には「/etc/systemd/network/static.network」で設定した内容が表示される。
$ systemd-resolve --status
Global
         DNS Servers: 8.8.8.8
                      8.8.4.4
          DNSSEC NTA: 10.in-addr.arpa
                      16.172.in-addr.arpa
                      ~~~
                      home
                      internal
                      intranet
                      lan
                      local
                      private
                      test

Link 2 (enp1s0)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 192.168.2.254
          DNS Domain: local.ddd

その他

FQDN(完全修飾ドメイン名)でないと、クライアントからの内部の名前解決はできません。

    • OK
      $ ping svr01.local.ddd
    • NG
      $ ping svr01

base on systemd-networkd - ArchWiki
systemd-resolve がローカルドメインを検索してくれない
ホストネームを指定しているとき、たとえ .network ファイルに UseDomains=yes や Domains=[domain-list] を設定している場合 (resolv.conf に search [domain-list] が作成されます) でも、Systemd の resolve はローカルドメインを検索しません。この問題を解決するには:

  • /etc/nsswitch.conf の hosts データベースを切り詰める (例: resolve サービスの後ろの [!UNAVAIL=return] オプションを削除する)。
  • 完全修飾ドメイン名を使うようにする。
  • /etc/hosts を使ってホストネームを解決する。
  • systemd の resolve の代わりに glibc の dns を使うようにする。