⚙️

`resolvconf`が管理する`resolv.conf`を変更する方法

2021/07/25に公開

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を更新しているか」が書かれており、その「誰か」というのはresolvconfNetworkManagersystemd-resolved等、環境によって様々です。

私のRaspberry Pi OSの環境ではresolvconfがその「誰か」でした。

/etc/resolv.conf
# 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に追加します。

/etc/resolvconv.conf
name_servers=8.8.8.8

編集後はip linkを使って/etc/resolv.confへ反映する

編集したあとはresolvconf/etc/resolv.confへの再反映を要求する必要があります。

その方法を調査したところ、resolvconfifup/ifdownをトリガーにして/etc/resolv.confを更新するという情報を見つけました。

https://askubuntu.com/questions/224966/how-do-i-get-resolvconf-to-regenerate-resolv-conf-after-i-change-etc-network-in

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の反映結果を記載しておきます。

/etc/resolvconf.conf
# 新たに編集した内容
name_servers=8.8.8.8
/etc/resolv.conf
# resolvconfによって追加された内容
nameserver 8.8.8.8

以上、「resolvconfが管理するresolv.confを変更する方法」をお送りしました。

脚注
  1. https://stackoverflow.com/questions/19432026/how-do-i-edit-resolv-conf ↩︎

  2. 単なるShell Scriptであり、less /sbin/resovlconfでコードを確認できます ↩︎

Discussion