Resolvconf の動的 /etc/resolv.conf と 静的 /etc/resolv.conf

Ubuntu で DNS リゾルバを設定するにあたって、いくつか知っておかなければならないことがあるので、事前に軽くご紹介します。

まずは、一番基本とも言える従来の Resolvconf における /etc/resolv.conf の管理方法ついて。

通常、DNS リゾルバは /etc/resolv.conf に設定するのが一般的ですが、

CentOS とか他のディストリビューションユーザで、静的ファイルである /etc/resolv.comf を開いて、直接 nameserver (実際の DNS サーバ) と search (検索ドメイン) を設定してリゾルバを使っていた場合には、Ubuntu の /etc/resolv.conf が Symbolic Link になっていることに気づいた人もいるのではないかと思います。

また、今まであまり意識してなかったかもしれませんが、Ubuntu の Resolvconf/etc/resolv.comf を Dynamic (動的) で管理するか Static (静的) で管理するか決めることができます。

  • 動的アップデート方式だと /etc/resolv.conf は Symbolic Link で作成され、設定反映コマンドを実行すると自動的に更新されます。・ 直接 /etc/resolv.conf を修正することはできません。・ 直接修正すると OS 再起動、または関連サービスを再起動すると元の設定に戻ります。
  • 静的アップデート方式だと /etc/resolv.conf は通常のファイルとして管理されるため、直接 /etc/resolv.conf を修正する必要があります。(古典的なやり方)

この動的か静的かを決めるのが # dpkg-reconfigure resolvconf というコマンドです。

すなわち、/etc/resolv.conf が必ずしも静的ファイルとは限らない ということを理解することが大事です。

  • /etc/resolv.conf が Symbolic Link であれば、動的アップデート方式
  • /etc/resolv.conf が ASCII・Text ファイルであれば、静的アップデート方式
/etc/resolv.conf 【動的】アップデート方式
1
2
# ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 29  1月 20  2019 /etc/resolv.conf -> /run/resolvconf/resolv.conf
/etc/resolv.conf 【静的】アップデート方式
1
2
# ls -l /etc/resolv.conf
-rw-r--r-- 1 root root 92  2月 22 16:11 /etc/resolv.conf

/etc/resolv.conf のアップデート・管理方式変更について

# dpkg-reconfigure resolvconf を実行してどちらかを選ぶだけなのでやり方自体はシンプルですが、動的から静的へ、または 静的から動的へ 変更を実施した場合は、必ず再起動が必要です。

コマンドを実行すると以下のように TUI が表示されるので、/etc/resolv.conf の管理方式を変更する必要がある場合のみ 適宜選択してください。

  • 静的 /etc/resolv.conf から 動的 /etc/resolv.conf (Symbolic Link) への変更なら「Yes」・ 最初から「Yes」が選択された状態なら、現在の設定は「動的」状態。
  • 動的 /etc/resolv.conf (Symbolic Link) から 静的 /etc/resolv.conf への変更なら「No」・ 最初から「No」 が選択された状態なら、現在の設定は「静的」状態。
dpkg-reconfigure resolvconf
1
2
3
4
# dpkg -l | grep "resolvconf"
ii  resolvconf    1.79ubuntu8    all    name server information handler

# dpkg-reconfigure resolvconf
/etc/resolv.conf アップデート方式設定

resolvconf パッケージには、リゾルバ設定ファイルの動的更新に必要なインフラストラクチャが含まれています。

必要なインフラストラクチャの一部は、/etc/resolv.conf から /run/resolvconf/resolv.conf へのシンボリックリンクです。

このオプションを選択すると、このリンクが作成されます。既存の /etc/resolv.conf ファイルは /etc/resolvconf/resolv.conf.d/original として保存され、このパッケージが削除されると復元されます。

このオプションを拒否すると、将来のインストールでシンボリックリンクが再作成されなくなるため、リゾルバ設定ファイルは動的に更新されません。

