74

我对 DNS 缓存感到困惑。我正在编写一个小型转发代理服务器,并希望在 Linux 系统上使用 OS DNS 缓存。

如果我理解正确,那么在浏览器级别有 DNS 缓存。然后是操作系统级别的 DNS 缓存(Windows 有它。我不确定 Linux 发行版是否默认有它)。

那么,浏览器/代理服务器如何使用操作系统 DNS 缓存?我正在尝试查找是否可以依靠 Linux 进行 DNS 缓存,而不是在我的代理中自己进行。

谢谢

4

4 回答 4

101

在 Linux(可能还有大多数 Unix)上,除非安装并运行了nscd ,否则没有操作系统级别的 DNS 缓存。即便如此,至少在 Debian 中默认禁用 nscd 的 DNS 缓存功能,因为它已损坏。实际的结果是你的 linux 系统很可能不做任何操作系统级别的 DNS 缓存。

您可以在您的应用程序中实现自己的缓存(就像他们为 Squid 所做的那样,根据diegows的评论),但我建议不要这样做。工作量很大,很容易出错(nscd 搞错了!!!),它可能不像专用 DNS 缓存那样容易调整,而且它复制了应用程序之外已经存在的功能。

如果使用您的软件的最终用户需要 DNS 缓存,因为 DNS 查询负载大到足以成为问题,或者到外部 DNS 服务器的 RTT 足够长而成为问题,他们可以安装缓存 DNS 服务器,例如Unbound与您的应用程序在同一台机器上,配置为缓存响应并将未命中转发到常规 DNS 解析器。

于 2012-06-13T18:35:53.510 回答
24

以下是另外两个可用于 Linux 上的 DNS 缓存的软件包:

  • dnsmasq
  • 绑定

为 DNS 转发和缓存配置软件后,然后在 /etc/resolv.conf 中将系统的 DNS 解析器设置为 127.0.0.1。

如果您的系统正在使用 NetworkManager,您可以尝试使用dns=dnsmasq选项,/etc/NetworkManager/NetworkManager.conf或者您可以将连接设置更改为自动(仅地址),然后使用/etc/NetworkManager/dispatcher.d目录中的脚本来获取 DHCP 名称服务器,将其设置为您的 DNS 转发服务器DNS缓存软件然后触发配置重新加载。

于 2012-06-13T21:27:20.020 回答
15

您在这里有一个使用 dnsmasq在 Debian 中进行 DNS 缓存的示例。

配置总结:

/etc/default/dnsmasq

# Ensure you add this line
DNSMASQ_OPTS="-r /etc/resolv.dnsmasq"

/etc/resolv.dnsmasq

# Your preferred servers
nameserver 1.1.1.1
nameserver 8.8.8.8
nameserver 2001:4860:4860::8888

/etc/resolv.conf

nameserver 127.0.0.1

然后只需重新启动 dnsmasq。

使用 DNS 1.1.1.1 的基准测试:

for i in {1..100}; do time dig slashdot.org @1.1.1.1; done 2>&1 | grep ^real | sed -e s/.*m// | awk '{sum += $1} END {print sum / NR}'

使用本地缓存 DNS 进行基准测试:

for i in {1..100}; do time dig slashdot.org; done 2>&1 | grep ^real | sed -e s/.*m// | awk '{sum += $1} END {print sum / NR}'
于 2014-09-08T22:51:51.670 回答
2

Firefox 包含一个 dns 缓存。要禁用 DNS 缓存:

  1. 打开浏览器
  2. 在地址栏中输入 about:config
  3. 右键单击属性列表并在上下文菜单中选择新建 > 整数
  4. 输入“network.dnsCacheExpiration”作为首选项名称,输入 0 作为整数值

禁用时,Firefox 将使用操作系统提供的 DNS 缓存。

于 2012-12-23T19:44:43.740 回答