说我定义了这两个记录:
*.example.com CNAME <some name>
foo.example.com TXT <some text>
如果我这样运行DNS查询,将会发生什么?
dig TXT foo.example.com
我希望得到答案部分中上面定义的TXT
记录,因为它的定义更加明确。但是,我从DNS提供商那里得到的是为通配符定义的CNAME
。
我向他们提出了这个问题,他们说他们正在遵循正确的行为。这是他们给我的解释:
请参阅RFC1912中有关“常见DNS错误”的第2.4节。 http://www.rfc-editor.org/rfc/rfc1912.txt“不允许CNAME记录与任何其他数据共存。换句话说,如果suzy.podunk.xx是sue.podunk.xx的别名,那么您也不能拥有suzy的MX记录.podunk.edu,或者A记录,甚至TXT记录。”
从根本上讲,这意味着,如果为* .example.com添加CNAME记录,则它将始终优先于任何其他记录,即使为特定的子域添加了这些记录,它们仍然会被忽略。在这种情况下,我们无能为力。根据DNS标准,这应该是DNS的工作方式。
这是正确的吗?所引用的RFC中的部分是否涵盖通配符的情况?谁能给我一个权威的答案,并提供源链接?
答案 0 :(得分:1)
Wikipedia page on DNS wildcard通过示例非常清楚(请参阅有关host1.example
的示例)。
简而言之,仅当找不到“直接”全名时才使用通配符。
您可以在https://tools.ietf.org/html/rfc1034的第4.3.2节中找到所有解释,尤其是第3.a点和第3.c点:
a. If the whole of QNAME is matched, we have found the node. If the data at the node is a CNAME, and QTYPE doesn't match CNAME, copy the CNAME RR into the answer section of the response, change QNAME to the canonical name in the CNAME RR, and go back to step 1. Otherwise, copy all RRs which match QTYPE into the answer section and go to step 6.
[..]
c. If at some label, a match is impossible (i.e., the corresponding label does not exist), look to see if a the "*" label exists.
查看具体如何首先搜索全名,如果它是CNAME,则带有附加条件,但是如果您查询TXT,则不是这种情况。
在您的情况下,如果您专门查询TXT记录,则应返回该值,而不考虑任何通配符。
实际上,TXT
上的foo.example.com
会隐藏任何其他类型,即对其上的CNAME
请求,不应返回通配符中的值,而应以NOERROR NODATA
停止,这意味着名称存在,但不适用于此类型。
正是上述Wikipedia页面中的host1.example
情况。
实际上很容易尝试。 使用此区域文件:
$TTL 1
@ IN SOA localhost. root.localhost. (1 604800 86400 419200 604800)
IN NS a.example.org.
IN NS b.example.org.
IN NS c.example.org.
*.example.com. IN CNAME foobar.example.net.
foobar.example.com. IN TXT "I am here."
(开始只是绑定真正加载区域的样板)
如果您进行dig @127.0.0.1 foobar.example.com TXT
,您会得到预期的结果:
;; ANSWER SECTION:
foobar.example.com. 1 IN TXT "I am here."
如果您查询相同名称的任何其他记录类型,包括CNAME,您将得到NOERROR
而没有任何CNAME
的答复(通配符被zonefile中的显式名称隐藏,并且您会得到NOERROR但此名称上没有TXT
以外的任何其他记录类型的数据,因为这是区域文件中的唯一记录类型),而通配符适用于任何其他名称,例如dig @127.0.0.1 not-foobar.example.com TXT
给出:
;; ANSWER SECTION:
not-foobar.example.com. 1 IN CNAME foobar.example.net.
给出的解释不正确,因此不适用于您的用例。引用仅适用于这种(无效)配置:
*.example.com. CNAME <some name>
*.example.com. TXT <some text>
但这与通配符无关,以下配置也会出现相同的问题,所有兼容的名称服务器都会拒绝该配置:
foobar.example.com. CNAME <some name>
foobar.example.com. TXT <some text>