使用 BIND 时 @ 和 * 之间有区别吗?

Nic*_*ton 2 bind

在配置 BIND DNS 区域时,我经常想知道为什么同时存在@*为区域名称指定别名。两者有区别吗?

Jer*_*use 9

@也被翻译成它所引用的区域的域名。这是在 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
Run Code Online (Sandbox Code Playgroud)

在本例中,我使用EXAMPLE.COM 的DNS 服务器为EXAMPLE.NET 定义区域。我有 2 个 IP 地址分配给域的 A 记录,因此EXAMPLE.NET 指向 192.168.1.212 和 192.168.1.214。然后我定义了几个 CNAME 记录, www 和*都指向@或解释的魔法EXAMPLE.NET。还有使用@符号的 NS 记录,而不必键入 out 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
Run Code Online (Sandbox Code Playgroud)

两个版本是相同的。在@简单地变成EXAMPLE.NET*手段任何你能想到的。通过使用*通配符,您可以为域设置网络服务器,然后在该域下配置多个虚拟主机,而无需再次修改 DNS。host1.example.net、blah.example.net 和 doiexist.example.net 都将指向相同的位置,即使由于*通配符而没有在区域文件中明确说明它们。

  • 实际上,'@' 被扩展为当前的 $ORIGIN,因为它可以在区域文件中重新定义。RFC 1035 + http://www.zytrax.com/books/dns/ch8/origin.html (2认同)