linux中的DNS缓存

age*_*ith 52 linux dns networking operating-system

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

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

那么,browser/proxy_server如何使用OS DNS缓存?我试图找到我是否可以依靠Linux进行DNS缓存,而不是在我的代理中自己做.

谢谢

Cel*_*ada 77

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

你可以在你的应用程序中实现自己的缓存(就像他们为鱿鱼所做的那样,根据diegows的评论),但我建议反对它.这是很多工作,很容易弄错(nscd错了!!!),它可能不像专用的DNS缓存那么容易调整,它复制了应用程序之外已经存在的功能.

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

  • 您可以在glibc源代码的`resolv`子目录中查看,它就在那里.我意识到,这不是一个具体的答案,但它归结为这样一个事实,那里没有实现缓存的代码,无论如何你可以看到你是否跟踪它没有使用任何文件或共享内存段或可能存储此缓存的其他类型的位置. (7认同)
  • 当操作系统级缓存可用时,所有应用程序都会自动且透明地使用它,除非应用程序绕过标准名称查询API(`getaddrinfo()`等)并直接实现自己的DNS查询.这无条件适用于MacOS X,并且如果有机会nscd正在运行并且处于活动状态(不能代表MS Windows),它适用于Linux.如果应用程序实现了自己的缓存,那么除了可能存在或不存在的任何操作系统级缓存之外,它还会应用(同样,除非应用程序绕过操作系统并直接查询). (5认同)
  • @Celada你能为`在Linux(可能是大多数Unix)上提供源代码,除非安装并运行nscd,否则没有操作系统级别的DNS缓存.我google了一下,没有运气...... (3认同)
  • **注意**:现在在`systemd`上有[一种缓存DNS的服务](https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html),它可以启用`systemctl enable systemd-resolved`. (2认同)

Zan*_*ynx 22

以下是另外两个可用于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缓存软件然后触发配置重新加载.

  • 现在,在`systemd` [还有一个](https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html)上,它可以通过`systemctl enable systemd-resolved`启用. (2认同)

Tk4*_*421 10

您可以使用dnsmasq 在Debian中获得DNS缓存的示例.

配置摘要:

在/ etc /默认/的dnsmasq

# Ensure you add this line
DNSMASQ_OPTS="-r /etc/resolv.dnsmasq"
Run Code Online (Sandbox Code Playgroud)

/etc/resolv.dnsmasq

# Your preferred servers
nameserver 1.1.1.1
nameserver 8.8.8.8
nameserver 2001:4860:4860::8888
Run Code Online (Sandbox Code Playgroud)

在/etc/resolv.conf

nameserver 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

然后重新启动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}'
Run Code Online (Sandbox Code Playgroud)

使用本地缓存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}'
Run Code Online (Sandbox Code Playgroud)


Oli*_*sne 5

DNS 缓存现在由systemd-resolved在操作系统级别实现:

https://fedoraproject.org/wiki/Changes/systemd-resolved#Caching