`resolvconf`が管理する`resolv.conf`を変更する方法
TL;DR
-
/etc/resolv.conf
には管理者が居て、直接編集をしてはいけない -
resolvconf
がその管理となる環境では/etc/resolvconf.conf
を編集する - 編集後は
ip link set
を使って/etc/resolv.conf
へ反映する
まえおき
この記事では/etc/resolv.conf
の編集、およびシステムへの反映方法を取り扱います。検証環境はDebianベースのRaspberry Pi OS
です。(2018年頃の比較的古いバージョンですがご容赦ください...)
$ uname -srom
Linux 4.14.50-v7+ armv7l GNU/Linux
$ cat /etc/debian_version
9.4
/etc/resolv.conf
には管理者が居て、直接編集をしてはいけない
DNS関連の設定を変更したい場合にインターネットで検索をすると、この/etc/resolv.conf
を対象とする事例が多く見つかると思います。[1]
設定したい内容はここでは問いませんが、実際に/etc/resolv.conf
の内容を確認すると何かしらのコメントが記述されているはずです。そのコメントには「誰が/etc/resolv.conf
を更新しているか」が書かれており、その「誰か」というのはresolvconf
やNetworkManager
やsystemd-resolved
等、環境によって様々です。
私のRaspberry Pi OSの環境ではresolvconf
がその「誰か」でした。
# Generated by resolvconf
...
この環境ではresolvconf
というプログラムによって/etc/resolv.conf
は管理・更新されます。テキストファイルなので直接編集は可能ですが、変更してもその後resolvconf
の実行タイミング(後述)で上書きされてしまいます。
resolvconf
がその管理となる環境では/etc/resolvconf.conf
を編集する
ではどのように編集を行えばよいのか、まずはresolvconf
について理解していきます。
resolvconfとは
man resolvconf
から重要な記述を確認できます。
以前よりも/etc/resolv.conf
で管理すること増えたので、設定を別ファイル化してresolvconf
がいい感じに/etc/resolv.conf
に反映させます(意訳)とのことです。
Traditionally, the host runs just one client and that updates /etc/resolv.conf. More modern systems frequently have wired and wireless interfaces and there is no guarantee both are on the same network. With the advent of VPN and other types of networking daemons, many things now contend for the contents of /etc/resolv.conf.
resolvconf solves this by letting the daemon send their resolv.conf(5) file to resolvconf via stdin(3) with the argument -a interface[.protocol] instead of the filesystem. resolvconf then updates /etc/resolv.conf as it thinks best. When a local resolver other than libc is installed, such as dnsmasq(8) or named(8), then resolvconf will supply files that the resolver should be configured to include.
そしてresolvconf
に関する設定は/etc/resolvconf.conf
で行うとあります。
FILES
...
/etc/resolvconf.conf
Configuration file for resolvconf.
登場人物は3つ
名前が似ていて混乱しますが、語彙を整理します。
-
resolvconf
.../etc/resolv.conf
を管理・更新するプログラム[2] -
/etc/resolv.conf
... resolvconfの処理結果の出力先ファイル -
/etc/resolvconf.conf
... resolvconfの挙動を決めるための設定ファイル
つまり設定項目の流れはこうなります。resolvconf
によって出力される/etc/resolv.conf
がシステムのDNS関連の挙動を決める設定ファイルとして振る舞います。
/etc/resolvconf.conf
↓
(resolvconf)
↓
/etc/resolv.conf
以降の記述にはresolv.conf
と/etc/resolvconf.conf
が混在しますが、両者を混同しないよう注意して下さい。
resolvconf.conf
で設定可能な項目
/etc/resolvconf.conf
で設定可能な項目は多数存在しますので、man resolvconf.conf
から詳細を確認して下さい。
最も適用例が多いものとしてはDNSサーバーでしょう。例えばGoogleのPublic DNSを設定するにはname_servers
を/etc/resolvconf.conf
に追加します。
name_servers=8.8.8.8
ip link
を使って/etc/resolv.conf
へ反映する
編集後は編集したあとはresolvconf
に/etc/resolv.conf
への再反映を要求する必要があります。
その方法を調査したところ、resolvconf
はifup
/ifdown
をトリガーにして/etc/resolv.conf
を更新するという情報を見つけました。
To update the database you have to call resolvconf with the -a or -d option. That happens behind the scenes when you run ifup or ifdown.
...
to activate changes to the dns-* options you have to ifdown the interface in question and ifup it again. Or you can reboot.
引用した回答コメントではifup
, ifdown
を実行するように解説されています。ifdown
,ifup
が利用可能な環境もありますが、私の検証環境(Raspbery Pi OS)ではeth0
に対して使えなかったので、本記事ではip link set
を使った説明に置き換えます。ほとんどの環境でip link set
は利用可能だと思います。
eth0
デバイスを対象に/etc/resolvconf.conf
の設定を反映する場合はこうなります。&&
でつないでも良いです。
$ sudo ip link set eth0 down
$ sudo ip link set eth0 up
変更内容の確認
変更内容が/etc/resolv.conf
に反映されていることを確認します。
適用例として先述のname_servers
の反映結果を記載しておきます。
# 新たに編集した内容
name_servers=8.8.8.8
# resolvconfによって追加された内容
nameserver 8.8.8.8
以上、「resolvconf
が管理するresolv.conf
を変更する方法」をお送りしました。
-
https://stackoverflow.com/questions/19432026/how-do-i-edit-resolv-conf ↩︎
-
単なるShell Scriptであり、
less /sbin/resovlconf
でコードを確認できます ↩︎
Discussion