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
无论host
您nslookup
喜欢哪个:
host -v example.com