その後、README ファイルの指示に従って動的更新を有効にすることができます。

resolvconf が存在すると他のプログラムの動作に影響を与える可能性があるため、未設定の場合はインストールしたままにしないでください。

動的更新用に /etc/resolv.conf を準備しますか?

どちらかを選択すると以下のメッセージが表示されるので、確認してから OK を押します。

/etc/resolv.conf アップデート方式設定完了

再起動することを勧めします。

ローカルキャッシュ用ネームサーバやインターフェース設定プログラムといったネームサーバ情報を提供するプログラムは、resolvconf プログラムにネームサーバ情報を提供することが予測されます。 しかし、resolvconf パッケージのインストールはその情報を提供させるようにはしますが、それに失敗するものがあります。

このバグにより、以下の対策をとらないと、resolvconf パッケージのインストールで正しいネームサーバ情報を失ってしまうことがあります:resolvconf 派、再起動するまでデータベース内にインストール前の /etc/resolv.conf の内容を全て持っています。 これには、関連するインターフェース情報が後で解除されてもそのネームサーバ情報を保持してしまう欠点があります。 (この誤った挙動は、正しい情報を失うことよりは害は少ないと判断されました。)

問題となっているバグが修正されて対策が除去されるまで、動作しているシステムに resolvconf パッケージをインストールした後に完全に正しいネームサーバ情報を resolvconf に確実に持たせる唯一の方法はシステムを再起動することです。

参考. 生き返る /run/resolvconf/resolv.conf

この後説明する systemd-resolved のサービス状態 (起動中・停止中) に関係なく、/etc/resolv.conf を消した状態で # dpkg-reconfigure resolvconf を実行して 動的 を選択すると自動的に /etc/resolv.conf -> ../run/resolvconf/resolv.conf の Symbolic Link が作成されます。

生き返る /run/resolvconf/resolv.conf
01
02
03
04
05
06
07
08
09
10
11
# rm /etc/resolv.conf
# dpkg-reconfigure resolvconf   ####【Yes】を選択した場合
# ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 29  3月 22 11:20 /etc/resolv.conf -> ../run/resolvconf/resolv.conf

-------------------------------------------------------

# rm /etc/resolv.conf
# dpkg-reconfigure resolvconf   ####【No】を選択した場合
# ls -l /etc/resolv.conf
ls: cannot access '/etc/resolv.conf': No such file or directory

systemd-resolved と stub resolve

一方、systemd-resolved はサーバ上で動いているローカルアプリケーションに名前解決を提供するサービスです。

また、systemd-resolved を設定する際に必ず登場するのが スタブリズルバ の存在です。

Stub Resolve (スタブリズルバ) とは

例えば、名前問い合わせに対する実際の処理は DNS サーバが行いますが、DNS サーバへの問い合わせと結果の出力だけ行うリゾルバのことを スタブリゾルバ、もしくは DNS スタブ と呼びます。

systemd-resolved でいうと仲介役の 127.0.0.53 がこれにあたります。

ループバックインタフェースの IPアドレス 127.0.0.53 にローカル DNS スタブリスナー (53番ポート) が提供される形になります。

スタブリゾルバ 127.0.0.53
# netstat -anp | fgrep "127.0.0.53"
udp    0    0 127.0.0.53:53    0.0.0.0:*    5225/systemd-resolv

systemd-resolved 設定方法 3パターン

systemd-resolved では /etc/resolv.conf を処理する 3つのモードが提供されます。

使い方によっては、/etc/resolv.conf のリンク先が以下のように、

  • /usr/lib/systemd/resolv.conf
  • /run/systemd/resolve/stub-resolv.conf
  • /run/systemd/resolve/resolv.conf

だったりするので、従来の Resolvconf のリンク先である /run/resolvconf/resolv.conf まで加えると systemd-resolved を初めて使う人にとっては、一体どうすれば良いか判断が付かず、/etc/resolv.conf の管理に困ってる方も少なくないのではないかと思いますが、

