nsupdate 未更新 Apex 记录

nsupdate 未更新 Apex 记录

nsupdate 仅适用于 cname。似乎 apex(根域的 A 记录)未更新。我可以使用“update add . 604800 A 1.1.1.1”添加到区域文件,但它将其放在区域文件的“$ORIGIN .”部分,我无法删除和更新它。我尝试过“update add . 604800 A 2.2.2.2”,但没有更新。我还尝试过“update add example.com. 604800 A 2.2.2.2”。我在区域文件的“$ORIGIN .”和“$ORIGIN example.com.”部分放置了一个占位符记录,认为它需要找到它才能更新它。我也尝试过删除它并更新它......似乎没有任何效果。我读到过某处说 bind 无法写入 /etc/bind/zones,所以我将区域文件放在 /var/lib/bind 中。 Bind 已写入文件,但只在“$ORIGIN .”部分中放入记录一次。有什么建议吗?

我的区域文件:

$ORIGIN .
$TTL 604800 ; 1 week
example.com.        IN SOA  ns1.example.com. admin.ns1.example.com. (
                24         ; serial
                604800     ; refresh (1 week)
                86400      ; retry (1 day)
                2419200    ; expire (4 weeks)
                604800     ; minimum (1 week)
                )
            NS  ns1.example.com.
            NS  ns2.example.com.
$ORIGIN example.com
@           A   5.5.5.5
ds1512      A   10.0.0.13
ds1817      A   10.0.0.14
home        CNAME   ds1817
ns1         A   10.0.0.6
ns2         A   10.0.0.3
roma        CNAME   ds1817
www         CNAME   example.com.

我的带有调试输出的命令:

brent@dnsdhcpserver:/var/lib/bind$ sudo nsupdate -d
> server 10.0.0.6
> zone example.com
> update delete @ A
> update add @ 604800 A 2.2.2.2
> send
Sending update to 10.0.0.6#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  25996
;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 2, ADDITIONAL: 0
;; ZONE SECTION:
;example.com.       IN  SOA

;; UPDATE SECTION:
.           0   ANY A
.           604800  IN  A   172.16.1.10


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOTZONE, id:  25996
;; flags: qr; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;example.com.       IN  SOA

这不起作用所以我尝试了:

> server 10.0.0.6
> prereq nxdomain example.com
> update add example.com. 604800 A 2.2.2.2
> send
Reply from SOA query:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id:  47462
;; flags: qr aa ra; QUESTION: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
;; QUESTION SECTION:
;example.com.       IN  SOA

;; ANSWER SECTION:
example.com.    604800  IN  SOA ns1.example.com. admin.ns1.example.com. 24 604800 86400 2419200 604800

;; AUTHORITY SECTION:
example.com.    604800  IN  NS  ns2.example.com.
example.com.    604800  IN  NS  ns1.example.com.

;; ADDITIONAL SECTION:
ns1.example.com.    604800  IN  A   10.0.0.6
ns2.example.com.    604800  IN  A   10.0.0.3

Found zone name: example.com
The master is: ns1.example.com
Sending update to 10.0.0.6#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:   8484
;; flags:; ZONE: 1, PREREQ: 1, UPDATE: 1, ADDITIONAL: 0
;; PREREQUISITE SECTION:
example.com.    0   NONE    ANY

;; UPDATE SECTION:
example.com.    604800  IN  A   172.16.1.11


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: YXDOMAIN, id:   8484
;; flags: qr; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;example.com.       IN  SOA

有人能看到我遗漏了什么吗?

答案1

不要在 RR 名称后面添加尾随点。使用方式如下:

server my.dns.server
zone example.com
key example.com some-key-data
update delete example.com 604800 A
update add example.com 604800 A 192.0.2.1
send

我刚刚用 A 和 MX 记录对其进行了测试;它对我有用,服务器是 PowerDNS,客户端是来自 bind-tools 的 ISC nsupdate,身份验证是通过 TSIG 进行的,为简单起见,密钥名称等于区域名称。


我感觉你还没有完全理解它的工作原理$ORIGIN@所以这里给你一点解释。完整解释请参见RFC1035

在网络上,这些永远不会出现。这只是一个方便的“语法糖”,可以缩短您输入和阅读区域文件的时间。以下三个示例定义了相同的区域(我懒得完成 SOA 记录,它们的确切值对我们的主题并不重要):

$ORIGIN example.com.
@ 604800 IN SOA ns1 ....
  604800 IN NS  ns1
ns1 3600 IN A 192.0.2.1
@ 3600 IN A 192.0.2.5 
$ORIGIN .
example.com 604800 IN SOA ns1.example.com ....
$ORIGIN com.
example 604800 IN NS ns1.example
$ORIGIN ns1.example.com.
@ 3600 IN A 192.0.2.1
example.com. 3600 IN A 192.0.2.5 
example.com. 604800 IN SOA ns1.example.com. ....
example.com. 604800 IN NS  ns1.example.com.
ns1.example.com. 3600 IN A 192.0.2.1
example.com. 3600 IN A 192.0.2.5 

在第一个示例中,我没有在第三行( RRNS之后的 RR SOA)指定任何 RR 名称,因此解析器将从上一行中获取它。此行为正是@语法存在的确切原因:您不能将 RR 名称字段留空,因为它将采用上一个记录名称。如果我@在最后一条记录中跳过了,我会A为 定义第二条记录ns1。因此,要定义名称等于当前设置的原点的记录(如果原点设置为区域名称,它将为“apex”),您不能使用“空名称”,因为它将调用此“采用上一个”行为。您必须使用尾随点明确拼写完整的记录名称,这样它就不会附加原点(就像在其他示例中写的那样),更改原点,或者使用特殊符号@告诉解析器:“不要重复上一个名称,这里是裸原点”,因此第一个示例中的最后一行定义了example.com.

第二个例子只是为了演示如何协同$ORIGIN工作@

第三个示例不使用任何语法糖。这三个示例中的区域都保存着真​​实的绝对数据。


因此,您的记录可以在区域文件中表示为example.com之后$ORIGIN ., 或example.com.任何位置 , 或@之后$ORIGIN example.com.,甚至example之后$ORIGIN com.,这无关紧要。这些情况都是一样的。您可能希望看到“@”变体,但 BIND 可能会决定将其拼写为这些变体中的任何一个,因此请准备好识别它们。而且您不能强迫它使用任何特定变体,抱歉。

另一个需要注意的问题是,您在更新后读取区域文件时没有先冻结它。请注意区域文件旁边的“jnl”文件;它是您更新的数据首次存储的日志。只有当您执行此操作时,rndc freeze example.com数据才会写入区域文件(但区域随后被锁定以进行更新,要解锁,您需要执行操作thaw或重新加载服务器)。检查区域是否更新的正确方法是使用或或进行实际的 DNS 查询,dig无论hostnslookup喜欢哪个:

host -v example.com

相关内容