题 强制挖掘解决而不使用缓存


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


70
2018-03-21 17:15






答案:


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

dig @ns1.example.com example.com

您可以通过询问来找到权威服务器 NS 域名记录:

dig example.com NS

100
2018-03-21 17:21



哦好的。是的我熟悉@语法,但没有想过要查询权威服务器。谢谢! - Daniel
附注:如果您正在尝试查看缓存服务器将获得哪些响应, +norecurse 被推荐。 +recurse 默认情况下启用会偶尔更改DNS服务器完全解释您的问题的方式。 - Andrew B
如果您正在等待权威服务器更改怎么办? - guaka
@KasperSouren您是在谈论权威服务器上的NS记录还是父母的胶水记录?你可以找到父母 +trace 但要注意缓存。 Andrew B写了一个很好的解释,说明在等待名称服务器改变时缓存如何欺骗你。 - Ladadadada
你也可以检查谷歌DNS dig @8.8.8.8 example.com。那里的记录显得更快。 - machineaddict


没有标准的,可靠的方法来强制名称服务器在不使用其缓存的情况下进行响应。 Dig本身不是名称服务器,它只是一个工具,使用标准DNS请求将您的查询传递给您配置的任何名称服务器。那里  一种说“不要使用递归”的方法,但这不是你想要的 - 它只会阻止在更广泛的互联网上查找域名。

如果要阻止名称服务器从其缓存中进行响应,则必须通过更改配置来实现 在名称服务器上,但如果你不控制名称服务器,你就不能这样做。

但是,你可以去挖掘 旁路 配置的名称服务器,并执行自己的递归请求,返回到根服务器。为此,请使用 +trace 选项。

dig example.com +trace

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


19
2018-05-31 15:00



运用 +norecurse 只是告诉nameserver返回它拥有的任何信息(包括缓存的信息,如果有的话),这样就不正确了。 +trace 将工作,因为它将跟随递归链一直到权威服务器。 - Raman
请注意,我已修改此答案以删除 +norecurse 建议因为它混淆了这个问题。 - thomasrutter


这里需要注意的重要事项,我注意到很多人在谈论时都没有提到 +trace 那就是用 +trace 表示dig客户端将执行跟踪,而不是配置中指定的DNS服务器(/etc/resolv.conf)。换句话说,如果你问的话,你的dig客户端会像递归DNS服务器那样工作。但是 - 重要的是,你还没有缓存。

更多细节 - 所以如果你已经要求了 mx 记录使用 dig -t mx example.com 并且你的/etc/resolv.conf是8.8.8.8然后在区域的TTL内做任何事情将返回缓存的结果。在某种程度上,如果您正在寻找有关您自己的区域以及Google如何看待它的内容,那么您就会因为Google的区域TTL而使您的DNS结果中毒。如果你有一个短的TTL也不错,如果你有一个1小时有点垃圾。

所以,同时 +trace 如果您第一次询问Google并且它没有缓存条目,它会帮助您了解看到的内容,它可能会让您错误地认为Google将告诉每个人与您的相同内容 +trace 结果是,如果你之前已经问过并且有一个很长的TTL,它将不会,因为它将从缓存服务直到TTL到期 - 那么它将与你的服务相同 +trace透露。

不能有太多细节IMO。


10
2018-05-24 23:10



dig有自己的缓存还是使用OS缓存? - CMCDragonkai
Dig没有缓存。但是,如果它正在使用的上游名称服务器确实如此,那么它将从中受益。 - thomasrutter
dig mydomain.com +trace 只是回报我 resolvd 存根结果来自 127.0.0.53。看到 github.com/systemd/systemd/issues/5897 - James Bowery
使用时 +trace 挖 开始 对于第一次查找(根区域),使用指定的名称服务器(例如,8.8.8.8,如果这是您已配置的)的跟踪,但之后它使用返回的名称服务器进行进一步查询。因此,如果配置的名称服务器不起作用或者没有正确响应根名称服务器的查询,则可能会出现问题(如上面的注释中所述)。 - thomasrutter


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

dig @$(dig @8.8.8.8 example.com ns +short | head -n1) example.com ANY +noall +answer
  • 内部挖掘查询谷歌的DNS(8.8.8.8)以获得example.com的 域名服务器。
  • 外挖掘查询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; }

这是/的输出:

  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

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


1
2018-01-11 17:49