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


279

我在网上看到的大多数信息都说要编辑/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.conf运行后没有出现更改sudo resolvconf -u

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

更新:

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

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

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

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

似乎大多数答案都是面向Ubuntu的,而且过于复杂。NetworkManager的用户的通用解决方案是简单地增加dns=none/etc/NetworkManager/NetworkManager.conf(见我的回答如下详细说明)。
Skippy le Grand Gourou

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

Answers:


250

我相信,如果您要覆盖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文件顶部有一个警告:

$ 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将用于制作这些文件的结果文件中。因此,您也可以轻松地nameserverbase文件的上述行添加到head文件中。

参考文献


21
Ubuntu 14.04-当我将名称服务器放入base并运行时resolvconf -u,名称服务器放入resolv.conf-当我将名称服务器放入时head,它们是
HorusKol 2015年

7
Ubuntu /run/resolvconf/interface/NetworkManager
14.04-

3
类型,nslookup google.com并且列表中的第一个IP应该是您的新名称服务器,如果没有,则说明您输入的是错误的
frazras 17-10-30

6
Ubuntu 16.04:/etc/resolvconf/resolv.conf.d/head仅在附加时有效,不适用于base。确认nslookup google.com
Acumenus

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

79

我对这个问题也很感兴趣,我尝试了建议的解决方案@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. 无论dhcp提供的服务器如何,实际上dnsserver都被强制为8.8.4.4,但是由于请求始终发送到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提供的服务器上请求它。

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

DNS:             8.8.8.8    
DNS:             208.67.222.222
DNS:             208.67.220.220

4
比入侵NS配置更好的答案。特别是在dhcp所提供的服务器之前添加服务器的选项。似乎是解决问题而不创建新问题的完美平衡!
史蒂夫·米德利

2
答案中包含了如此多的清晰度和思想,而不仅仅是命令。
igaurav 2014年

3
你好!“取代域名服务器8.8.8.8;” 是答案
杰克

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

59

我发现您可以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

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

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

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

22

对于静态IP情况,《 Ubuntu服务器指南》说要更改文件/ 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?
乔尔·伯杰

3
@JoelBerger ifdown eth0; ifup eth0
Dzamo Norton

17
  1. 搜索“网络连接”
  2. 打开它

                        在此处输入图片说明

  3. 然后选择WiFi或以太网,或您正在使用的任何东西,然后单击“编辑”。您会得到:

                  在此处输入图片说明

  4. 在标签中选择ipv4

  5. 仅在方法中选择地址
  6. 在下面输入您的DNS名称,然后保存

  7. 你完成了


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

2
我爱你!此用户界面设置从sudo和vim mess中保存了我的屁股:'(
路加福音

使用Mint(在Ubuntu 14.04上)-但也可以在KDE中看到这一点-由于某种原因,在GUI网络管理器中设置DNS服务器不会影响终端中使用的DNS设置
HorusKol 2015年

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

13

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

$ sudo nano /etc/resolv.conf

添加并保存:

nameserver 8.8.8.8

然后:

$ sudo chattr +i /etc/resolv.conf

这应该够了吧。我也在我的系统上执行此操作。


18
每当您的解决方案涉及chattr时,它并不是真正的解决方案。
杰夫·吉萨(Jirsa)2013年

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

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

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

11

Linux下的DNS配置

Linux上的DNS使用是通过 C库中的一组例程完成的,这些例程提供对Internet域名系统(DNS)的访问。解析器配置文件(resolv.conf)包含由解析器例程在首次被进程调用时读取的信息。简而言之,每个请求DNS的进程都将读取/etc/resolv.conf库。NSS位于此之上,并由配置/etc/nsswitch.conf

Linux DNS config位于文件/etc/resolv.conf BUT中,但是有许多程序/服务想要自动管理和处理DNS配置文件,位于/etc/resolv.conf。在某些情况下,您可能需要自己管理此文件。每个管理DNS的程序/服务都有其自己的配置文件,例如/etc/dnsmasq.conf(针对dnsmasq服务),并在连接更改和/或其他事件时附加DNS配置...一种快速的解决方案是使用锁定DNS配置文件,chattr +i /etc/resolv.conf但是不建议这样做在某些情况下,更好的解决方案是使用DNS(例如dnsmasq / network-manager / resolvconf / etc)正确设置所有程序/服务。

重新获得对DNS的控制

以下是详尽的设置列表,以取回resolv.conf的控制权并避免覆盖它(如何从resolv.conf以外的其他位置禁用/设置DNS)请注意,resolvconf是独立于resolv.conf的程序,根据您的系统/配置,您可能没有此处列出的一个或多个程序。

1. Resolvconf:

配置文件

cat /etc/resolvconf/resolv.conf.d/head
nameserver 8.8.4.4
cat /etc/resolvconf/resolv.conf.d/base
nameserver 8.8.4.4

更新配置

sudo resolvconf -u

禁用resolvconf

systemctl disable --now resolvconf.service 

2. Dnsmasq服务:

配置文件

cat /etc/dnsmasq.conf
server=1.1.1.1
server=8.8.4.4

更新配置

sudo systemctl restart dnsmasq.service

3.网络管理员:

配置文件

