Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux中的DNS缓存_Linux_Networking_Operating System_Dns - Fatal编程技术网

linux中的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缓存感到困惑。我正在编写一个小型的前向代理服务器,希望在Linux系统上使用OS DNS缓存

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

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

感谢您在Linux(可能是大多数Unix)上安装了操作系统级DNS缓存,除非已安装并正在运行。即使如此,nscd的DNS缓存功能在默认情况下也会被禁用,至少在Debian中是这样。实际结果是,您的linux系统很可能不执行任何操作系统级别的DNS缓存

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


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

以下是两个其他软件包,可用于Linux上的DNS缓存:

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


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

Firefox包含DNS缓存。 要禁用DNS缓存,请执行以下操作:

  • 打开浏览器
  • 在地址栏中键入about:config
  • 在属性列表上单击鼠标右键,然后在关联菜单中选择“新建”>“整数”
  • 输入'network.dnscacheexpntiation'作为首选项名称,输入0作为整数值

  • 禁用后,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}'