我在网上看到的大多数信息都说要编辑/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是的本地实例dnsmasqdnsmasq文档说编辑/etc/resolv.conf。我尝试将自定义名称服务器放在/etc/resolv.conf.d/base中,但是运行/etc/resolv.conf后,更改未在sudo resolvconf -u中显示。

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

更新:

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

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


它起作用。
它需要最少的更改,并且
它仍然可以与dnsmasq的DNS缓存结合使用,而不是绕过它。


评论

我认为更好地回答您的问题,而不是更新您的问题,...将更容易找到您对问题给出的正确答案

似乎大多数答案都是面向Ubuntu的,而且过于复杂。针对NetworkManager用户的通用解决方案是,只需在/etc/NetworkManager/NetworkManager.conf中添加dns = none(请参见下面我的答复中的详细信息)。

我认为此答案阐明了为什么resolv.conf被覆盖,然后您知道如何配置它。

#1 楼

我相信,如果您想覆盖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的手册页,其中描述了/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文件中,这些文件将用于制作此文件。因此,您也可以轻松地将上面针对resolv.conf文件描述的nameserver行也添加到base文件中。

参考文献


持久性DNS名称服务器for ubuntu 14.04
如何通过resolv.conf添加DNS服务器?


评论


Ubuntu 14.04-当我将名称服务器放入基础并运行resolvconf -u时,名称服务器未放入resolv.conf-当我将名称服务器放入头部时,它们是

–HorusKol
15年5月27日,0:48

Ubuntu 14.04-还必须注释掉/ run / resolvconf / interface / NetworkManager中设置的配置

–bitsoflogic
2015年10月13日14:18在

键入nslookup google.com,列表中的第一个IP应该是您的新名称服务器,否则请输入错误

– frazras
17-10-30在1:59



Ubuntu 16.04:仅在附加到/etc/resolvconf/resolv.conf.d/head而不与base一起使用时才有效。已通过nslookup google.com确认。

–触角
18年4月1日在18:22

最初,您必须安装了resolvconf。您可以通过执行sudo apt-get install resolvconf进行安装。

– MAChitgarha
18年8月15日在16:03

#2 楼

我对此问题也很感兴趣,并尝试了建议的@sim解决方案。

为了测试它,我在/etc/resolvconf/resolv.conf.d/base中放入了

nameserver 8.8.8.8


,然后

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)


如果我是对的,我从这一切得出结论,
/>

resolvonf仅读取“ head”部分:“ base”部分由dnsmasq控制
dnsserver实际上被强制为
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


评论


比破解NS配置更好的答案。特别是在dhcp所提供的服务器之前添加服务器的选项。似乎是解决问题而不创建新问题的完美平衡!

–史蒂夫·米德利(Steve Midgley)
2014年11月22日在21:08

值得注意的是nm-tool已被nmcli取代

–Fiddy Bux
19年1月25日在21:55

#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 restartsudo 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


评论


将其标记为最佳答案是有原因的……因为确实如此!非常感谢!我要补充一点,在您提到的所有步骤之后,可能需要网络重启才能使所有组件正常运行(这对我来说是...。sudo service network-manager restart)

–克林特·伊斯特伍德
2015年2月5日,19:16

在Ubuntu 14.04 Server上,大约一半时间的冷启动不会导致使用URL进行互联网连接,但可以使用IP地址。我花了很多时间徒劳地尝试修复它,放弃了几个月,然后才找到了解决方案。我也认为这是最好的答案。

–内特·洛克伍德(Nate Lockwood)
15年9月24日在17:42

有趣的是必须安装dnsmasq。这确实在正常情况下解决了我的DNS问题,但是却完全破坏了我的VPN配置(VPN连接现在失败...)

–等离子Binturong
18年4月1日在19:40

Centos上没有这样的文件

–stiv
19-10-23在8:25

ubuntu 16:dnsmasq对过程的更改不会传播到/etc/resolv.conf中。结果是,帽子nslookup仍使用其原始定义的本地主机127.0.0.1。虽然我可以确认您提到的系统日志。

–woodz
5月25日18:38



#4 楼

对于静态IP情况,《 Ubuntu Server指南》说要更改文件/ etc / network / interfaces,如下所示:

iface eth0 inet static
address 192.168.3.3
netmask 255.255.255.0
gateway 192.168.3.1
dns-search example.com
dns-nameservers 192.168.3.45 192.168.8.10


更改IP 192.168。 3.45 192.168.8.10即可满足您的需求,例如8.8.8.8

https://help.ubuntu.com/14.04/serverguide/serverguide.pdf
第38页

评论


这看起来确实正确,但是现在如何重新生成resolv.conf?

–乔尔·伯格(Joel Berger)
16年1月22日在22:59

