在不使用缓存的情况下强制 dig 解析

Dan*_*iel 127 domain-name-system linux dig

我想知道是否有办法查询 DNS 服务器并绕过缓存(使用dig)。我经常更改 DNS 服务器上的区域,我想检查它是否从我的工作站正确解析。但是由于服务器缓存已解决的请求,我经常得到旧的。重新启动或加载服务器并不是一件好事。

Lad*_*ada 172

您可以使用该@语法从特定服务器查找域。如果 DNS 服务器对该域具有权威性,则响应将不会是缓存结果。

dig @ns1.example.com example.com
Run Code Online (Sandbox Code Playgroud)

您可以通过NS查询域的记录来查找权威服务器:

dig example.com NS
Run Code Online (Sandbox Code Playgroud)

  • 如果您正在等待权威服务器更改怎么办? (4认同)
  • 旁注:如果您想查看缓存服务器会得到什么响应,建议使用 `+norecurse`。`+recurse` 在默认情况下会偶尔改变 DNS 服务器完全解释您的问题的方式。 (3认同)
  • 您还可以查看 google dns `dig @8.8.8.8 example.com`。记录在那里出现得更快。 (3认同)
  • 哦好的。是的,我熟悉 @ 语法,但还没有想法改为查询权威服务器。谢谢! (2认同)

tho*_*ter 47

DNS 协议中没有强制名称服务器响应而不使用其缓存的机制。Dig 本身不是名称服务器,它只是一个工具,可使用标准 DNS 请求将您的查询传递到您配置的任何名称服务器。DNS确实包含一种告诉服务器不要使用递归的方法,但这不是您想要的。这仅在您想直接查询权威名称服务器时才有用。

如果您想阻止名称服务器从其缓存中响应,您只能通过更改名称服务器上的配置来做到这一点,但如果您不控制名称服务器,这是不可能的。

但是,您可以使用 dig绕过配置的名称服务器,并执行其自己的递归请求,该请求返回到根服务器。为此,请使用该+trace选项。

dig example.com +trace
Run Code Online (Sandbox Code Playgroud)

实际上,由于这只会查询权威服务器而不是您的本地缓存解析器,因此即使这些服务器使用内部缓存,结果也不会过时。使用的额外好处+trace是您可以看到沿路径发出的所有单独请求。

  • 使用 `+norecurse` 只是告诉名称服务器返回它拥有的任何信息(包括缓存信息,如果有的话),所以这是不正确的。`+trace` 会起作用,因为它会沿着递归链一直到权威服务器。 (12认同)
  • @DavidSpector dig 是 ISC 的 BIND 附带的软件工具 - 虽然它在 Linux 上很常见,但也可以从 Bind 的网站正式获得 Windows 版本。下载当前稳定的 Windows 版本的 Bind 作为 zip 文件,解压并查找 dig.exe - 有关更多说明,请参阅 Google 在 Windows 上使用 dig dns 工具。不要遵循任何说明,包括将文件复制到 /Windows/System32 (2认同)

小智 21

这里需要注意的重要一点是,我注意到很多人在谈论时从未包括过+trace使用+trace意味着 dig 客户端将进行跟踪,而不是在您的配置 (/etc/resolv.conf) 中指定的 DNS 服务器。因此,换句话说,如果您提出要求,您的 dig 客户端将像递归 DNS 服务器一样工作。但是 - 重要的是,您没有缓存。

更多细节 - 因此,如果您已经要求使用mx记录dig -t mx example.com并且您的 /etc/resolv.conf 是 8.8.8.8,那么在区域的 TTL 内执行任何操作都将返回缓存的结果。在某种程度上,如果您正在寻找有关您自己的区域以及 Google 如何看待它的信息,那么您就已经通过 Google 为您的区域的 TTL 毒化了您的 DNS 结果。如果你的 TTL 很短,那还不错,如果你有 1 小时的 TTL,那就有点垃圾了。

因此,虽然+trace将帮助您了解如果您第一次询问 Google 并且它没有缓存条目会看到什么,它可能会给您一个错误的想法,即 Google 会告诉每个人与您的+trace结果相同,这如果您之前询问过并且有很长的 TTL,则不会,因为它将从缓存中提供该服务,直到 TTL 到期 - 然后它将与您+trace透露的相同。

IMO 不能有太多细节。


Mic*_*ole 7

这个 bash 将从它的第一个列出的名称服务器中挖掘 example.com 的 DNS 条目:

dig @$(dig @8.8.8.8 example.com ns +short | head -n1) example.com ANY +noall +answer
Run Code Online (Sandbox Code Playgroud)
  • 内部 dig 查询 google 的 DNS (8.8.8.8) 以获取 example.com 的名称服务器。
  • 外部 dig 查询 example.com 的名字服务器。

这与 .zshrc(可能还有 .bashrc)的别名相同:

# e.g. `checkdns google.com`
checkdns () { dig @$(dig @8.8.8.8 $1 ns +short | head -n1) $1 ANY +noall +answer; ping -c1 $1; }
Run Code Online (Sandbox Code Playgroud)

这是 /. 的输出:

?  checkdns slashdot.org                                                                                                dev
-->Server DNS Query

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @ns1.dnsmadeeasy.com. slashdot.org ANY +noall +answer
; (2 servers found)
;; global options: +cmd
slashdot.org.       21600   IN  SOA ns0.dnsmadeeasy.com. hostmaster.slashdotmedia.com. 2016045603 14400 600 604800 300
slashdot.org.       86400   IN  NS  ns3.dnsmadeeasy.com.
slashdot.org.       86400   IN  NS  ns4.dnsmadeeasy.com.
slashdot.org.       86400   IN  NS  ns0.dnsmadeeasy.com.
slashdot.org.       86400   IN  NS  ns2.dnsmadeeasy.com.
slashdot.org.       86400   IN  NS  ns1.dnsmadeeasy.com.
slashdot.org.       3600    IN  MX  10 mx.sourceforge.net.
slashdot.org.       3600    IN  TXT "google-site-verification=mwj5KfwLNG8eetH4m5w1VEUAzUlHotrNwnprxNQN5Io"
slashdot.org.       3600    IN  TXT "v=spf1 include:servers.mcsv.net ip4:216.34.181.51 ?all"
slashdot.org.       300 IN  A   216.34.181.45
-->Local DNS Query
PING slashdot.org (216.34.181.45) 56(84) bytes of data.
64 bytes from slashdot.org (216.34.181.45): icmp_seq=1 ttl=242 time=33.0 ms

--- slashdot.org ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 33.026/33.026/33.026/0.000 ms
Run Code Online (Sandbox Code Playgroud)

该解决方案复杂到难以记住,但又简单到无法解决问题。 dig不是我的专长 - 欢迎改进:-)