現行、多くのディストリビューションはシステム管理に 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
- OK
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 を使うようにする。