@JoelBerger ifdown eth0; ifup eth0。

– Dzamo Norton
17年7月25日在0:11

Centos上没有/ etc / network / interfaces

–stiv
19-10-23在8:26

#5 楼



搜索“网络连接”


打开它



然后选择WiFi或以太网,或您正在使用的任何内容,然后单击“编辑”。您将获得以下信息:



在选项卡中选择ipv4


仅在方法中选择地址


在下面输入您的DNS名称,并将其保存


您已完成



评论


不过,我必须为每个网络连接执行此操作。过去,您可以更改所有连接的默认设置,这就是我在这里要做的。

–塞恩·海斯(SeánHayes)
2014年11月9日18:17

我爱你!这个用户界面设置从sudo和vim mess中保存了我的屁股:'(

–卢克
15年3月28日在14:05

使用Mint(在Ubuntu 14.04上)-但也可以在KDE中看到-由于某种原因,在GUI Network Manager中设置DNS服务器不会影响终端中使用的DNS设置

–HorusKol
15年5月27日,0:51

最好的答案恕我直言。在Ubuntu 14.04上,我有2个DNS外部IP地址,这些IP地址无法识别我的家庭网络中的客户端。有线连接的“自动(DHCP)”上的离开方法将路由器的IP地址添加到现有列表中。对于通过wlan0的无线连接,该方法不起作用,但是“仅自动(DHCP)地址上的方法”用我的路由器IP替换了外部地址,然后它也起作用了。使用sudo service network-manager重新启动应用更改,稍等片刻,使用nmcli d list进行验证。 grep“ DNS \ | IP-IFACE”。并按名称ping您的内部客户。

– RolfBly
15年6月23日在15:09

这是正确的答案

–java-addict301
7月5日下午5:58

#6 楼

尚未提及的一种快速而肮脏的解决方法是在编辑后立即在resolv.conf文件上设置不可变标志。

$ sudo nano /etc/resolv.conf


添加并保存:

nameserver 8.8.8.8


然后:

$ sudo chattr +i /etc/resolv.conf


这应该可以解决问题。我也在系统上执行此操作。

评论


每当您的解决方案涉及chattr时,它并不是真正的解决方案。

– Jeff Jirsa
16年6月10日在18:23

这是我在出于某种原因需要临时更改DNS且不想修改配置的系统上所做的事情。作为永久解决方案,我不会推荐它。

– hochl
16-10-24在11:19

“快速而肮脏的解决方法”

–尤尼斯·本萨拉(Younis Bensalah)
16-10-24在13:57

这不脏。破坏本地配置的程序因为他们认为自己更了解而变得肮脏。

–user41515
17年4月26日在21:24

#7 楼

我的问题有点不同,我想覆盖路由器DNS服务器。我从Ubuntu找到了此链接:https://wiki.ubuntu.com/OverrideDNSServers

它说:
如果您想覆盖DHCP服务器提供给您的DNS设置,打开

/etc/dhcp3/dhclient.conf


并添加以下行:

supersede domain-name-servers <dns_ip_address1>,<dns_ip_address2>;


用适当的内容替换<dns_ip_address*>的项目。

评论


这是解决我的问题的答案。

–迈克尔
17年1月18日在19:01

完善。仅添加您应该重新启动sudo服务网络以启用更改。

–尼克·Triantafillou
17 Mar 20 '17 at 22:21

如果我们没有该dhcp3文件夹怎么办?我有Xubuntu 17.10,它是否已简单地移至/ etc / dhcp?

–等离子Binturong
18年4月1日在19:12

在我的情况下,@ PlasmaBinturong是最新的Debian和Ubuntu版本上的/etc/dhcp/dhclient.conf。

–baptx
3月22日12:46

#8 楼

尝试将dns-nameservers XXX.XXX.XXX.X添加到您的/etc/networking/interfaces文件中。

评论


请在投票时发表评论。这是手册第38页中给出的方法。

–祖克
14年7月24日在16:07

未提及的手册在一行上显示了所有IP。这个答案似乎建议添加一行。为什么最后一个数字只有一个X宽?我认为这主要是因为极度非正式和不确定的简短聊天式写作而引起了人们的反对,@Zook。

– Cees Timmerman
2015年6月12日10:07



#9 楼

也许我缺少了一些东西,但是根据https://help.ubuntu.com/14.04/serverguide/network-configuration.html上的配置说明,您要做的就是更新以下内容。我没有运行代理-只是一台位于防火墙和本地DNS之后的计算机(示例显示了Google,但将其设置为您需要的任何内容)。

nano /etc/network/interfaces


默认值:

# This file...
# and how to activate...

# The loopback...
auto local
iface lo inet loopback

# The primary network interface 
auto eth0
iface eth0 inet dhcp