先ほどご紹介した # dpkg-reconfigure resolvconf コマンドは、Resolvconf における /etc/resolv.conf の管理方法を決めるものなので、systemd-resolved を使う場合には、/etc/resolv.conf の管理方法が 動的か静的か について、そこまで気にする必要はありません。

詳細については後ほど説明しますが、systemd-resolved において man ページでおすすめするのは、/usr/lib/systemd/resolv.conf を使うことです。

この後 各設定方法について一つずつご紹介して行きますが、基本的な流れとしては、

  1. /etc/systemd/resolved.conf に参照先 DNS サーバとドメインを設定/etc/systemd/resolved.conf = global setting = systemd-resolved 共通設定ファイル
  2. systemd-resolved サービスの再起動を実施し、設定反映
  3. /etc/resolv.conf → 適宜 Symbolic Link を張る

※ ① の設定さえ問題なくできていれば、② と ③ は順番が逆になっても構いません。

systemd-resolved 共通設定 (グローバル設定)

後ほど説明する 「その1、その2、その3」 の共通設定になりますので、事前に設定してください。

systemd-resolved を使う際の注意点としては、既存の Resolvconf の設定ファイル (バックアップされたファイル) が残っていると systemd-resolved によってそのファイルが読み込まれ、結果的には /etc/resolv.confReolvconfsystemd-resolved の設定 (nameserver と search 等の設定) が二重反映されることがあるので、systemd-resolved を使う場合には、事前に 既存の Resolvconf のバックアップファイルを完全に無効化しておきます。

このファイルは、Resolvconf の管理方法を動的から静的に変更した場合に、既存の設定ファイルが original として自動バックアップされたことによって生成されます。

存在しなければ、無視しても構いませんが、存在する場合は他の場所に移動しておくか、削除してください。 (中身をコメントアウトするとコメントアウトされた内容が systemd-resolved の /etc/resolv.conf に反映されてしまうのでおすすめしません)

Resolvconf のバックアップファイル退避、または削除
1
2
3
4
5
# mv /etc/resolvconf/resolv.conf.d/original /root/

または

# rm /etc/resolvconf/resolv.conf.d/original

後は、systemd-resolved の共通設定ファイルに DNS サーバの IP アドレスを設定します。

この例では、DNS サーバの IP アドレスとして以下を設定しています。

  • DNS サーバ 1 : 10.10.10.11
  • DNS サーバ 2 : 10.10.10.12
  • DNS サーバ 3 : 10.10.10.13
/etc/systemd/resolved.conf
1
2
3
4
5
6
7
・・・
[Resolve]
・・・
DNS=10.10.10.11 10.10.10.12 10.10.10.13
・・・
Domains=etutsplus.com
・・・
  • DNS は従来の nameserver (実際の問い合わせ先 DNS サーバの IP アドレス)、
  • Domains は従来の search (検索ドメイン) に該当します。

複数設定する場合は、コンマではなく空白区切りセットしてください。

設定が終わったらサービス起動 (または再起動) を実施し、設定が反映されていること127.0.0.53 の 53番ポートが Listen 状態であること を確認します。

systemd-resolved 設定反映
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
# systemctl restart systemd-resolved

# ps -ef | fgrep 'systemd-resolved' | grep -v "grep"
systemd+   900     1  0 11:55 ?        00:00:11 /lib/systemd/systemd-resolved

# systemd-resolve --status
Global
         DNS Servers: 10.10.10.11
                      10.10.10.12
                      10.10.10.13
         DNS Domain: etutsplus.com
・・・

# netstat -anp | fgrep "127.0.0.53"
udp        0      0 127.0.0.53:53           0.0.0.0:*          5225/systemd-resolv

