如何清除DNS缓存?


191

我刚刚更新了DNS记录(ns1ns2ns3.myhostingcompany.com一个网站,我已经得到了主办),但我仍然得到域名注册停放页面。

我想看看问题是否出在Ubuntu的缓存DNS记录上。有没有办法清除Ubuntu的DNS缓存?(如果存在这样的事情?)


1
另外,检查/etc/hosts。我只是确定我的域的旧IP地址已被缓存,但只是strace ping example.com透露了我/etc/hosts由于缺乏对DNS传播的耐心而忘记删除我之前添加的记录。
ulidtko 2014年

2
这些答案很多都表明默认情况下禁用了缓存,但是它们也引用了旧版本。我的机器(18.04)上它的默认设置为打开,并且下面的各种回答确实向您展示了如何刷新它,只需向下滚动即可
Madivad

Answers:


64

适用于18.04及更高版本

看看Mike Shultz的回答

对于11.10及以下

Ubuntu默认情况下不缓存dns记录,因此除非您已安装dns缓存,否则没有任何要清除的内容。

DNS记录可能由提供商的DNS服务器缓存,因此,如果您要检查所做的DNS更改是否成功,可以使用dig从域托管服务中查询DNS服务器:

dig -t a ns1.myhostingcompany.com @domain_registrar_dns_server

如果您希望Ubuntu开始缓存dns,建议pdnsd与一起安装resolvconfnscd是越野车,不建议这样做。


14
关于nscd为何有错误的任何参考?今天(2012-10)还是越野车吗?
jjmontes 2012年

3
您能更新您的答案吗?ATM听起来像Ubuntu 11.10+确实可以缓存DNS记录。
Martin Konecny 2015年

70

Ubuntu 17.04及更高版本(18.04)

从Ubuntu 17.04起,systemd-resolve用于DNS。您可以像这样刷新systemd的缓存:

sudo systemd-resolve --flush-caches

2
天哪,你愿意嫁给我吗?也解决了我的问题18.04 \ o /
NiKo

5
在16.04 LTS上,这对我不起作用-但是查看它可能还在缓存的另一种方法很有用:sudo systemd-resolve --statistics
Phil

您挽救了一天
Danilo Gomes

1
在18.04上不起作用
LnxSlck

1
对我来说,systemctl restart systemd-resolved.service在18.04上也可以使用。
贾斯汀·桑尼

69

12.04

Ubuntu 12.04使用dnsmasq内置的network-manager,但缓存dns,因此无需刷新它。这是我的示例行syslog来证明这一点:

dnsmasq[2980]: started, version 2.59 cache disabled

也不需要任何配置dnsmasq。如果您使用的是库存设置,则不会缓存dns,为此,您必须按照Ubuntu这篇文章中的描述进行显式设置。

如果要刷新设置,可以禁用然后启用网络或运行

sudo service network-manager restart

重新启动,dnsmasq因为它内置于network-manager;中。检查您syslog的证据。

如果您通过dhcp使用有线连接,network manager将直接从路由器获取设置,并且在登录Ubuntu时将自动建立连接。如果可以通过Web界面访问路由器,则可以检查路由器中的设置是否正确,并在必要时重新启动。如果dns普遍存在问题,则可以尝试使用Google dns代替isp dns,有关更多信息,请参见此处


sudo service network-manager restart与Debian帮了我
大忙

61

请注意,Ubuntu从17.04起使用systemd-resolve,因此该答案不再适用于最新的Ubuntu版本。请参阅“ 在Ubuntu 17.04及更高版本(18.04)中刷新DNS缓存

默认情况下,DNS不缓存在Ubuntu <17.04中(但可能缓存在网络或应用程序中)

要确认一种方式或另一种方式是否dnsmasq缓存,请运行ps ax | grep dnsmasq并查看running命令。这是我的默认13.10计算机的细分:

/ usr / sbin / dnsmasq \
  --no-resolv \
  -保持前景\
  -无主机\
  --bind-interfaces \
  --pid-file = / var / run / NetworkManager / dnsmasq.pid \
  --listen-address = 127.0.1.1 \
  --conf文件= / var / run / NetworkManager / dnsmasq.conf \
  --cache大小= 0 \
  --proxy-dnssec \
  --enable-dbus = org.freedesktop.NetworkManager.dnsmasq \
  --conf-dir = / etc / NetworkManager / dnsmasq.d

