NetworkManager 和 dnsmasq - 忽略自动 DNS 设置

NetworkManager 和 dnsmasq - 忽略自动 DNS 设置

我正在运行 Arch Linux,并设置了 NetworkManager 和 dnsmasq。一切似乎都运行良好,只是我尝试使用新的 CloudFlare 1.1.1.1DNS,但解析器一直使用我的路由器公布的 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

持续使用nmcli dev show表明:

IP4.DNS[1]:                             192.168.1.254
IP6.DNS[1]:                             fe80::1

但我想使用 CloudFlare DNS,而不管本地网络如何(并且不必更改每个网络的连接设置)。我如何更改 DNS 查找的顺序,或禁用路由器的解析器?我尝试添加strict-order/etc/NetworkManager/dnsmasq.d/local无济于事。

答案1

我没有使用dnsmasq,但我遇到了类似的问题。我的解决方案是:

  • 将所需的 DNS 服务器输入到/etc/resolv.conf(參考

    # IPv4 nameservers: 
    nameserver 1.1.1.1
    nameserver 1.0.0.1
    # IPv6 nameservers:
    nameserver 2606:4700:4700::1111
    nameserver 2606:4700:4700::1001
    
  • 告诉 NetworkManager 不要修改您的,/etc/resolv.conf方法是在您的/etc/NetworkManager/NetworkManager.conf參考

    [main]
    dns=none
    

之后可能需要重启 NetworkManager 等。如果这样做,nmcli dev show它会显示路由器报告的 DNS 服务器:

IP4.DNS[1]:                             192.168.50.1

但是如果你使用nslookup(来自bind-toolsArch),它看起来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

更新:使用 dnsmasq 配置

我尝试了使用 dnsmasq 的配置。NetworkManager 有一个dnsmasq插件,您可以通过将其放入/etc/NetworkManager/NetworkManager.conf以下内容来使用:

[main]
dns=dnsmasq

这将从dnsmasqNetworkManager 启动并127.0.0.1放入/etc/resolv.conf參考)然而,我不是这样做是因为 dnsmasq 不受管理,systemctl并且您不会自动登录 journalctl(也许有某种方法可以解决这个问题)。

相反,我使用了以下配置(參考):

  • /etc/NetworkManager/NetworkManager.conf

    [main]
    dns=none
    
  • /etc/resolv.conf

    nameserver 127.0.0.1
    
  • /etc/resolv.dnsmasq.conf

     # IPv4 nameservers: 
     nameserver 1.0.0.1
     # IPv6 nameservers:
     nameserver 2606:4700:4700::1111
     nameserver 2606:4700:4700::1001
    
  • /etc/dnsmasq.conf

     resolv-file=/etc/resolv.dnsmasq.conf
     log-queries
    

重新启动 NetworkManager 和dnsmasq。现在,验证您的本地名称服务器没有被覆盖:

» cat /etc/resolv.conf
nameserver 127.0.0.1

我们还可以质疑NetworkManager:

» cat /run/NetworkManager/resolv.conf 
# Generated by NetworkManager
nameserver 192.168.50.1

» nmcli dev show
...
IP4.DNS[1]:                             192.168.50.1

但这些条目似乎只是表明路由器报告了什么,不一定是实际用于查询的内容,因为如果我们这样做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

另外,如果您按上面所示输入,运行两次后您log-queries会看到:/etc/dnsmasq.confjournalctldrill 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

第一次询问1.0.0.1,第二次在缓存中找到结果。如果满意,则可以log-queries从中删除。dnsmasq.conf

答案2

一个稍微好一点的方法是使用 的符号链接,因为它可以简化 NetworkManager 管理/etc/resolv.conf。这是我的发行版 (Fedora) 中的默认设置,您可以通过查看dns中的选项来在您的发行版中检查man 5 NetworkManager.conf

首先创建一个/usr/local/etc/resolv.cloudflare.conf包含 cloudflare DNS 的文件(我使用了),将 cloudflare 定义为权威 DNS:

# IPv4 nameservers: 
nameserver 1.1.1.1
nameserver 1.0.0.1
# IPv6 nameservers:
nameserver 2606:4700:4700::1111
nameserver 2606:4700:4700::1001

然后符号链接到该文件,删除现有文件。

sudo rm /etc/resolv.conf sudo ln -s /usr/local/etc/resolv.cloudflare.conf /etc/resolv.conf

此时,您可以通过以下方式验证名称服务器是否正确运行

$ dig google.com

; <<>> DiG 9.11.2-P1-RedHat-9.11.2-1.P1.fc26 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41906
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1536
;; QUESTION SECTION:
;google.com.            IN  A

;; ANSWER SECTION:
google.com.     185 IN  A   172.217.9.238

;; Query time: 10 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Thu Apr 12 18:00:37 EDT 2018
;; MSG SIZE  rcvd: 55

笔记:如果您的发行版的 NetworkManager 对变量有不同的默认值dns=,请更新它以包含以下内容。

[main]
dns=symlink

然后,如果你将 /etc/resolve.conf 设为符号链接,NetworkManager 将不会更新 resolve.conf,

相关内容