DNS,A Record通配符是否比更特定的CNAME优先?


18

我们设置了一个通配符来处理“ example.com”的所有子域

记录:*。example.com指向10.10.10.10

我们有一个更具体的A记录来处理特殊的子域(这很好):

记录:staging.example.com得分10.10.10.9

我们遇到的问题是我们正在将登台迁移到新的托管环境中,并被指示使用CNAME:

CNAME:new-staging.example.com指向proxy.heroku.com

我们认为这会起作用。但是,new-staging.example.com解析为顶级通配符10.10.10.10,并不指向proxy.heroku.com。

我想念什么?这不可能吗?还是这是不好的做法?谢谢,


1
您是通过ISP的Web界面进行实时设置还是运行例如BIND或djbdns?
乔纳森·罗斯

当您说“解析为顶级通配符”时,您如何执行此解决方案?dig -t ANY new-staging.example.com
nickgrim 2011年

@Jonathan,我们当前正在使用Slicehost来管理DNS,因此它是通过Web界面进行的。
zdennis 2011年

@diggrim在运行dig -t ANY new-staging.example.com时得到:new-staging.example.com。82880 IN CNAME proxy.heroku.com.example.com。proxy.heroku.com.example.com。86400 A 10.10.10.10
zdennis 2011年

Answers:


15

答案通常是“否”-更具体的记录应该获胜,因此这应该按照您的描述/预期进行。我的猜测是您在某个地方缓存了通配符A记录,并且需要等待该缓存过期。

使用BIND 9.6.2-P2 / FreeBSD 8.1进行的快速测试:
包含记录的区域:

example.net.                IN      A      127.0.0.2
*.test.example.net.         IN      A      127.0.0.1
specific.test.example.net.  IN      CNAME  example.net.

解决如下:

% dig specific.test.example.net

; <<>> DiG 9.6.2-P2 <<>> specific.test.example.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17222
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;specific.test.example.net. IN  A

;; ANSWER SECTION:
specific.test.example.net. 3600 IN  CNAME   example.net.
example.net.               3600 IN  A   127.0.0.2

;; AUTHORITY SECTION:
example.net.        3600    IN  NS  ns1.example.net.

;; ADDITIONAL SECTION:
ns1.example.net.    3600    IN  A   127.0.0.1

(返回CNAME)

% dig nonspecific.test.example.net

; <<>> DiG 9.6.2-P2 <<>> nonspecific.test.example.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26980
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;nonspecific.test.example.net.  IN  A

;; ANSWER SECTION:
nonspecific.test.example.net. 3600 IN   A   127.0.0.1

;; AUTHORITY SECTION:
example.net.        3600    IN  NS  ns1.example.net.


;; ADDITIONAL SECTION:
ns1.example.net.    3600    IN  A   127.0.0.1

(返回通配符A记录)


这是否在DNS标准中,或者是特定于实现的?
Bigbio2002 '03 /

@ Bigbio2002我认为它是标准的一部分-RFC 4592是值得关注的地方-我的大脑从整天编写文档到饱读RFC都有些麻烦,所以,如果我错了,请给我拍一下相关章节:-)
voretaq7 2012年

7

根据您对这个问题的评论:

当运行dig -t ANY new-staging.example.com时,我们得到:new-staging.example.com。82880 IN CNAME proxy.heroku.com.example.com。proxy.heroku.com.example.com。86400在10.10.10.10中

...您配置了错误的DNS。您需要将CNAME的目标设置为proxy.heroku.com.-最后期限很重要!没有它,您的DNS服务器将假定您引用的是您所在example.com区域内的主机proxy.heroku.com.example.com--并且被通配符记录捕获。


我们已将CNAME记录设置为“ proxy.heroku.com”。当我们直接挖掘slicehost名称服务器(挖掘@ ns1.slicehost.com)时,提供的唯一答案指向proxy.heroku.com的CNAME。当我们在未指定的情况下进行挖掘时,它会给我们两个答案(我在上面发布的答案反映在这里)。这使我认为@ voretaq7可能正确地认为存在缓存问题?这是否与我在挖掘时看到的一致?
zdennis 2011年

是的,这似乎意味着您上游的DNS缓存已经缓存了错误的(非周期)版本。您必须等待TTL过期和/或同时设置一个其他名称(new-new-staging?)。
nickgrim 2011年

缺失的点也是让我震惊的地方。
loevborg

0

我偶然发现了这篇文章,研究了如何完成共享的Plesk Linux服务器。在他们的示例中,他们提到了DNS / vhost.conf组合解决方案,在其中您必须同时添加到vhost.conf和更新DNS。

Quote:“它必须是子域列表中的最后一个,按字母顺序排列,因此,其名称以“ zz”开头。http: //kb.parallels.com/2239

我的猜测是,这与“常规” DNS理论不同,后者会返回更具体的记录。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.