ネット上の情報では、ほとんどの場合、/etc/resolv.conf
を編集するように書かれていますが、そこに変更を加えても上書きされてしまいます。
$ cat /etc/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
nameserver 127.0.1.1
127.0.1.1 は dnsmasq
のローカルインスタンスのようです。dnsmasqのドキュメントには、
/etc/resolv.confを編集するように書かれています。カスタムネームサーバーを
/etc/resolv.conf.d/baseに入れてみましたが、
sudo resolvconf -uを実行しても
/etc/resolv.conf` には変更が反映されませんでした。
参考までに、私は接続ごとにDNSを変更したいのではなく、他に指定がない場合にすべての接続に使用するデフォルトのDNS設定を設定したいのです。
更新:
私自身がこの質問に答えました。 https://unix.stackexchange.com/a/163506/67024
以来のベストソリューションだと思っています。
1.使える。 2.最も少ない変更で済む。 3.dnsmasq'のDNSキャッシュをバイパスするのではなく、それと連携して動作します。
DNSネームサーバーをオーバーライドしたい場合は、base
ファイルのresolv.conf.d
に以下のような行を追加するだけだと思います。
$ sudo vim /etc/resolvconf/resolv.conf.d/base
そして、ネームサーバーリストを以下のように入れます。
nameserver 8.8.8.8
nameserver 8.8.4.4
最後に resolvconf
を更新します。
$ sudo resolvconf -u
resolvconfのmanページを見てみると、
/etc/resolvconf/resolv.conf.d/`の下にある様々なファイルについて説明されています。
/etc/resolvconf/resolv.conf.d/base
File containing basic resolver information. The lines in this
file are included in the resolver configuration file even when no
interfaces are configured.
/etc/resolvconf/resolv.conf.d/head
File to be prepended to the dynamically generated resolver
configuration file. Normally this is just a comment line.
/etc/resolvconf/resolv.conf.d/tail
File to be appended to the dynamically generated resolver
configuration file. To append nothing, make this an empty
file. This file is a good place to put a resolver options line
if one is needed, e.g.,
options inet6
head`ファイルの先頭に警告が出ているにもかかわらず。
$ cat /etc/resolvconf/resolv.conf.d/head
# 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
この警告は、これらのファイルが構築されたときに、最終的にこれらのファイルが作成に使われる resolv.conf
ファイルに警告が反映されるようになっています。つまり、上記の base
ファイルで説明した nameserver
の行を head
ファイルにも簡単に追加することができるのです。
私もこの質問に興味があり、@simさんが提案されたソリューションを試してみました。
テストするために、私は
nameserver 8.8.8.8
を /etc/resolvconf/resolv.conf.d/base
に入れてみました。
nameserver 8.8.4.4
etc/resolvconf/resolv.conf.d/head` にあります。
そして、ネットワークを再起動して
sudo service network-manager restart
その結果、/etc/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
nameserver 8.8.4.4
nameserver 127.0.1.1
となり、nm-tool
では、dnsserver が
DNS: 208.67.222.222
DNS: 208.67.220.220
であり、これは私のルータで提供されているものです。 一方、アドレスを掘ると、次のことがわかります。
;; Query time: 28 msec
;; SERVER: 8.8.4.4#53(8.8.4.4)
私の考えが正しければ、これらのことから次のように結論づけられます。
1.resolvonfが読み取るのは"head"部分だけ:"base"部分は dnsmasqが何らかの形で制御している 2. dnsserverが実際に強制的に しかし、リクエストは常に8.8.4.4に送られるので、dnsmasqが提供するキャッシング機能は失われます。 3. dnsmasq は依然として dhcp によって提供された dnsserver のみを使用しています。
結局のところ、動作はしますが、求められている結果にはならないと思います。 より近い解決策は次のようなものだと思います。編集
sudo vim /etc/dhcp/dhclient.conf
を編集して
supersede domain-name-servers 8.8.8.8;
結果は次のようになります。resolv.confには127.0.0.1しか含まれていないので、dnsmasqキャッシュが起動し、nm-toolでは
DNS: 8.8.8.8
これは、検索された名前がキャッシュにない場合、8.8.8.8 に尋ねられ、dhcp で提供されたサーバには尋ねられないことを意味します。
もう一つの(おそらくより良い)オプションは、"supersede"の代わりに"prepend"を使うことです: この方法では、8.8.8.8で名前が解決されない場合、リクエストは他のサーバにフォールバックされます。実際、nm-toolでは
DNS: 8.8.8.8
DNS: 208.67.222.222
DNS: 208.67.220.220