linux中的DNS缓存
我对DNS缓存感到困惑。我正在编写一个小型的前向代理服务器,希望在Linux系统上使用OS DNS缓存 如果我理解正确,那么在浏览器级别就有DNS缓存。然后是操作系统级别的DNS缓存(Windows有,我不确定Linux发行版是否默认有) 那么,浏览器/代理服务器如何使用OS DNS缓存呢?我正在尝试寻找是否可以依靠Linux进行DNS缓存,而不是在我的代理中自己进行缓存 感谢您在Linux(可能是大多数Unix)上安装了操作系统级DNS缓存,除非已安装并正在运行。即使如此,nscd的DNS缓存功能在默认情况下也会被禁用,至少在Debian中是这样。实际结果是,您的linux系统很可能不执行任何操作系统级别的DNS缓存 您可以在应用程序中实现自己的缓存(正如他们对Squid所做的那样,根据的评论),但我建议不要这样做。这需要大量的工作,很容易出错(nscd搞错了!!!),它可能不像专用DNS缓存那样容易调整,而且它复制了应用程序外部已经存在的功能linux中的DNS缓存,linux,networking,operating-system,dns,Linux,Networking,Operating System,Dns,我对DNS缓存感到困惑。我正在编写一个小型的前向代理服务器,希望在Linux系统上使用OS DNS缓存 如果我理解正确,那么在浏览器级别就有DNS缓存。然后是操作系统级别的DNS缓存(Windows有,我不确定Linux发行版是否默认有) 那么,浏览器/代理服务器如何使用OS DNS缓存呢?我正在尝试寻找是否可以依靠Linux进行DNS缓存,而不是在我的代理中自己进行缓存 感谢您在Linux(可能是大多数Unix)上安装了操作系统级DNS缓存,除非已安装并正在运行。即使如此,nscd的DNS缓存
如果使用您的软件的最终用户需要DNS缓存,因为DNS查询负载大到足以成为问题,或者到外部DNS服务器的RTT长到足以成为问题,则他们可以在与您的应用程序相同的计算机上安装缓存DNS服务器,配置为缓存响应并将未命中转发到常规DNS解析程序。以下是两个其他软件包,可用于Linux上的DNS缓存:
- dnsmasq
- 束缚
如果您的系统正在使用NetworkManager,您可以尝试使用
/etc/NetworkManager/NetworkManager.conf
中的dns=dnsmasq
选项,也可以将连接设置更改为自动(仅限地址),然后使用/etc/NetworkManager/dispatcher.d
目录中的脚本来获取DHCP名称服务器,将其设置为DNS缓存软件中的DNS转发服务器,然后触发配置重新加载。Firefox包含DNS缓存。
要禁用DNS缓存,请执行以下操作:
禁用后,Firefox将使用操作系统提供的DNS缓存。这里提供了一个使用dnsmasq的示例 配置摘要: /etc/default/dnsmasq /etc/resolv.dnsmasq /etc/resolv.conf 然后重新启动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}'
如果您有一个代理,DNS缓存在代理中。例如,Squid有自己的DNS缓存和解析器。嘿,谢谢。还有一个问题。你知道它在windows浏览器中是如何工作的吗。我读到chrome依赖OS dns缓存。那么,这是否意味着应用程序可以访问OS dns缓存?一般来说,dns解析的流程是什么(在缓存上下文中)。如果浏览器维护自己的缓存,它会检查自己的缓存。那么它是询问操作系统还是读取操作系统dns缓存?如果找不到条目,则会进行解析。当操作系统级缓存可用时,所有应用程序都会自动透明地使用它,除非应用程序绕过标准名称查询API(
getaddrinfo()
等)并直接实现自己的DNS查询。这无条件地适用于MacOS X,如果nscd正在运行并处于活动状态(不能代表MS Windows),则适用于Linux。如果应用程序实现了自己的缓存,那么除了可能存在或不存在的任何操作系统级缓存之外,它还应用于其他任何操作系统级缓存(同样,除非应用程序绕过操作系统并直接查询)。@Celada您能为Linux(可能是大多数Unix)上的提供源代码吗,除非安装并运行nscd,否则没有操作系统级DNS缓存。
?我在谷歌上到处搜索,没有运气……你可以在glibc源代码的resolv
子目录中查找,都在那里。我意识到,这不是一个具体的答案,但归根结底,这里没有实现缓存的代码,在任何情况下,你都可以看到,如果你跟踪它,它不会使用任何文件或共享内存段或其他可能存储缓存的位置,它可以通过systemctl enable systemd resolved
启用。现在在systemd
上,它可以通过systemctl enable systemd resolved
启用。
nameserver 127.0.0.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}'
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}'