当 resolv.conf 被覆盖时,如何设置我的 DNS?

当 resolv.conf 被覆盖时,如何设置我的 DNS?

我在网上看到的大多数信息都说要编辑/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更改并未显示在 中。/etc/resolv.confsudo resolvconf -u

仅供参考,我不想在每个连接的基础上更改 DNS,我想设置默认 DNS 设置以在未另行指定时用于所有连接。

更新:

我自己回答了这个问题: https://unix.stackexchange.com/a/163506/67024

我认为这是最好的解决方案,因为:

  1. 有用。
  2. 它需要最少的改变并且
  3. 它仍然与 dnsmasq 的 DNS 缓存一起工作,而不是绕过它。

答案1

base我相信如果您想覆盖 DNS 名称服务器,您只需在 .txt下的文件中添加与此类似的行即可resolv.conf.d

例子

笔记:在开始之前,请确保安装了以下软件包,apt install resolvconf.

$ sudo vim /etc/resolvconf/resolv.conf.d/base

然后将您的名称服务器列表放入如下所示:

nameserver 8.8.8.8
nameserver 8.8.4.4

最后更新resolvconf

$ sudo resolvconf -u

如果您查看手册页,resolvconf它描述了/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这些文件将用于生成的结果文件中。因此,您也可以轻松地将nameserver上述文件中的行添加base到该head文件中。

参考

答案2

我也对这个问题感兴趣,我尝试了@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指出 dns 服务器是

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. 无论 dhcp 提供的服务器如何,dnsserver 实际上都被强制为 8.8.4.4,但是您会失去 dnsmasq 提供的缓存,因为请求始终发送到 8.8.4.4
  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 提供的服务器上请求。

另一个(也许更好)选项是使用“prepend”而不是“supersede”:这样,如果 8.8.8.8 未解析该名称,则请求将回退到其他服务器。事实上,nm-tool 说

DNS:             8.8.8.8    
DNS:             208.67.222.222
DNS:             208.67.220.220

答案3

我发现您可以dnsmasq通过添加以下行来更改使用的名称服务器/etc/dnsmasq.conf

server=8.8.8.8
server=8.8.4.4

不过我没有/etc/dnsmasq.conf文件,因为它是由 dnsmasq 软件包安装的,但 Ubuntu 仅附带 dnsmasq-base。我跑了sudo apt-get install dnsmasq,然后编辑/etc/dnsmasq.conf,然后sudo service dnsmasq restart然后sudo service network-manager restart

我跑去sudo tail -n 200 /var/log/syslog检查我的系统日志并验证是否dnsmasq正在使用我指定的名称服务器:

Oct 21 23:00:54 mylaptop dnsmasq[8611]: using nameserver 8.8.8.8#53
Oct 21 23:00:54 mylaptop dnsmasq[8611]: using nameserver 8.8.4.4#53

答案4

  1. 搜索“网络连接”

  2. 打开它

                        在此输入图像描述

  3. 然后选择 WiFi 或以太网,或者您正在使用的任何内容,然后单击编辑。你会得到这个:

                  在此输入图像描述

  4. 在选项卡中选择 ipv4

  5. 仅在方法中选择地址

  6. 在下面输入您的 DNS 名称并保存

  7. 你完成了

相关内容