更新:

# This file...
# and how to activate...

# The loopback...
auto local
iface lo inet loopback

# The primary network interface 
#iface eth0 inet dhcp
iface eth0 inet static
address x.x.x.x
netmask 255.255.255.0
gateway x.x.x.x

#nameservers
# you may not need dns-search
# I use it because I'm running this on a Windows network 
# so its useful to have
# dns-search x.y 
dns-nameservers 4.4.4.4 8.8.8.8


如果可以,请重新启动。

#10 楼

这里的一些答案很好用。但是我对必须手动浏览配置文件以设置“正确的” DNS感到不满意,因为我已经通过DHCP通过NetworkManager接收到了它。

我做了一点挖掘,发现/etc/resolv.conf文件实际上是一个链接,它指向/run/systemd/resolve/stub-resolv.conf。经过一些试验后,似乎/run/systemd/resolve/目录包含另一个名为resolv.conf的文件,该文件已经包含您通过DHCP收到的设置。因此,不必在/etc/中手动覆盖/创建配置文件,只需重新链接/etc/resolv.conf指向/run/systemd/resolve/resolv.conf文件,一切就可以了:

# sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf


现在,您甚至应该可以从Gnome中的网络管理器中编辑设置。 :)

不知道这是否可以在较旧的ubuntu上使用,但是在Ubuntu 17.10上可以。

评论


当我们运行systemd-resolve --flush-cache时,原始链接文件显然被切断了,上面的答案恢复了原始功能。

– hafizhanindito
19年3月17日在19:34

#11 楼

编辑2016年5月6日

我编写了一个脚本来更新/etc/Network-Manager/system-connections/目录中系统连接的所有设置。用于编辑单个连接的GUI将编辑该目录中的特定文件。该脚本会更新所有文件-仅搜索那些未使用grep设置dns的文件,并使用awk对其进行设置。然后-重新启动网络管理器

#!/bin/bash
# Author: Serg Kolo
# Date: May 6, 2015
# Description: this script checks all settings for connections in 
# /etc/NetworkManager/system-connections/ , and if there's no custom
# dns set , this script sets it;
# NOTE: run sudo service network-manager restart after running this script

set -x