このような状態になっていることを確認し、問題なければこの後ご紹介する設定方法 (その1、その2、その3) を参考にし、使い方によって /etc/resolv.conf の Symbolic Link 張り替えを実施してください。

systemd-resolved その1. /usr/lib/systemd/resolv.conf を使う場合

設定方法としては、/usr/lib/systemd/resolv.confnameserver 127.0.0.53 を設定した上で、/etc/resolv.conf → /usr/lib/systemd/resolv.conf へ Symbolic Link を張ります。

/usr/lib/systemd/resolv.conf が存在しない場合は新規作成し、スタブ DNS (127.0.0.53) を唯一の DNS サーバ (nameserver) として設定します。

特徴としては、ローカル DNS API をバイパス (迂回) するすべてのローカルクライアントに対して systemd-resolved に名前解決してもらうことができます。

そのため、man ページではこのやり方をおすすめしています。 (# man systemd-resolved)

ただし、/usr/lib/systemd/resolv.conf検索ドメイン (search) 設定を含みません

その1. /etc/resolv.conf -> /usr/lib/systemd/resolv.conf
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# systemd-resolve --status
Global
         DNS Servers: 10.10.10.11
                      10.10.10.12
                      10.10.10.13
         DNS Domain: etutsplus.com
・・・

# vi /usr/lib/systemd/resolv.conf
nameserver 127.0.0.53        #### nameserver のみ設定

# ls -l /etc/resolv.conf     #### 削除前の確認

# unlink /etc/resolv.conf    #### または、rm /etc/resolv.conf

# ln -s /usr/lib/systemd/resolv.conf /etc/resolv.conf

# ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 28  3月  1 11:31 /etc/resolv.conf -> /usr/lib/systemd/resolv.conf

# nslookup server.etutsplus.com
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
Name:   server.etutsplus.com
Address: 150.95.131.160

参考. systemd-resolved その2 と その3 を実施する前に、/run/systemd/resolve/ 下の resolv.conf と stub-resolv.conf について

その2その3 を説明する前に、事前知識として以下を覚えておくと良いです。

共通設定ファイルである /etc/systemd/resolved.conf 設定後、# systemctl restart systemd-resolved を実行して設定を反映すると (systemd-resolved を起動、または 再起動すると) /run/systemd/resolve/ 下にある resolv.confstub-resolv.conf にそれぞれ設定が反映されますが、中身は異なります。

各ファイルのコメントにも記載がありますが、これらのファイルは systemd-resolved によって管理されているため、直接編集することはできません。

systemd-resolved によって設定が反映されるファイル
1
2
3
4
5
6
# systemctl restart systemd-resolved

# ls -l /run/systemd/resolve/
total 8
-rw-r--r-- 1 systemd-resolve systemd-resolve 603  3月  1 11:11 resolv.conf        #### その3用
-rw-r--r-- 1 systemd-resolve systemd-resolve 241  3月  1 11:11 stub-resolv.conf   #### その2用
その2用 : /run/systemd/resolve/stub-resolv.conf の中身
1
2
3
4
5
6
7
# cat /run/systemd/resolve/stub-resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# 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
search etutsplus.com
その3用 : /run/systemd/resolve/resolv.conf の中身
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
# cat /run/systemd/resolve/resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients directly to
# all known DNS servers.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.
nameserver 10.10.10.11
nameserver 10.10.10.12
nameserver 10.10.10.13
search etutsplus.com

systemd-resolved その2. /run/systemd/resolve/stub-resolv.conf を使う場合

ファイル名通りに、スタブリゾルバを介して名前解決が行われます。

先程ご紹介した その1 もスタブリゾルバを介しますが、違いとしては、

  • その1 の /usr/lib/systemd/resolv.conf は検索ドメイン (search) を含みません。
  • その2 の /run/systemd/resolve/stub-resolv.conf は検索ドメイン (search) を含みます。

Ubuntu 18.04 LTS あたりの比較的に新しいリリースでは、デフォルトで /etc/resolv.conf → /run/systemd/resolve/stub-resolv.conf になっていたりします。

明示的に stub-resolv.conf を使いたい場合には、/etc/resolv.conf → /run/systemd/resolve/stub-resolv.conf へ Symbolic Link を張ります。

その2. /etc/resolv.conf → /run/systemd/resolve/stub-resolv.conf
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# systemd-resolve --status
Global
         DNS Servers: 10.10.10.11
                      10.10.10.12
                      10.10.10.13
         DNS Domain: etutsplus.com
・・・

# ls -l /run/systemd/resolve/
total 8
-rw-r--r-- 1 systemd-resolve systemd-resolve 603  3月  1 11:11 resolv.conf
-rw-r--r-- 1 systemd-resolve systemd-resolve 241  3月  1 11:11 stub-resolv.conf

# cat /run/systemd/resolve/stub-resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# 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
search etutsplus.com

# ls -l /etc/resolv.conf     #### 削除前の確認

# unlink /etc/resolv.conf    #### または、rm /etc/resolv.conf

# ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

# ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 37  3月  1 11:44 /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf

# nslookup server.etutsplus.com
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
Name:   server.etutsplus.com
Address: 150.95.131.160

# nslookup server
・・・
Name:   server.etutsplus.com
Address: 150.95.131.160

systemd-resolved その3. /run/systemd/resolve/resolv.conf を使う場合

/run/systemd/resolve/resolv.conf は、Ubuntu の従来バージョンとの互換性のためのものです。

特徴としては、systemd で解決されずに (スタブリゾルバを経由せずに) DNS サーバと直接やりとりします。

設定方法は同じように、/etc/resolv.conf → /run/systemd/resolve/resolv.conf へ Symbolic Link を張ります。

その3. /etc/resolv.conf → /run/systemd/resolve/resolv.conf
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# systemd-resolve --status
Global
         DNS Servers: 10.10.10.11
                      10.10.10.12
                      10.10.10.13
         DNS Domain: etutsplus.com
・・・

# ls -l /run/systemd/resolve/
total 8
-rw-r--r-- 1 systemd-resolve systemd-resolve 603  3月  1 11:11 resolv.conf
-rw-r--r-- 1 systemd-resolve systemd-resolve 241  3月  1 11:11 stub-resolv.conf

# cat /run/systemd/resolve/resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
# 
# This is a dynamic resolv.conf file for connecting local clients directly to
# all known DNS servers.
# 
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.
nameserver 10.10.10.11
nameserver 10.10.10.12
nameserver 10.10.10.13
search etutsplus.com

# ls -l /etc/resolv.conf     #### 削除前の確認

# unlink /etc/resolv.conf    #### または、rm /etc/resolv.conf

# ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

# ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 37  3月  1 11:44 /etc/resolv.conf -> /run/systemd/resolve/resolv.conf

# nslookup server.etutsplus.com
Server:         10.10.10.11       #### スタブではなく DNS サーバに問合わせしている
Address:        10.10.10.11#53    #### スタブではなく DNS サーバに問合わせしている

Name:   server.etutsplus.com
Address: 150.95.131.160

# nslookup server
・・・
Name:   server.etutsplus.com
Address: 150.95.131.160

systemd-resolved を止めて、従来の Resolvconf に戻る方法

先ほどご紹介した systemd-resolved その3. /run/systemd/resolve/resolv.conf を使う場合 はスタブリゾルバを経由せずに、直接 DNS サーバとやり取りするので、これを利用すれば従来の Resolvconf に戻す必要はないですが、

  • 余計なプロセスは動かしたくない
  • シンプルに管理したいので従来のやり方に戻したい

といった方は以下を参考にし、従来のやり方への切り替えを実施してください。

  • systemd-resolved を止める その1. 動的 Resolvconf への切り替え (動的 /etc/resolv.conf)
  • systemd-resolved を止める その2. 静的 Resolvconf への切り替え (静的 /etc/resolv.conf)

いずれも再起動は必須です。 (再起動なしで切り替わったとしても再起動を実施してください)

その1 か その2 に進む前に、systemd-resolved から Resolvconf に切り替える際の注意事項や流れについてご紹介します。

Resolvconf が動いている状態で systemd-resolved を動かすとどうなるか

systemd-resolved が動いてると動的 Resolvconf で使う /etc/resolv.conf の Symbolick Link 先 /run/resolvconf/resolv.conf にスタブリゾルバ 127.0.0.53 がセットされるため、/etc/resolvconf/resolv.conf.d/base に設定した内容は、resolvconf -u コマンドを実行しても反映されません。

systemd-resolved が動いていると Resolvconf は使えない
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
# ps -ef | fgrep 'systemd-resolved' | grep -v "grep"
systemd+   900     1  0 11:55 ?        00:00:11 /lib/systemd/systemd-resolved

# ls -l /etc/resolv.conf             #### 動的 Resolvconf の Symbolic Link
lrwxrwxrwx 1 root root 29  3月 22 11:20 /etc/resolv.conf -> /run/resolvconf/resolv.conf

# cat /run/resolvconf/resolv.conf
・・・
nameserver 127.0.0.53
search etutsplus.com

# vi /etc/resolvconf/resolv.conf.d/base
nameserver 10.10.10.11
nameserver 10.10.10.12
nameserver 10.10.10.13
search etutsplus.com

# resolvconf -u

# cat /run/resolvconf/resolv.conf    #### 変化なし (反映されない)
nameserver 127.0.0.53
search etutsplus.com

そのため、

  • 先に systemd-resolved のサービス停止 / サービス無効化を実施
  • その後、dpkg-reconfigure resolvconf を実行し、Resolvconf の /etc/resolv.conf をどのように管理するか「動的か静的か」を選択した上で、
  • 適宜設定 (この後ご紹介する その1 か その2 を実施) する必要があります。

systemd-resolved サービス停止 / 完全無効時の動きが微妙に違う

/usr/lib/systemd/resolv.conf は、システム管理者によって作成されたファイルなので、手動で消さない限りファイルは残りますが、

それ以外の systemd-resolved によって書き換わる設定ファイルについては、サービス停止時とサービス完全無効化+再起動時の動きが微妙に違います。

1
# systemctl stop systemd-resolved
ファイル名サービス停止時管理
/usr/lib/systemd/resolv.conf残るシステム管理者
/run/systemd/resolve/stub-resolv.conf残るsystemd-resolved
/run/systemd/resolve/resolv.conf消えるsystemd-resolved
1
2
# systemctl disable systemd-resolved.service
# shutdown -r now
ファイル名OS 再起動後管理
/usr/lib/systemd/resolv.conf残るシステム管理者
/run/systemd/resolve/stub-resolv.conf消えるsystemd-resolved
/run/systemd/resolve/resolv.conf消えるsystemd-resolved

いずれにせよ、管理者によって手動で作成されたファイル以外については、自動的に削除される認識でいた方が良さそうです。

systemd-resolved サービス停止、及び無効化方法

systemd-resolved のサービス無効化コマンドについては、実際の切り替え手順の中で一番最初に実行してるので説明するまでもないですが、ここでは参考用として実行コマンドと出力結果を載せてるだけなので、軽く読み飛ばしてください。

systemd-resolved サービス停止、及び無効化
01
02
03
04
05
06
07
08
09
10
11
# systemctl stop systemd-resolved

# systemctl list-unit-files --type=service | fgrep "systemd-resolved.service"
systemd-resolved.service       enabled

# systemctl disable systemd-resolved.service
Removed /etc/systemd/system/multi-user.target.wants/systemd-resolved.service.
Removed /etc/systemd/system/dbus-org.freedesktop.resolve1.service.

# systemctl list-unit-files --type=service | fgrep "systemd-resolved.service"
systemd-resolved.service       disabled

本題に戻り、ここからは systemd-resolved を止めて、従来の Resolvconf に戻す方法についてご紹介します。

その1. systemd-resolved を止めて、Resolvconf の「動的」 /etc/resolv.conf を使う場合

systemd-resolved を止めて、/etc/resolvconf/resolv.conf.d/base に設定を入れて、resolvconf -u で反映する従来のやり方への切り替えを実施します。

systemd-resolved から 動的 Resolvconf への切り替え
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# systemctl stop systemd-resolved
# systemctl disable systemd-resolved.service

# ls -l /etc/resolv.conf         #### 削除前の確認
# rm /etc/resolv.conf

# dpkg-reconfigure resolvconf    #### Yes を選択

# ls -l /etc/resolv.conf         #### 自動的に生成される
lrwxrwxrwx 1 root root 29  3月 22 11:20 /etc/resolv.conf -> /run/resolvconf/resolv.conf

# vi /etc/resolvconf/resolv.conf.d/base
nameserver 10.10.10.11
nameserver 10.10.10.12
nameserver 10.10.10.13
search etutsplus.com

# shutdown -r now           #### 必ず実施:再起動しないと /etc/resolv.conf が正しく更新されない

# ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 29  3月 22 11:20 /etc/resolv.conf -> /run/resolvconf/resolv.conf

# cat /etc/resolv.conf
・・・
nameserver 10.10.10.11
nameserver 10.10.10.12
nameserver 10.10.10.13
search etutsplus.com

# nslookup server.etutsplus.com
Server:         10.10.10.11
Address:        10.10.10.11#53

Name:   server.etutsplus.com
Address: 150.95.131.160

設定を変更する際には、

  • /etc/resolvconf/resolv.conf.d/base を修正した上で、
  • resolvconf -u を実行すると /run/resolvconf/resolv.conf (/etc/resolv.conf のリンク先) に設定が反映されます。
動的 Resolvconf 設定、及び設定反映
1
2
3
4
5
6
7
8
9
# vi /etc/resolvconf/resolv.conf.d/base   #### 設定、または 設定変更
nameserver 10.10.10.11
nameserver 10.10.10.12
nameserver 10.10.10.13
search etutsplus.com

# resolvconf -u                           #### 設定反映
# cat /run/systemd/resolve/resolv.conf    #### 設定確認
# cat /etc/resolv.conf                    #### 設定確認

その2. systemd-resolved を止めて、Resolvconf の「静的」 /etc/resolv.conf を使う場合

systemd-resolved を止めて、静的ファイルである /etc/resolv.conf を直接編集する古典的なやり方への切り替えを実施します。

systemd-resolved から 静的 Resolvconf への切り替え
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# systemctl stop systemd-resolved
# systemctl disable systemd-resolved.service

# ls -l /etc/resolv.conf         #### 削除前の確認
# rm /etc/resolv.conf

# dpkg-reconfigure resolvconf    #### No を選択

# ls -l /etc/resolv.conf
ls: cannot access '/etc/resolv.conf': No such file or directory

# echo /dev/null > /etc/resolvconf/resolv.conf.d/base    #### 使わないので、空っぽにしておく

# vi /etc/resolv.conf
nameserver 10.10.10.11
nameserver 10.10.10.12
nameserver 10.10.10.13
search etutsplus.com

# nslookup server.etutsplus.com
Server:         10.10.10.11
Address:        10.10.10.11#53

Name:   server.etutsplus.com
Address: 150.95.131.160

# shutdown -r now           #### 必ず実施

# ls -l /etc/resolv.conf    #### 静的ファイルのままになっていること
-rw-r--r-- 1 root root 92  3月 22 13:38 /etc/resolv.conf

# cat /etc/resolv.conf
nameserver 10.10.10.11
nameserver 10.10.10.12
nameserver 10.10.10.13
search etutsplus.com

# nslookup server.etutsplus.com
Server:         10.10.10.11
Address:        10.10.10.11#53

Name:   server.etutsplus.com
Address: 150.95.131.160

設定を変更する際には、直接 /etc/resolv.conf を修正します。

静的 Resolvconf 設定、及び設定反映
1
# vi /etc/resolv.conf

おまけ. 旧リリースから Ubuntu 17.10 以降にアップグレードした後に、名前解決に失敗する原因

例えば、動的 Resolvconf を使ってる状態で、systemd-resolved を動かすと Resolvconf の Symbolick Link 先である /run/resolvconf/resolv.conf に DNS スタブ 127.0.0.53 が自動的にセットされます。

17.04 → 17.10 にアップグレードした直後の /run/resolvconf/resolv.conf
1
2
3
4
5
6
7
# cat /run/resolvconf/resolv.conf
# 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
search etutsplus.com

そもそも systemd-resolved が動いてない旧リリースから Ubuntu 17.10 以降にアップグレードすると systemd-resolved が起動され、しかも /etc/systemd/resolved.conf に設定が入ってない状態で systemd-resolved を動かしてることになるので、systemd-resolved からすると実際の DNS サーバが見つからず、名前解決に失敗します。

Ubuntu 17.10 にアップグレード直後に名前解決に失敗したとの書き込みを良く見かけますが、これが本当の原因です。

解決方法としては、

  • systemd-resolved を設定して使うか
  • systemd-resolved をやめて、従来の Resolvconf を利用します。

終わりに

これでとりあえず systemd-resolvedResolvconf に関しては設定できると思いますが、設定ファイルが色々出てきて紛らわしいので、軽くまとめると。

systemd-resolved の設定ファイル

まずは、systemd-resolved について。

  • 設定反映コマンド : systemctl restart systemd-resolved
  • 設定確認コマンド : systemd-resolve --status
  • /run/systemd/resolve/resolv.conf は従来バージョンとの互換性のためのものsystemd-resolved を再起動すると /etc/systemd/resolved.conf に設定した nameserver / search がこのファイルにも反映される。 削除してもサービスを再起動すると自動的に生成される。 この動作モードを使用すると、ローカルの DNS API をバイパス (迂回) するローカルクライアントも systemd で解決されずに (スタブを介さずに)、従来通りに DNS サーバと直接通信する。

○ : スタブ DNS (127.0.0.1#53) 経由

× : 実際の DNS サーバに直接問合わせ

グローバル設定/etc/resolv.conf のリンク先スタブ使用有無
/etc/systemd/resolved.conf/usr/lib/systemd/resolv.conf
/run/systemd/resolve/stub-resolv.conf
/run/systemd/resolve/resolv.conf×

Resolvconf の設定ファイル

Resolvconf については、動的か静的かによって分けます。

  • 動的 Resolvconf の設定反映コマンド : resolvconf -u
  • 静的 Resolvconf の設定反映コマンド : なし、直接 /etc/resolv.conf を修正
  • 動的 / 静的共通 - 設定確認コマンド : cat /etc/resolv.conf
管理方法設定ファイル/etc/resolv.conf リンク先
動的/etc/resolvconf/resolv.conf.d/base/run/resolvconf/resolv.conf
静的/etc/resolv.confリンクなし、/etc/resolv.conf そのもの

OS 再起動が必要な場合

以下を実施した場合には、OS の再起動を実施してください。

  • systemd-resolved から Resolvconf へ切り替えを実施した場合
  • Resolvconf の管理方式を「動的から静的」に変更した場合
  • Resolvconf の管理方式を「静的から動的」に変更した場合
  • Resolvconf から systemd-resolved へ切り替えを実施した場合

以上、Ubuntu : systemd-resolved、及び Resolvconf 設定 でした。