在Windows上,一直都提供了系统级的dns缓存能力(
ipconfig /displaydns
),一些应用程序比如浏览器也会实现应用级别的dns cache能力。但是在Linux上,没有一致的系统级dns cache的实现,很多发行版默认也没有提供dns cache的能力。
在一些性能测试的场景,可能会引起一些干扰。本文扼要梳理一下Linux上的dns cache情况。
1. 早期阶段:无系统级DNS缓存
在Linux的早期版本中(例如20世纪90年代的发行版),并没有内置的系统级DNS缓存机制。应用程序(如浏览器或邮件客户端)通常直接通过gethostbyname()等libc函数调用解析DNS请求。这些请求会通过/etc/resolv.conf文件中指定的DNS服务器进行解析,每次查询都会直接发送到外部DNS服务器。这种方式效率较低,尤其是在网络连接较慢或DNS服务器响应延迟较高的情况下。
2. NSCD的引入(Name Service Cache Daemon)
随着Linux系统的发展,为了提升DNS解析效率,nscd(Name Service Cache Daemon)在1990年代后期被引入,作为glibc的一部分。它是一个可选的守护进程,用于缓存DNS解析结果、用户信息(如/etc/passwd)和组信息(如/etc/group)。
-
工作方式:nscd运行在系统后台,拦截应用程序的DNS请求,并将解析结果存储在内存中。
-
优点:减少了对外部DNS服务器的直接查询,提升了性能。
-
局限性:配置复杂,稳定性不佳(有时会导致缓存失效或进程崩溃),而且需要手动启用和管理。因此,许多发行版选择不使用它。
3. Bind作为本地缓存(2000年代初)
在服务器场景中,系统管理员开始使用BIND(Berkeley Internet Name Domain)作为本地DNS缓存服务器。BIND是一个功能强大的DNS服务器软件,可以配置为递归解析器并缓存DNS查询结果。
-
应用场景:通常用于企业或高负载环境,而不是普通桌面用户。
-
特点:支持复杂的DNS配置,但对于普通Linux用户来说过于重量级,部署和维护成本较高。
4. dnsmasq的兴起(2000年代中期)
dnsmasq是一个轻量级的DNS转发和缓存工具,逐渐成为Linux系统中流行的解决方案,尤其是在家庭网络和小型服务器中。
-
特点:
-
简单易用,配置开箱即用。
-
支持DNS缓存、DHCP服务和本地主机名解析。
-
默认缓存DNS查询结果,减少外部请求。
-
-
普及:许多Linux发行版(如Ubuntu)开始在网络管理工具(如NetworkManager)中集成dnsmasq,将其作为默认的本地DNS缓存方案。
-
局限性:功能相对简单,不适合需要复杂DNS策略的场景。
5. Systemd-resolved的引入(2015年代之后)
随着systemd在Linux生态中的广泛采用,systemd-resolved在2015年左右被引入,作为一个现代化的DNS解析和缓存解决方案。
它是systemd套件的一部分,旨在取代传统的解析机制。
-
工作方式:
-
通过127.0.0.53提供本地DNS stub监听服务。
-
支持DNS缓存、DNSSEC验证(可选)和多协议解析(包括mDNS和LLMNR)。
-
与/etc/resolv.conf动态集成,自动管理DNS配置。
-
-
优点:
-
系统级集成度高,默认启用在许多现代发行版(如Ubuntu 16.04+、Fedora等)。
-
支持更安全的DNS协议(如DNS over TLS)。
-
-
争议:部分用户认为systemd-resolved过于复杂或与现有工具冲突,导致很多发行版(如Debian和RHEL等)默认不启用。
6. 现代发展:DNS安全与隐私(2020年代)
近年来,随着对网络隐私和安全的关注增加,Linux中的DNS缓存机制进一步演进:
-
DNS over HTTPS (DoH) 和 DNS over TLS (DoT):Unbound和systemd-resolved开始支持加密DNS协议,以防止DNS劫持和监听。
-
Unbound开始流行:Unbound是一个专注于递归解析和缓存的轻量级DNS服务器,支持DNSSEC和DoT,逐渐成为许多高级用户的首选。