for file in /etc/NetworkManager/system-connections/* ; do
        grep 'dns=208.67.220.220;' "$file"  || ( awk '{print;if (=="[ipv4]"){getline; print "method=auto\ndns=208.67.220.
220;\nignore-auto-dns=true"}}' "$file" > .tmpfile && ( cat .tmpfile > "$file") )
done


脚本在起作用:



原始帖子
有些这里的用户指出DNS是由sudo控制的。确实是这样。我遇到了一个较小的问题,无论我如何在sudo中更改dnsmasqhead,我的计算机实际上都无法访问由域名托管的域名-仅使用IP地址。

我所做的是编辑body文件。最初,它说的是/etc/resolvconf/resolv.conf.d,但我将其更改为:/etc/NetworkManager/NetworkManager.conf。尽管通过这种方式,dns=dnsmasq并未提及208.67.222.222,但我仍然能够使用域名,而不仅仅是IP地址。

我的dns=208.67.222.222文件如下所示:

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq
dns=208.67.222.222

[ifupdown]
managed=false


注意:有关我的问题和此解决方案的更多详细信息,请参阅我的文章在askubuntu.com上。

更新#1

今天从大学回到家,我发现无法连接到家庭WiFi。我已经在nm-tool上进行了一些阅读,结果发现NetworkManager.conf中的man NetworkManager.conf实际上是用于插件的行,因此dns=行实际上是在网络管理器中添加了dnsmasq插件。

所以我的解决方案仍然有效,只是没有达到我的预期。以下是手册页的摘录:


dns=plugin1,plugin2, ... List DNS plugin names separated by ','. 


DNS插件用于提供本地缓存名称服务器功能
(可加快DNS查询),将DNS数据推送到使用它的应用程序



因此,通过设置[main],基本上可以防止NetworkManager使用该插件,否则它将使用本地DNS服务器(显然不起作用)。

#12 楼

有两种方法

方法1

可以通过更新head下的resolv.conf.d文件来更改要使用的DNS服务器

$ echo 'nameserver 1.1.1.1' | sudo tee /etc/resolvconf/resolv.conf.d/base


,然后运行

$ sudo resolvconf -u


以上内容将在resolv.conf目录中生成一个通用的/etc文件。您所有的解决请求将发送到上述名称服务器。解决了。​​

但是有一些影响。当使用resolvconf直接查询1.1.1.1的地址分辨率时,由dnsmasq提供的缓存功能消失了。每个请求都将发送到1.1.1.1

方法2

如果您不希望上述情况发生,请使用dnsmasq进行DNS解析,请参考此答案。答案仅在此处简单描述。

/etc/dnsmasq.conf文件中添加以下内容。


服务器= 1.1.1.1


然后重新启动dnsmasq服务

$ sudo systemctl restart dnsmasq.service


一切正常。解决了。​​

#13 楼

更改DNS的简单方法:

$ sudo nano /etc/network/interfaces


如果出现问题,请安装nano

$ sudo apt-get install nano -y


然后..


找到此内容:dns-nameservers
如果找不到它,只需在其中键入
我确实是这样的:dns-nameservers 199.85.126.10 199.85.127.10


我希望这是最好的方法,顺便说一句,我是在VPS上这样做的。

#14 楼

在根目录上:


dns=dnsmasq上注释/etc/NetworkManager/NetworkManager.conf

supersede domain-name-servers 4.2.2.1,4.2.2.3,4.2.2.5,4.2.2.4,4.2.2.1,4.2.2.2;末尾添加/etc/dhcp/dhclient.conf

sudo service network-manager restart

以下内容进行了上述更改:

$ sudo sed -i 's/dns\x3Ddnsmasq/\x23dns\x3Ddnsmasq/' \
   /etc/NetworkManager/NetworkManager.conf

$ echo 'supersede domain-name-servers 4.2.2.1,4.2.2.3,4.2.2.5,4.2.2.4,4.2.2.1,4.2.2.2;' | \
   sudo tee --append /etc/dhcp/dhclient.conf

$ sudo service network-manager restart


等待7/10秒以完成重新启动过程,请使用
“ nslookup nist.gov检查配置。 ”。在Ubuntu LTS 14.04上运行良好。

#15 楼

注意:像大多数答案一样,该示例假定使用NetworkManager。但是,与大多数其他答案不同,它不假设使用resolvconfdhclient或其他任何东西,但是请注意,它们可能会接管(请参阅更新)。

鉴于此问题的观点令人难以置信的是,这8个字符的解决方案尚未发布:根据man NetworkManager.conf




,因此在[main]/etc/NetworkManager/NetworkManager.conf部分中添加

dns=none


,然后重新启动NetworkManager,它将不会。请再次修改/etc/resolv.conf

请注意,设置rc-manager=unmanaged应该等​​效于dns=none,并且将rc-manager=symlink设置为符号链接可能是一个更好的主意(请参见上述联机帮助页)。 />
更新:

在NetworkManager停止覆盖/etc/resolv.conf之后,我发现/etc/resolv.conf在启动时已经用一个无用的空文件替换了dhcpcd/etc/resolv.conf的联机帮助有所帮助,足以在您的dhcpcd.conf中添加

nohook resolv.conf


(我的在dhcpcd.conf中)。

#16 楼

这是因为特定的已安装应用程序正在管理该文件。
您可以卸载该应用程序,也可以直接通过该应用程序设置所需的选项。

我的情况(Linux centos7最小服务器)具有相同的功能。我在# Generated by NetworkManager文件的顶部得到resolv.conf的情况,所以我可以更改此选项的最佳方法是使用
nmtui命令。您可以在此工具中编辑名称服务器,并且当您从该实用程序更改networkmanager的选项时,它们将在重新启动后自动应用于/etc/resolv.conf。在这里您可以找到更多信息。

#17 楼

互联网上没有任何帮助,因为每次我连接和断开VPN连接时,NordVPN的CLI实用程序都会覆盖/etc/resolv.conf。它甚至覆盖了chattr +i,这真是太烦人了!
对我有用的是完全禁用了resolvconf!
编辑/etc/resolvconf.conf并使其成为唯一的条目:
resolv_conf=NO

这专门禁用了resolvconf ,表示您的/etc/resolv.conf将永远不会被其更改。然后继续并执行sudo chattr +i /etc/resolv.conf
在Arch Linux上进行了测试。

#18 楼

在Centos 7上,使用NetworkManager,我能够找到的最干净,持久,有效的解决方案是创建一个使用nmcli设置所需值的NetworkManager脚本。
例如
使用以下命令创建/etc/NetworkManager/dispatcher.d/mydns.sh权限755和以下内容:
#!/usr/bin/sh

if [  == "enp0s11" -a  == "up" ]
then
        echo "Setting my DNS ( is )" | logger

        # disable default DNS
        nmcli device mod enp0s11 ipv4.ignore-auto-dns yes

        # Substitute our own DNS, in the desired order
        nmcli device mod enp0s11 ipv4.dns "10.0.1.101 10.0.1.1"
fi

并进行测试,无需重新启动:
systemctl restart NetworkManager.service
cat /etc/resolv.conf

YMMV,但这是我发现允许/ etc /的唯一方法resolv.conf可以“生存”一次重启,而不会被我不想要的值覆盖。