Tac*_*lff 4 resolv.conf networkmanager arch-linux dnsmasq
我正在运行带有 NetworkManager 和 dnsmasq 设置的 Arch Linux。一切似乎都很好,除了我尝试使用新的 CloudFlare 1.1.1.1
DNS,但解析器一直使用我的路由器通告的 DNS。似乎添加了名称服务器,包括我的路由器的 IP,见下文:
Apr 04 20:02:56 tdewolff dnsmasq[22337]: setting upstream servers from DBus
Apr 04 20:02:56 tdewolff dnsmasq[22337]: using nameserver 2606:4700:4700::1001#53
Apr 04 20:02:56 tdewolff dnsmasq[22337]: using nameserver 2606:4700:4700::1111#53
Apr 04 20:02:56 tdewolff dnsmasq[22337]: using nameserver 1.0.0.1#53
Apr 04 20:02:56 tdewolff dnsmasq[22337]: using nameserver 1.1.1.1#53
Apr 04 20:02:56 tdewolff dnsmasq[22337]: using nameserver 192.168.1.254#53(via wlp4s0)
Apr 04 20:02:56 tdewolff dnsmasq[22337]: using nameserver fe80::1%wlp4s0#53
Apr 04 20:02:56 tdewolff dnsmasq[22337]: cleared cache
Run Code Online (Sandbox Code Playgroud)
使用nmcli dev show
一致显示:
IP4.DNS[1]: 192.168.1.254
IP6.DNS[1]: fe80::1
Run Code Online (Sandbox Code Playgroud)
但我想使用 CloudFlare DNS,而不考虑本地网络(并且不必更改每个网络的连接设置)。如何更改 DNS 查找的顺序,或禁用路由器的解析器?我尝试添加strict-order
到/etc/NetworkManager/dnsmasq.d/local
但无济于事。
我没有使用dnsmasq
,但我遇到了类似的问题。我的解决方案是:
把你想要的 DNS 服务器放在/etc/resolv.conf
( ref )
# IPv4 nameservers:
nameserver 1.1.1.1
nameserver 1.0.0.1
# IPv6 nameservers:
nameserver 2606:4700:4700::1111
nameserver 2606:4700:4700::1001
Run Code Online (Sandbox Code Playgroud)告诉 NetworkManager 不要/etc/resolv.conf
通过写入您的/etc/NetworkManager/NetworkManager.conf
( ref )来修改您的
[main]
dns=none
Run Code Online (Sandbox Code Playgroud)之后可能会重新启动 NetworkManager 等。如果你这样做,nmcli dev show
它会显示路由器报告的 DNS 服务器:
IP4.DNS[1]: 192.168.50.1
Run Code Online (Sandbox Code Playgroud)
但是如果你使用nslookup
(from bind-tools
in Arch),它看起来1.1.1.1
实际上是用于查询的:
» nslookup google.com
Server: 1.1.1.1
Address: 1.1.1.1#53
Non-authoritative answer:
Name: google.com
Address: 172.217.9.238
Name: google.com
Address: 2607:f8b0:4006:801::200e
Run Code Online (Sandbox Code Playgroud)
我用 dnsmasq 尝试了一个配置。NetworkManager 有一个dnsmasq
插件,您可以通过放入/etc/NetworkManager/NetworkManager.conf
以下内容来使用它:
[main]
dns=dnsmasq
Run Code Online (Sandbox Code Playgroud)
这将启动dnsmasq
与NetworkManager和投入127.0.0.1
到/etc/resolv.conf
(REF)。但是,我没有这样做,因为 dnsmasq 不受管理,systemctl
并且您不会自动登录 journalctl(也许有一些方法可以解决这个问题)。
相反,我使用了以下配置(ref):
/etc/NetworkManager/NetworkManager.conf
:
[main]
dns=none
Run Code Online (Sandbox Code Playgroud)/etc/resolv.conf
:
nameserver 127.0.0.1
Run Code Online (Sandbox Code Playgroud)/etc/resolv.dnsmasq.conf
:
# IPv4 nameservers:
nameserver 1.0.0.1
# IPv6 nameservers:
nameserver 2606:4700:4700::1111
nameserver 2606:4700:4700::1001
Run Code Online (Sandbox Code Playgroud)/etc/dnsmasq.conf
:
resolv-file=/etc/resolv.dnsmasq.conf
log-queries
Run Code Online (Sandbox Code Playgroud)重新启动 NetworkManager 和dnsmasq
. 现在,验证您的本地名称服务器没有被覆盖:
» cat /etc/resolv.conf
nameserver 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
我们也可以质疑 NetworkManager:
» cat /run/NetworkManager/resolv.conf
# Generated by NetworkManager
nameserver 192.168.50.1
» nmcli dev show
...
IP4.DNS[1]: 192.168.50.1
Run Code Online (Sandbox Code Playgroud)
但是这些条目似乎只是表示路由器报告的内容,不一定是实际用于查询的内容,因为如果我们这样做drill google.com
,我们会看到127.0.0.1
实际上使用了:
;; Query time: 0 msec
;; SERVER: 127.0.0.1
;; WHEN: Fri Apr 20 11:32:59 2018
;; MSG SIZE rcvd: 44
Run Code Online (Sandbox Code Playgroud)
另外,如果你把log-queries
成/etc/dnsmasq.conf
如上图所示,你看到journalctl
后运行drill stackoverflow.com
两次:
dnsmasq[27679]: query[A] stackoverflow.com from 127.0.0.1
dnsmasq[27679]: forwarded stackoverflow.com to 1.0.0.1
dnsmasq[27679]: reply stackoverflow.com is 151.101.1.69
dnsmasq[27679]: reply stackoverflow.com is 151.101.65.69
dnsmasq[27679]: reply stackoverflow.com is 151.101.129.69
dnsmasq[27679]: reply stackoverflow.com is 151.101.193.69
dnsmasq[27679]: query[A] stackoverflow.com from 127.0.0.1
dnsmasq[27679]: cached stackoverflow.com is 151.101.193.69
dnsmasq[27679]: cached stackoverflow.com is 151.101.129.69
dnsmasq[27679]: cached stackoverflow.com is 151.101.65.69
dnsmasq[27679]: cached stackoverflow.com is 151.101.1.69
Run Code Online (Sandbox Code Playgroud)
第一次询问1.0.0.1
,第二次在缓存中找到结果。您可以删除log-queries
从dnsmasq.conf
是否满足。