如何清除 DNS 缓存?

Jon*_*ono 240 networking dns

我刚刚为我托管的站点更新了 DNS 记录 ( ns1, ns2, ns3.myhostingcompany.com),但我仍然看到域注册商停放页面。

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

Mik*_*ltz 142

Ubuntu 17.04 及更高版本 (18.04)

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

sudo systemd-resolve --flush-caches
Run Code Online (Sandbox Code Playgroud)

  • 对于 ubuntu 22.04,我们需要使用:`sudoresolvctlflush-caches`。请参阅[systemd-resolve-command-not-found-in-ubuntu-22-04-desktop](https://askubuntu.com/questions/1409726/systemd-resolve-command-not-found-中@codezalot的答案)在-ubuntu-22-04-desktop)。 (18认同)
  • OMG,你愿意嫁给我吗?也用 18.04 解决了我的问题 \o/ (10认同)
  • 对我来说,`systemctl restart systemd-resolved.service` 也适用于 18.04。 (7认同)
  • 这在 16.04 LTS 上对我不起作用 - 但看到它可能缓存的另一种方式很有用:`sudo systemd-resolve --statistics` (6认同)
  • 知道为什么它在 Ubuntu 19.10 上显示此错误吗?`无法刷新缓存:未找到单元 dbus-org.freedesktop.resolve1.service。` (4认同)
  • 就我而言,在 18.04 上,systemd 解析的服务重启解决了我的 dns 缓存问题。感谢@JustinSane 的评论! (2认同)
  • 在 Ubuntu 20.04.3 LTS 上不适用于我。我收到 ping 后: api.sin.local:名称解析暂时失败。我会重新启动。感觉就像在过去的千年里运行w95。 (2认同)
  • 这在 Ubuntu 20 上肯定不起作用。您会收到此错误消息:“sd_bus_open_system:没有这样的文件或目录” (2认同)

Li *_* Lo 79

对于 18.04 及更高版本

看看迈克舒尔茨的回答

对于 11.10 及以下

默认情况下,Ubuntu 不缓存 dns 记录,因此除非您安装了 dns 缓存,否则无需清除任何内容。

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

dig -t a ns1.myhostingcompany.com @domain_registrar_dns_server

如果您希望 Ubuntu 开始缓存 dns,我建议pdnsdresolvconf. nscd是越野车,不可取。

  • 关于为什么 nscd 有问题的任何参考?今天(2012-10)仍然有问题吗? (14认同)
  • 你能更新你的答案吗 - ATM 听起来像 Ubuntu 11.10+ 版本缓存 DNS 记录。 (4认同)

小智 70

12.04

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

dnsmasq[2980]: started, version 2.59 cache disabled
Run Code Online (Sandbox Code Playgroud)

也不需要任何配置dnsmasq。如果您使用库存设置运行,则不会缓存 dns,至于这样做,您必须按照这篇Ubuntu 文章所述进行显式设置。

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

sudo service network-manager restart
Run Code Online (Sandbox Code Playgroud)

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

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


Oli*_*Oli 63

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

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

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

/usr/sbin/dnsmasq \
  --no-resolve \
  --保持在前台\
  --no-hosts \
  --绑定接口\
  --pid-file=/var/run/NetworkManager/dnsmasq.pid \
  --listen-address=127.0.1.1 \
  --conf-file=/var/run/NetworkManager/dnsmasq.conf \
  --cache-size=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.
Run Code Online (Sandbox Code Playgroud)

因此,虽然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/` 中的配置来自动生成该文件)。下面显示了一个本地拦截的 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
    
    Run Code Online (Sandbox Code Playgroud)

    如果您没有达到 8.8.8.8(或任何您期望的 DNS 服务器),请检查您正在点击的内容。在我的情况下,我可以看到这只是dnsmasq设置为将 DNS 查询镜像回 LXC,但在您的情况下,它可能会做坏事。

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

    sudo /etc/init.d/nscd reload    # nscd
    sudo /etc/init.d/named restart  # bind9
    
    Run Code Online (Sandbox Code Playgroud)

在稍微相关的注释中,请参阅此内容以启用dnsmasq.


小智 40

对于 12.04:

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

sudo kill -HUP $(pgrep dnsmasq)
Run Code Online (Sandbox Code Playgroud)

  • 12.04 默认不缓存 dns - 重新启动网络管理器后检查您的系统日志;它将有一个条目显示 dnsmasq 以禁用缓存开始。 (6认同)

the*_*k12 17

对于 ubuntu 22.04:

sudo resolvectl flush-caches


Mar*_*son 15

sudo /etc/init.d/nscd restart

http://www.ubuntugeek.com/howto-clearflush-dns-cache-in-ubuntu.html

另外作为说明,您可以检查并查看您的 DNS 更改是否已使用 dig 传播并查找默认 DNS 服务器以外的其他人。在这种情况下,谷歌 DNS。

dig @8.8.8.8 example.com

  • 值得注意的是,默认情况下未安装 nscd。 (12认同)

Oli*_*Oli 11

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

DNS是一个缓慢的野兽。耐心会让你保持清醒。

  • 我会说 OpenDNS 是较小的邪恶。他们想从您的流量中获利,但仅限于糟糕的域名点击率。 (2认同)

小智 7

如果您使用的是 nscd:

sudo /etc/init.d/nscd restart
Run Code Online (Sandbox Code Playgroud)

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

检查是新IP还是旧IP。大多数浏览器也会缓存 DNS,所以如果您没有重新启动 Chromium 或其他任何东西,您可能看不到最新的。

ping yourdomain.com
Run Code Online (Sandbox Code Playgroud)

将 /etc/resolv.conf 中的本地名称服务器切换到另一个提供程序 google 或 level ,示例:

nameserver 8.8.8.8
nameserver 4.2.2.2
Run Code Online (Sandbox Code Playgroud)

然后再次ping。

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

最后,耐心。DNS 在整个互联网上传播可能需要一些时间。

  • 如果使用 NetworkManager 并且 DHCP /etc/resolve.conf 将在 DHCP 租约到期时刷新,因此您必须在 NetworkManager 中设置一个静态 ip 以使其在更长的时间内工作。 (2认同)

Ben*_*oit 5

上面的所有答案都忘记了名称解析中的一件重要事情:通常您请求名称解析的 DNS 服务器不是自己保存记录的服务器(权威服务器)。由于每个 DNS 记录都带有一个生存时间值,这将迫使解析链中的每个 DNS 服务器在该值提到的秒数内进行缓存。因此,您不仅可以在您的机器中缓存,而且名称查找的结果肯定会缓存在您无法控制的服务器上的某个地方。

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

我管理不同的域名并确保更改在权威名称服务器中得到很好的应用,我使用了一个名为的工具dnstracer,该工具可以从 DNS 根显示每个服务器上的查找结果。

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


Pab*_*oRQ 5

Ping 使用另一个 DNS

Ubuntu 20.10似乎有两 (2) 个 DNS 缓存:

  1. systemd-resolve
  2. nscd

使用以下命令刷新 DNS 缓存对我来说不起作用:

sudo systemd-resolve --flush-caches
Run Code Online (Sandbox Code Playgroud)

禁用/启用网络和 wifi 连接,或重新启动系统后,问题仍然存在:

  • nslookupdig和其他命令有效
  • ping不起作用

所有系统配置都正常,但有些地址像是固定在某个地方。

在不同的网站上搜索后,我发现了问题:还有另一个 DNS 缓存,并且ping似乎正在使用它。

要清除第二个 DNS 缓存,只需运行:

sudo nscd -i hosts
Run Code Online (Sandbox Code Playgroud)

刷新两个 DNS 缓存

您可以全部完成,只需复制并粘贴到终端上即可:

sudo systemd-resolve --flush-caches
sudo nscd -i hosts
Run Code Online (Sandbox Code Playgroud)

检查 DNS 已清除

不确定这是否有效?看看吧:

sudo systemd-resolve --statistics
sudo nscd -g
Run Code Online (Sandbox Code Playgroud)