在配置 BIND DNS 区域时,我经常想知道为什么存在@
并*
为区域名称指定别名。这两者之间有什么区别吗?
答案1
@
被翻译为它所引用的区域的域名。这是在区域文件中用于 example.com 时,@
将等于“example.com”。另一方面,*
通配符表示任何内容。
下面是如何在区域文件中使用这两个符号的示例:
; SOA Record
EXAMPLE.NET. 3600 IN SOA ns1.example.com. dns.example.net. (
2010031000
28800
7200
604800
86400
)
; A Records
@ 3600 IN A 192.168.1.212
@ 3600 IN A 192.168.1.214
; CNAME Records
www 3600 IN CNAME @
* 3600 IN CNAME @
; NS Records
@ 3600 IN NS ns1.example.com
@ 3600 IN NS ns2.example.com
在此示例中,我使用 EXAMPLE.COM 的 DNS 服务器为 EXAMPLE.NET 定义区域。我有 2 个 IP 地址,我将它们分配给域的 A 记录,因此 EXAMPLE.NET 指向 192.168.1.212 和 192.168.1.214。然后我定义了几个 CNAME 记录,www 和 magic *
,它们都指向@
或按照它的解释EXAMPLE.NET
。还有使用@
符号的 NS 记录,而不必输入EXAMPLE.NET
。
因此您实际上可以将该区域文件转换为:
; SOA Record
EXAMPLE.NET. 3600 IN SOA ns1.example.com. dns.example.net. (
2010031000
28800
7200
604800
86400
)
; A Records
EXAMPLE.NET. 3600 IN A 192.168.1.212
EXAMPLE.NET. 3600 IN A 192.168.1.214
; CNAME Records
www 3600 IN CNAME EXAMPLE.NET.
* 3600 IN CNAME EXAMPLE.NET.
; NS Records
EXAMPLE.NET. 3600 IN NS ns1.example.com
EXAMPLE.NET. 3600 IN NS ns2.example.com
两个版本是相同的。@
简单地说就是EXAMPLE.NET
, 意味着*
您能想到的任何内容。 通过使用*
通配符,您可以为域设置 Web 服务器,然后在该域下配置多个虚拟主机,而无需再次修改 DNS。 host1.example.net、blah.example.net 和 doiexist.example.net 都将指向同一位置,即使它们没有在区域文件中明确说明,因为通配符的存在*
。
答案2
除了 Bill Weiss 所说的内容之外,我想指出的是,这*
意味着“除已经存在的子域/标签之外的所有可能的子域/标签”,这意味着我可以拥有
$ORIGIN EXAMPLE.NET.
a IN A 1.2.3.4
b IN A 4.3.2.1
* IN A 8.8.8.8
并且 a.EXAMPLE.NET 将返回 1.2.3.4,就像 c.EXAMPLE.NET 将返回 8.8.8.8 一样
此外,aaacEXAMPLE.NET 也会返回 8.8.8.8,这会让通配符记录变得有点混乱。通过迭代这些名称,您可能会用尽递归名称服务器的所有缓存。
答案3
*
不是区域名称的别名。它的意思是“所有子域”。
答案4
根据 RFC 1035,“@”扩展为当前的 $ORIGIN。我在区域文件顶部的 SOA 记录中最常看到这种情况。
我从未见过 '*' 用于除匹配 RR 条目(又名“通配符”条目)中先前未匹配的任何内容之外的任何用途。