假设我有一个名为 example.com 的域名。该域名上的子域名可以工作,但我无法将 example.com 附加到其自己的 IP 地址。
wifi IN A 1.1.1.1 ; -Works (wifi.example.com)
router IN A 1.1.1.2 ; -Works (router.example.com)
@ IN A 1.1.1.3 ; - Doesn't Work (example.com)
named-checkconf 和 named-checkzone 均未返回任何内容。我对 BIND 还不太熟悉,因此没有解决区域文件问题。您能否简单地提供解决上述问题的说明?
答案1
要像您的示例一样添加地址记录(A
/ AAAA
),无论它是在区域顶点还是在其他级别,您只需指定所需的所有者名称。
一个不依赖任何“技巧”的例子:
example.com. IN A 192.0.2.7
您所做的也是一种可能可行的方法,但值@
非常敏感。
@
扩展到当前原点(可以使用$ORIGIN
指令进行更改)。
在区域文件中没有$ORIGIN
指令的位置,原点是区域名称(example.com.
在您的示例中)。
如果有$ORIGIN
指令,您必须跟踪当前原点,才能知道其@
实际含义。(您添加行的位置将影响其含义。)
这同样适用于相对名称(您在示例中用于其他记录),这些名称也与当前原点相关。
例如
wifi.example.com. IN A 192.0.2.8
使用绝对名称并且不区分上下文
尽管
wifi IN A 192.0.2.8
是上下文敏感的,并且会根据附加到它的当前原点进行扩展wifi
,其含义与使用 几乎相同@
。
例如,您获得了不同的成功wifi
,@
可以通过在具有指令的区域文件的不同位置添加这些行来解释$ORIGIN
。
named-checkconf -zj
/named-checkzone
没有显示任何错误支持这一理论,因为它不是一个实际的错误,只是你在与预期不同的位置添加了记录,例如 atfoo.example.com.
而不是 at example.com.
。
要查看为您完整说明的实际区域数据,您可能需要将其格式化为完全展开的形式,您可以轻松地使用例如dig @localhost example.com AXFR
(如果您允许使用 AXFR)或named-compilezone -f text -F text -s full -j -o - example.com db.example.com
(如果您有可用的文件)来获取它。
答案2
在 DNS 区域文件速记中,资源记录@被替换为$ORIGIN
(通常是区域的名称),但您也可以使用 FQDN 作为资源记录,只需在其末尾添加一个.(以避免另一个速记约定,即没有尾随的资源记录.
会附加
$ORIGIN
)
如果您的
$ORIGIN
是正确的(并设置为 example.com),以下内容是等效的:
example.com. IN A 192.168.0.0
@ IN A 192.168.0.0