/etc/NetworkManager/dnsmasq.d默认为空。因此,这里没有任何替代,只是检查--cache-size=0意味着我们认为意味着什么(而不是无限的缓存),它man dnsmasq显示:

-c, --cache-size=<cachesize>
  Set the size of dnsmasq's cache. The default is 150 names. 
  Setting the cache size to zero disables caching.

因此,虽然dnsmasq 可以缓存DNS,但它并没有缓存。您可以检查您的计算机和各种配置目录,以检查您是否在同一页面上。

如果您看到缓存问题,则可能在以下几个地方之一发生:

  • 从计算机上游。一些路由器缓存。许多公司网络将缓存DNS。许多ISP运行的DNS服务器,将使用它们自己的缓存。防止网络缓存的唯一方法是使用可以手动刷新的缓存。这就是为什么我喜欢OpenDNS。
  • 在客户端应用程序(尤其是浏览器)中。应用程序可以执行各种Ubuntu不会影响的缓存。Firefox如何缓存DNS如何清除Chrome的DNS缓存。其他浏览器(和应用程序)可能具有自己的机制。
  • 我在这里忙个不停,但也许您已经在Ubuntu中安装了非标准DNS服务器,而不是在中打开了缓存dnsmasq。有很多: nscd,DJBDNS dnscache(又名代码TinyDNS) pdnspdnsd,BIND9(及其变种),多我都记不清。这些可能会在/etc/resolv.conf(使用/ etc / resolvconf /`中的config自动生成该文件)中得到证明。下面显示了本地拦截的DNS查询:

    $ nslookup askubuntu.com
    Server:     127.0.1.1
    Address:    127.0.1.1#53
    
    Non-authoritative answer:
    Name:   askubuntu.com
    Address: 198.252.206.24
    

    如果您未达到8.8.8.8(或您希望DNS服务器达到的水平),请检查您要达到的目标。就我而言,我可以看到这只是dnsmasq为了向LXC镜像DNS查询而已,但就您而言,它可能在做不好的高速缓存操作。

    如果已完成列出的缓存,则清除每个缓存的过程会有所不同:

    sudo /etc/init.d/nscd reload    # nscd
    sudo /etc/init.d/named restart  # bind9
    

略有相关的注释,请参见此处启用缓存dnsmasq


1
ps aux | grep的输出与您的输出相同,但是肯定是在我的计算机上缓存DNS。如果不是dnsmasq,那就是别的东西。证明:我在服务器上创建了一个子域,但无法ping通,主机无法访问。我在downforeveryoneorjustme.com上进行了检查,它已经启动,因此传播问题被丢弃了。不是我的路由器,也不是我的ISP,因为我使用Google的DNS 8.8.8.8。然后,我重新启动计算机(而不是路由器),然后可以到达域。我已经尝试了十几次,然后重新启动就没有运气了。重新启动到达主机后,请先尝试。
matteo 2014年

顺便说一句,这不是我第一次经历同样的事情。几个月前,发生了同样的事情,到达域的唯一方法是重新启动计算机,但是后来我有了一个较旧的Ubuntu版本。
matteo 2014年

@matteo浏览器?
奥利(Oli)

不,正如我所说,我是使用ping测试的,不是(仅)浏览器。
matteo 2014年

@matteo我添加了更多内容,但我的想法已用完。只是没有更多人可以缓存DNS了:)
奥利(Oli)

39

对于12.04:

Ubuntu 12.04确实使用dnsmasq缓存DNS(请参阅参考资料man dnsmasq)。使用以下命令清除缓存:

sudo kill -HUP $(pgrep dnsmasq)

谢谢!您是第一个提到12.04默认缓存的人!
Tarka 2012年

6
默认情况下,12.04不缓存dns-重新启动network-manager后检查系统日志;它会显示一个条目,显示dnsmasq从禁用缓存开始。

1
我不知道默认情况下是否启用了缓存,但是这个答案对我有用。
jeyk 2014年

为什么不只是sudo killall -HUP dnsmasq呢?
James Haigh 2014年

1
使用pkill代替killpgrep
Robert Siemer 2014年


11

就个人而言,我将使用OpenDNS并使用其缓存检查功能来强制刷新,以确保所做的更改有效,但您不能保证它们会在48小时内为您的用户刷新。

DNS是一个缓慢的野兽。忍耐会让你神智清醒。


+1我使用OpenDNS以及清除缓存非常有用。
马克戴维森

我对OpenDNS表示怀疑。起初我对此很满意,但是后来我开始变得可疑了。尽管我猜这是否可以在ISP和OpenDNS之间进行选择,但我最好选择OpenDNS,对吗?

2
我会说OpenDNS的危害较小。他们想通过您的流量获利,但仅限于域名点击不佳的情况。
奥利(Oli)

@Oli链接已断开。如果仍然使用它,可以更新链接吗?
莎燕

7

如果您使用的是nscd:

sudo /etc/init.d/nscd restart

值得一提的是,可能不是操作系统对其进行缓存。每个人都喜欢缓存DNS ...一些测试:

检查它是新的还是旧的IP。大多数浏览器也会缓存DNS,因此,如果您还没有重启Chromium或其他任何您可能看不到最新消息的站点,都可以使用。

ping yourdomain.com

将/etc/resolv.conf中的本地名称服务器切换到其他提供商google或level,例如:

nameserver 8.8.8.8
nameserver 4.2.2.2

然后再次ping。

检查以确保您的路由器没有以任何形式缓存DNS。(因路由器/固件/等而异)

最后,耐心等待。DNS可能需要一些时间才能在整个Internet上传播。


2
如果使用NetworkManager和DHCP,则DHCP租约到期时/etc/resolve.conf将被刷新,因此您必须在NetworkManager中设置一个静态ip才能使其工作更长的时间。
LassePoulsen

+1我没有意识到Firefox在缓存DNS,这很有帮助。
wavemode

+1将本地名称服务器切换为Google的工作
原理

5

以上所有答案都忘记了名称解析中的一件事:通常,您请求名称解析的DNS服务器不是拥有记录本身的DNS服务器(权威服务器)。由于每个DNS记录都带有一个“生存时间”值,该值将使解析链中的每个DNS服务器必须在此值提及的秒数内进行缓存。因此,不仅您可以缓存在计算机中,而且名称查找的结果肯定会缓存在不受您控制的服务器上的某个位置。

要立即收到名称记录更改通知的唯一解决方案是在权威名称服务器中创建/更新条目时使用TTL值0。但这意味着对于每个名称解析,服务器都会被命中,通常这是注册服务商不允许的。例如,它们可以提供可供选择的预定义TTL值列表。

我管理着不同的域名,并确保所做的更改能在权威名称服务器中得到很好的应用,我正在使用一种名为的工具dnstracer,该工具可以显示来自DNS根目录的每台服务器上的查找结果。

总之,即使没有适当的DNS缓存解决方案,从更改DNS记录到在PC上看到更改之间仍然会有延迟。该延迟在很大程度上取决于记录的TTL以及PC与权威名称服务器之间的DNS服务器数量。


当然可以,但是如果那是问题所在,则重新启动计算机将无法解决问题。
matteo 2014年

2

对于Ubuntu 14.04,我建议使用以下命令:

sudo service dns-clean

不在默认服务器上安装。仅适用于14.04及以下版本。
RJ

1

我使用以下命令刷新了12.10 Ubuntu盒子上的dns缓存,效果很好。

sudo kill -HUP $(pgrep dnsmasq)

另一个有用的信号是SIGUSR1,它会将一些统计信息转储到syslog或从中注意到man dnsmasq

在--no-daemon模式下或启用了完整日志记录(-q)时,将对高速缓存的内容进行完整的转储。


使用pkill替代killpgrep
罗伯特Siemer

1

在Ubuntu 16.04上,除非执行以下操作,否则无法清除缓存:

sudo service dnsmasq restart


0

我特别推荐在远程Ubuntu服务器中使用openDNS,它可以减轻很多麻烦。

怎么做?好...

cd /etc/dhcp
sudo nano dhclient.conf

在“ request subnet-mask ...”行之前插入此行

supersede domain-name-servers 208.67.222.222,208.67.220.220;

这将以如此快的速度重启界面,甚至不至于失去SSH连接

sudo ifdown eth0 && sudo ifup eth0

检查此内容以查看是否正确安装了全新的openDNS

cat /etc/resolv.conf

那绝对不是这个问题的答案。
blafasel
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.