AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 800071
Accepted
Lawrence Wagerfield
Lawrence Wagerfield
Asked: 2016-08-31 12:37:46 +0800 CST2016-08-31 12:37:46 +0800 CST 2016-08-31 12:37:46 +0800 CST

如何使 DIG 尊重 TTL/使用本地操作系统缓存?

  • 772

当我运行时,即使在随后dig example.com的运行中,响应也会返回。SERVER: 192.168.0.1这意味着 DIG 总是通过网络调用来解析 DNS 记录。

我(相当无知)假设我的操作系统将根据其 TTL 缓存 DNS 记录,并且 DIG 将使用该缓存。

DIG 是否默认忽略 TTL/不使用缓存?如果是这样,我怎样才能让 DIG 使用缓存并尊重 TTL?

背景/XY问题:

我想要一种方法来快速解析我正在编写的 nginx 脚本的 DNS TXT 记录。该脚本将根据这些 TXT 记录的内容路由请求,因此我想要使用哪种方法来尊重 TTL 并在适当的情况下使用本地缓存的记录。

domain-name-system networking nginx linux-networking dig
  • 2 2 个回答
  • 736 Views

2 个回答

  • Voted
  1. Best Answer
    HBruijn
    2016-08-31T12:59:18+08:002016-08-31T12:59:18+08:00

    dig (域信息探索器)如手册所述,是一种用于询问 DNS 名称服务器的灵活工具,它​​不会查询或使用您的本地 DNS 缓存(和/或hosts文件),而是直接查询您指向的名称服务器。默认情况下,这将是来自/etc/resolv.conf.

    要从命令行使用系统 DNS 缓存,getent hosts [ip-address | hostname]或者在脚本/代码中使用man 3 gethostbyname系统调用的本机版本。

    A AAAA诚然,这对您以外的任何其他事情或PTR记录没有帮助。


    在dig输出中,SERVER 标签是名称服务器 dig使用的 IP 地址,它永远不会有 TTL...

    dig ANY www.google.com
    
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6 <<>> www.google.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27695
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 4
    
    ;; QUESTION SECTION:
    ;www.google.com.                IN      A
    
    ;; ANSWER SECTION:
    www.google.com.     173     IN      A       216.58.212.132
    
    
    ;; AUTHORITY SECTION:
    google.com.         146915  IN      NS      ns2.google.com.
    google.com.         146915  IN      NS      ns3.google.com.
    google.com.         146915  IN      NS      ns1.google.com.
    google.com.         146915  IN      NS      ns4.google.com.
    
    ;; ADDITIONAL SECTION:
    ns2.google.com.     145115  IN      A       216.239.34.10
    ns1.google.com.     145115  IN      A       216.239.32.10
    ns3.google.com.     145115  IN      A       216.239.36.10
    ns4.google.com.     145115  IN      A       216.239.38.10
    
    ;; Query time: 0 msec
    ;; SERVER: 127.0.0.1#53(127.0.0.1)    <========== My Name SERVER is localhost
    ;; WHEN: Tue Aug 30 22:51:26 2016
    ;; MSG SIZE  rcvd: 184
    

    我在本地运行自己的缓存 DNS 服务器,而不是使用主要用于 spamassassin 的 ISP 或 Google 的公共解析器(8.8.8.8),它具有本地优势,但缓存不会被其他用户预先播种/填充.

    • 4
  2. Andrew B
    2016-08-31T15:02:14+08:002016-08-31T15:02:14+08:00

    这实际上是一个操作系统解析器问题,但您没有指定操作系统。既然dig提到了,我将假设我们在这里使用某种 UNIX 风格。

    基于 UNIX 的操作系统不在内核本身内实现 DNS 缓存。在我们了解它的实际实施方式之前,需要总结一些主题。

    NSS

    对解析器库的调用通常使用名称服务开关 (NSS) 来实现它们的查找,这是一个用于指定要使用的数据源和查找顺序的模块化系统。您可以在 中找到这些模块堆栈的列表/etc/nsswitch.conf。作为参考,我们在这里关注的是hosts.

    除非您真的知道自己在做什么,否则不建议使用该hosts条目。/etc/nsswitch.conf重新排序这些模块可能会导致在/etc/hosts文件之前咨询 DNS 等时髦的东西!

    nscd

    在咨询模块堆栈之前,NSS 检查是否存在正在运行的nscd套接字并尝试查询它。如果nscd配置为维护相关 NSS 数据库的缓存,则可能nscd会返回缓存的条目而无需咨询 NSS 模块。我知道的大多数 Linux 发行版默认不启用数据库缓存,必须自定义。hosts/etc/nscd.conf

    也就是说,应该注意的是,许多管理员认为“stock”nscd守护进程是不可靠的,至少在 Linux 下是这样。那里至少有一种替代实现。你的旅费可能会改变。

    把它们放在一起

    了解上述内容后,hosts 数据库的查找顺序按以下顺序工作:

    • nscd(如果正在运行,它的套接字存在,并且启用了主机缓存)
    • NSS 模块,按列出的顺序/etc/nsswitch.conf
    • 如果在 NSS 模块中找不到,则它不存在。

    这将我们带到dig了这个等式的位置。您几乎可以参考 HBrujin 的整个答案(dig不使用 NSS,仅通过 TCP/IP 进行对话),但问题是根本没有 NSS 缓存,除非 1)nscd正在运行,并且 2)它被配置为缓存hosts数据库。

    tl;博士

    让 DNS 缓存在 NSS 中很好地发挥作用的复杂性通常是大多数管理员使用运行自己的递归 DNS 服务器的“更简单”的解决方案的原因。你不需要知道关于 NSS 的任何事情。只需指向/etc/resolv.conf您闪亮的新 DNS 缓存,让它向您隐藏 NSS 的邪恶。(至少在您需要了解 LDAP 集成的工作原理之前)

    • 2

相关问题

  • 10 Gb 网络:在光纤和双绞线之间做出决定

  • 如何在 Windows Server PPTP VPN 中自动为客户端分配路由?

  • 为什么我的电脑休眠时 VPN 连接会中断?[关闭]

  • 有什么软件可以模拟局域网?

  • 带宽利用工具?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve