我遇到了一个问题,在我为驻留在所述主机名上的服务添加记录后,A
通常会通过*.fqdn
开始返回来回答的 DNS 查询。NO ANSWER
SRV
Example:
*.jozefmutis.com. 3600 A 78.46.73.72
_factorio._udp.factorio-modded.jozefmutis.com. 3600 SRV 1 1 34199 primary.jozefmutis.com
现在dig factorio-modded.jozefmutis.com IN A
不再返回答案factorio-modded.jozefmutis.com. 3600 IN A 78.46.73.72
而是返回
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53115
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
,而dig factorio-modded2.jozef mutis.com IN A
(在 SRV 和 A 中不存在)正确返回factorio-modded2.jozefmutis.com. 3600 IN A 78.46.73.72
,被通配符 A 记录覆盖。
当主机名存在 SRV 时,A 失败的原因是什么?我在 RFC 中找不到任何提及的内容,但常识告诉我,SRV 记录中的服务标识符应该可以防止出现 Sinkhole,即使是 UDP 查找也是如此。添加专用的 A 记录会factorio-modded.jozefmutis.com. 3600 A 78.46.73.72
导致为 A 查找返回正确的 IP4,尽管为每个 SRV 设置 A 记录似乎很愚蠢,但 * 应该可以解决这个问题。
答案1
仅当没有更具体的匹配项时,通配符才会匹配。
_factorio._udp.factorio-modded.jozefmutis.com.
name 隐式定义了factorio-modded.jozefmutis.com.
哪个节点成为 ENT 或空非终端,即树中存在的节点(由于下面的其他节点存在)但没有内容。这正是您得到NOERROR
没有内容的原因:这不是错误,名称存在,但没有A
记录。事实上它没有任何类型的记录,因为在该节点级别没有定义任何内容,只有“下面”。
此名称(factorio-modded.jozefmutis.com.
)比通配符更具体,*.jozefmutis.com.
因此对 的任何记录请求factorio-modded.jozefmutis.com.
都将使用此名称上定义的内容来答复(什么都没有,因为它是一个 ENT),而不再使用通配符,因为这里不太具体,所以不予考虑。
查看 Wikipedia 页面,它正好有您的用例。https://en.wikipedia.org/wiki/Wildcard_DNS_record区域有:
*.example. 3600 TXT "this is a wildcard"
*.example. 3600 MX 10 host1.example.
_ssh._tcp.host1.example. 3600 SRV <SRV RDATA>
_ssh._tcp.host2.example. 3600 SRV <SRV RDATA>
并且文本说,如果你查询host1.example
MX
记录,认为通配符会起作用,但事实并非如此:
由于 host1.example. 存在,因此不会匹配任何通配符。相反,您将得到“无错误,但无数据”的答案。通配符 MX 记录不会为存在的域提供 MX 记录。