假设我定义了这两条记录:
*.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.podunk.edu的MX记录,或者A记录,甚至TXT记录。” 基本上,这意味着,如果为*.example.com添加CNAME记录,它将始终优先于任何其他记录,即使这些记录是为特定的子域添加的,它们仍然被忽略。在这种情况下我们无能为力。根据DNS标准,这是DNS应该如何工作的。
这是正确的吗?所引用的RFC中的部分是否涵盖通配符的情况?有人能给我一个权威的答案,并提供一个链接到来源吗?
发布于 2018-10-08 15:43:35
DNS通配符上的Wikipedia页面的例子非常清楚(参见关于host1.example的示例)。
简而言之,通配符只在找不到“直接”全名时才使用。
您可以在https://www.rfc-editor.org/rfc/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. ..如果在某个标签上不可能匹配(即不存在相应的标签),请查看"*“标签是否存在。
查看它是如何首先搜索全名的,如果它是CNAME,则需要附加条件,但是如果您查询TXT,则不是这样。
在您的情况下,如果您专门查询TXT记录,那么无论任何通配符,都应该返回该记录。实际上,TXT on foo.example.com将隐藏任何其他类型,在其上的CNAME请求不应该返回通配符中的值,而应该停止使用NOERROR NODATA,这意味着名称是存在的,而不是该类型。这正是上面维基百科页面中的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,您将得到没有任何CNAME响应的CNAME(通配符由zonefile中的显式名称隐藏,并且得到NOERROR,但该名称上的任何其他记录类型都没有数据,因为这是区域文件中唯一的记录类型),并且通配符适用于任何其他名称,比如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>https://stackoverflow.com/questions/52681167
复制相似问题