/etc/NetworkManager/*

禁用DNS

$ cat /etc/NetworkManager/conf.d/no-dns.conf
[main]
dns=none

启用DNS

$ cat /etc/NetworkManager/conf.d/dns.conf
[main]
dns=default

[global-dns]
searches=example.com

[global-dns-domain-*]

使用已解决的服务

$ cat /usr/lib/NetworkManager/conf.d/resolved.conf 
[main]
dns=systemd-resolved

使用resolvconf

$ cat /usr/lib/NetworkManager/conf.d/resolvconf.conf 
[main]
rc-manager=resolvconf

更新配置

systemctl restart NetworkManager.service

4.网络接口:

配置文件

$ cat /etc/network/interfaces
#nameservers
# or dns-search like so
# dns-search x.y 
dns-nameservers 4.4.4.4 8.8.8.8

更新配置

reboot

5. DHCP客户端:

配置文件

$ cat /etc/dhcp3/dhclient.conf
supersede domain-name-servers <dns_ip_address1>,<dns_ip_address2>;

更新配置

reboot

6. Rdnssd服务:

禁用rdnssd

systemctl disable --now rdnssd.service

7.解决的服务:

停用已解决

systemctl disable --now systemd-resolved.service

8. Netconfig:

配置文件

/etc/sysconfig/network/config

禁用netconfig

cat /etc/sysconfig/network/config
NETCONFIG_DNS_POLICY=""

更新配置

reboot

设置DNS服务器

/etc/resolv.conf配置示例

#Cloudflare
nameserver 1.0.0.1

#Google
#nameserver 8.8.8.8
#nameserver 8.8.4.4

#Cloudflare 
#nameserver 1.1.1.1

#Classic Config
#nameserver 192.168.1.1
#search lan

10

我的问题有点不同,我想覆盖路由器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*>适当的内容替换项目。


这是解决我的问题的答案。
迈克尔(Michael)

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

如果我们没有那个dhcp3文件夹怎么办?我有Xubuntu 17.10,它已经移到/etc/dhcp简单了吗?
PlasmaBinturong

4

也许我缺少了一些东西,但是根据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

如果可以,请重新启动。


3

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


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

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

2

这里的一些答案很好用。然而我却高兴不起来的事实我必须手动完成对配置文件只是设置了“正确的” DNS我已经我收到了DHCPNetworkManager

我做了一些挖掘,发现该/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

1

编辑2016年5月6日

我编写了一个脚本来更新/etc/Network-Manager/system-connections/目录中系统连接的所有设置。用于编辑单个连接的GUI将编辑该目录中的特定文件。该脚本会更新所有文件-仅搜索未使用grep设置dns的用户,并使用awk设置它。

由于访问这些文件需要sudo访问权限,因此请使用运行脚本,sudo然后-重新启动网络管理器

#!/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 ($1=="[ipv4]"){getline; print "method=auto\ndns=208.67.220.
220;\nignore-auto-dns=true"}}' "$file" > .tmpfile && ( cat .tmpfile > "$file") )
done

活动脚本:

在此处输入图片说明

原始帖子 这里的一些用户指出DNS是由dnsmasq。确实是这样。我面临着一个稍小的问题,在这里不管我怎么改变headbody/etc/resolvconf/resolv.conf.d我的电脑不能真正访问由域名实习-只有IP地址的工作。

我所做的是编辑/etc/NetworkManager/NetworkManager.conf文件。最初是说,dns=dnsmasq但我将其更改为:dns=208.67.222.222。尽管这样,nm-tool尽管没有提到208.67.222.222,但我仍然能够使用域名,而不仅仅是IP地址。

这是我的NetworkManager.conf文件现在的样子:

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

[ifupdown]
managed=false

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

更新#1

今天从大学回家后,我发现无法连接到家庭WiFi。我已经阅读了一些内容man NetworkManager.conf,事实证明dns=in [main]实际上是用于插件的一行,因此该行dns=dnsmasq实际上是在向NetworkManager添加dnsmasq插件。

因此我的解决方案仍然有效,只是没有达到我的预期。以下是手册页的节选:

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

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

因此,通过设置,dns=208.67.222.222我可能基本上阻止了NetworkManager使用该插件,否则该插件将使用本地DNS服务器(显然不起作用)。


1

两种方法

方法一

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

$ 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

一切正常。解决了。


0

更改DNS的简单方法:

$ sudo nano /etc/network/interfaces

如果出现问题,请安装nano

$ sudo apt-get install nano -y

然后 ..

  1. 找到这个: dns-nameservers
  2. 如果找不到,只需在其中输入
  3. 我确实是这样的: dns-nameservers 199.85.126.10 199.85.127.10

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


0

在根上:

  1. dns=dnsmasq/etc/NetworkManager/NetworkManager.conf
  2. 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
  3. 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上运行良好。


0

注意:与大多数答案一样,该示例假定使用NetworkManager。然而与大多数其他的答案,它并不承担由于使用resolvconfdhclient或其他任何东西-小心,他们可能接手,但(见更新)。

鉴于这种观点的问题数量是相当惊人的,这8个字的解决方案尚未发布尚未:根据man NetworkManager.conf

dns:[…]无:NetworkManager不会修改resolv.conf。这意味着rc-manager不受管理

因此添加

dns=none

在然后重新启动NetworkManager 的[main]部分中/etc/NetworkManager/NetworkManager.conf,它将不再进行修改/etc/resolv.conf

请注意,设置rc-manager=unmanaged应该等效于dns=none,并且设置rc-manager=symlink/etc/resolv.conf符号链接一起使用可能是一个更好的主意(请阅读上述手册)。

更新:

在NetworkManager停止覆盖后/etc/resolv.conf,我认为启动dhcpcd时已经/etc/resolv.conf被无用的空文件替换了。帮助的手册页,dhcpcd.conf只需添加

nohook resolv.conf

在你的dhcpcd.conf(我的在/etc/dhcpcd.conf)。


0

在我的Linux centos7服务器上,我可以更改此选项的最佳方法是使用

nmtui

此处没有任何答案的命令。您可以在此工具中编辑名称服务器,并且当您从该实用程序更改networkmanager的选项时,它们将/etc/resolv.conf在重新启动后自动应用于它们。在这里您可以找到更多信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.