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

在configurationBIND DNS区域时,我经常想知道为什么同时存在@*来为区域名称指定一个别名。 两者有什么区别?

@被翻译成它所参考的区域的域名。 这是在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地址,我分配给Alogging域,所以EXAMPLE.NET指向192.168.1.212和192.168.1.214。 然后,我定义了几个CNAMElogging,www和神奇的* ,它们都指向@或者它被解释为EXAMPLE.NET 。 也有使用@符号的NSlogging,而不必inputEXAMPLE.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服务器,然后在该域下configuration多个虚拟主机,而无需再次修改DNS。 host1.example.net,blah.example.net和doiexist.example.net都将指向相同的位置,即使它们没有在区域文件中由于通配符而特别声明。

除了比尔·韦斯所说的我想指出的*意思是“除已经存在的所有可能的子域/标签”,这意味着我可以拥有

 $ORIGIN EXAMPLE.NET. a IN A 1.2.3.4 b IN A 4.3.2.1 * IN A 8.8.8.8 

和.EXAMPLE.NET将返回1.2.3.4就像c.EXAMPLE.NET将8.8.8.8

另外aaacEXAMPLE.NET将返回8.8.8.8,这正是通配符logging有点混乱的原因。 通过遍历这些名称,可能会用完recursion名称服务器的所有caching。

*不是区域名称的别名。 这意味着“所有子域名”。

把@看作是在分析区域文件的过程中扩展的一个macros,而*是一个与所有正常条目都不匹配的“匹配”(匹配)的操作符。

*条目允许configuration一个DNS来返回指定的查询logging,否则将得到一个“NXDOMAIN”(不存在)响应。

“@”根据RFC 1035扩展为当前的$ ORIGIN。我在SOA文件顶部的SOAlogging中经常见到这种情况。

我从来没有见过“*”用于任何事情,只是为了匹配在RR条目(又名“通配符”条目)之前没有匹配的任何东西。